Как убрать левую рекурсию в следующей грамматике?

К сожалению, 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)*
 ;
Другие вопросы по тегам