Взгляните на соответствующее обсуждение здесь . В своем последнем комментарии в этом обсуждении я объясняю, что вы можете заставить любой генератор синтаксического анализа генерировать все деревья синтаксического анализа путем клонирования дерева синтаксического анализа, полученного до того, как произойдет сбой деривации.
Если ваша грамматика:
G -> ...
Вы бы увеличить как это:
G' -> G {semantic:deal-with-complete-parse-tree} <NOT-VALID-TOKEN>.
Механизм синтаксического анализа в конечном итоге не работает на всех деривациях, но ваша программа также будет иметь:
- Сохранены клоны всех деревьев.
- Разобраться с семантикой каждого из деревьев, как они были найдены.
И ANTLR, и JavaCC преуспели, когда я преподавал. Я предпочел ANTLR из-за его лексического анализа BNF и его гораздо менее запутанной истории, видения, у и лицензирования.