который является целочисленным литералом в левой части присваивания. Но, похоже, мне, возможно, придется просто пропустить это и разобраться с этим позже.
читал здесь много вопросов на 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
к моему определению выражения, потому что тогда присваивание будет принимать любое другое допустимое выражение слева, а не только одно из этих двух.