Удаление взаимной левой рекурсии из леворекурсивных правил
С ANTLR 4.6, снимок от 23.11.2016.
У меня есть два правила, каждое из которых является леворекурсивным. Я расширил несколько альтернатив, чтобы раскрыть левую рекурсию. ANTLR4 обрабатывает это, потому что левая рекурсия является явной. Тем не менее, эти два правила также являются взаимно леворекурсивными.
Как мне разрешить взаимную левую рекурсию И сделать так, чтобы правила не были беспорядочными? Прямо сейчас у меня есть хорошие комментарии, показывающие, что было расширено, и я переместил это в primary2 и constant_primary2, которые не участвуют во взаимной левой рекурсии.
constant_primary :
constant_primary2
| primary '.' method_call_body
| constant_primary '\'' '(' constant_expr ')'
;
primary :
primary2
| primary '.' method_call_body
| constant_primary '\'' '(' expr ')'
;
1 ответ
Один из вариантов - переключиться на использование моего форка ANTLR 4, который доступен через Maven с использованием идентификатора группы com.tunnelvisionlabs. Этот форк обрабатывает взаимную левую рекурсию, создавая деревья разбора, которые соответствуют форме, которую вы фактически написали в грамматике.
Обратите внимание, что эта функция несколько экспериментальная. Если у вас возникнут проблемы, не стесняйтесь опубликовать сообщение о проблеме на моем форке.