2016-05-29 5 views
0

Я пытаюсь разобрать грамматику в antlr 3, но у меня проблема с левой рекурсией, и я начинаю разбираться в грамматике разбора.Левая рекурсия mutally in antlr 3

+0

Вы должны переписать свою грамматику, чтобы удалить левую рекурсию. К счастью, для этого есть алгоритм. Проверьте https://en.m.wikipedia.org/wiki/Left_recursion, раздел Удаление всех левых рекурсий. – ELKA

+0

Преобразование, которое вы должны сделать: '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

+0

Шаг 1: перепишите правила, чтобы показать неявные рекурсии. – ELKA

ответ

1

Проблема в том, что рулоны 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)

+0

'e: t | e a t; 'и' t: f | t m f; 'все еще остаются рекурсивными: что-то ANTLR 3 не может обрабатывать. –

+0

@BartKiers мой плохой, забыл об этом. Ред. –

+0

Yup, это выглядит ANTLR3 совместимым! –

 Смежные вопросы

  • Нет связанных вопросов^_^