Я пытаюсь разобрать грамматику в antlr 3, но у меня проблема с левой рекурсией, и я начинаю разбираться в грамматике разбора.Левая рекурсия mutally in antlr 3
ответ
Проблема в том, что рулоны b, e, t, f ссылаются друг на друга, не потребляя никакого ввода - например, число может быть принято несколькими последовательностями:
b -> NUM
b -> e -> t -> f -> b -> NUM
...
цикл там у вас, вероятно, имеется в виду, чтобы выразить подвыражение - что там недостающую затем круглые скобки:
start : e;
e : t (a t)*;
t : f (m f)*;
f : ID | NUM | '-'NUM | '(' e ')';
a : '+' | '-';
m : '*' | '/';
(Я также изменил e : t | t a t
до e : t | e a t
, чтобы разрешить 1 + 2 + 3
)
'e: t | e a t; 'и' t: f | t m f; 'все еще остаются рекурсивными: что-то ANTLR 3 не может обрабатывать. –
@BartKiers мой плохой, забыл об этом. Ред. –
Yup, это выглядит ANTLR3 совместимым! –
Вы должны переписать свою грамматику, чтобы удалить левую рекурсию. К счастью, для этого есть алгоритм. Проверьте https://en.m.wikipedia.org/wiki/Left_recursion, раздел Удаление всех левых рекурсий. – ELKA
Преобразование, которое вы должны сделать: 'b -> ID; b -> NUM; b -> -NUM; b-> é'. То же самое для e, t f. Затем вы применяете алгоритм. Проблема заключается в том, что b-> e; (e -> t; e -> t a t); (t -> f, t -> t m f); t -> b'. Подумайте о стрелке, как «дает». И когда вы применяете алгоритм b, e, t, f, a, m, не являются терминальными символами. – ELKA
Шаг 1: перепишите правила, чтобы показать неявные рекурсии. – ELKA