который является целочисленным литералом в левой части присваивания. Но, похоже, мне, возможно, придется просто пропустить это и разобраться с этим позже.

читал здесь много вопросов на StackOverflow о взаимных проблемах левой рекурсии в парсерах LL (k). Я нашел общий алгоритм удаления левой рекурсии:

A : Aa | b ;

становится

A : bR ;
R : (aA)? ;

Однако я не могу понять, как применить это к моей ситуации. я имею

left_exp: IDENT | exp DOT IDENT ;
exp     : handful
        | of
        | other rules
        | left_exp ;  

«Горстка других правил» содержит регулярную рекурсию, такую ​​какexp : exp PLUS expи т.д. и не имеют проблем. Проблема сleft_exp а такжеexp быть взаимно рекурсивным.

Я думал просто добавитьIDENT а такжеexp DOT IDENT кexp правила, но есть некоторые ситуации, когда другие действительныexp правила не применяются, гдеleft_exp будет действительным.

РЕДАКТИРОВАТЬ

У меня также есть следующее правило, которое требует левого выражения с последующим присваиванием.

assign_statement: left_exp ( COLON IDENT )? EQUAL exp SEMI ;

Поскольку регулярное выражение является только левым выражением, если за ним следует DOT IDENT, кажется, что я не могу просто добавить

| IDENT
| exp DOT IDENT

к моему определению выражения, потому что тогда присваивание будет принимать любое другое допустимое выражение слева, а не только одно из этих двух.

Ответы на вопрос(1)

Ваш ответ на вопрос