У меня есть следующая грамматика XText, которая использует ANTLR3 под капотом. В моей грамматике я хочу поддерживать выражения, подобные TYPE(EXPRESSION)
и (TYPE)(EXPRESSION)
. Определение типа обычно содержит другие типы (я думаю, что это проблема, но я не могу изменить это требование). Кроме того, я также хочу разрешить круглые скобки вокруг выражений.Как исправить вызов рекурсивного правила в Antlr3?
Можно ли решить рекурсию левым факторингом? Я всегда получаю следующее сообщение об ошибке.
[смертоносное] правило ruleExpression имеет не-LL (*) решение из-за рекурсивных вызовов правил, доступных из alts 1,2. Решайте левым факторингом или используйте синтаксические предикаты или используйте параметр backtrack = true.
Model:
e=Expression;
Expression:
e=castExpression | e=parExpression | "VAR";
castExpression:
(Type | '(' Type ')') e=parExpression;
parExpression:
'(' Expression ')';
Type:
"MYTYPE" t=Type | "TYPE_ID";
@LucasTrzesniewski это XText, который использует ANTLR3 под капотом –