A GrammarAnalyzer computes lookahead from Grammar (which contains
a grammar symbol table) and can then answer questions about the
grammar.
To access the RuleBlock for a rule name, the grammar symbol table
is consulted.
There should be no distinction between static & dynamic analysis.
In other words, some of the easy analysis can be done statically
and then the part that is hard statically can be deferred to
parse-time. Interestingly, computing LL(k) for k>1 lookahead
statically is O(|T|^k) where T is the grammar vocabulary, but,
is O(k) at run-time (ignoring the large constant associated with
the size of the grammar). In English, the difference can be
described as "find the set of all possible k-sequences of input"
versus "does this specific k-sequence match?". |