Most, if not all, real-world programming languages are context-sensitive. A typical parser accepts some constructs which will later be rejected as violating some rule or constraint, and/or rely on some kind of context-sensitive preprocessing to produce a parseable token stream. Macro languages like the C preprocessor obviously fall into the latter category, but at a much more controllable scale, so does the Python scanner which inserts INDENT
and DEDENT
tokens. Examples of the first include the common requirement that variables be declared before use or that function calls have the same number of arguments as there are parameters in the prototype. Static type analysis also falls into this category.
So all practical parsers deviate to some extent from the idealised model shown in textbooks on formal language theory. And practical parser generators like bison and antlr provide customisable hooks which permit idiosyncratic implementation of these deviations.
In short, parser generators can be useful, and are used, for languages which are "technically" context-sensitive (and I use scare quotes because context-sensitivity is a binary attribute; either it is or it isn't).
It would be great to avoid idiosyncratic hacks, but the problem seems intractable. Since a context-sensitive language can model a Turing machine, a deterministic parse would have to be able the solve the Halting Problem. On the other hand, there are deterministic parsing algorithms for certain subsets of the set of context-sensitive languages, but they don't seem to provide for all the context-sensitivity which is present in practical languages. We still lack the sweet spot between too powerful to parse and too weak to replace the hacks.
This is still a fertile research field, and perhaps you will have something to contribute. But if you are looking for something off-the-shelf, I fear you will be disappointed.