Как убрать левую рекурсию в следующей грамматике?
К сожалению, ANTLR не может поддерживать прямую левую рекурсию, когда правило имеет переданные параметры. Единственный возможный вариант - удалить левую рекурсию. Есть ли способ удалить левую рекурсию в следующей грамматике?
a[int x]
: b a[$x] c
| a[$x - 1]
(
c a[$x - 1]
| b c
)
;
Проблема во втором варианте, включающем левую рекурсию. Любая помощь будет высоко ценится.
1 ответ
Решение
Без параметров и более простого форматирования это выглядело бы так:
a
: b a c
| a (c a | b c)
;
когда a
левая рекурсивная альтернатива соответствует n раз, это будет означать, что (c a | b c)
будет сопоставлено n раз, предварительно завершено завершающей b a c
(первая альтернатива). Это означает, что это правило всегда начинается с b a c
с последующим нулем или более вхождений (c a | b c)
:
a
: b a c (c a | b c)*
;