Разобрать два вида утверждений с приоритетом
Я хотел бы разобрать оба f(arg).method
а также f(arg)
как block_statement
; первый имеет больший приоритет, чем последний.
Следующие элементы в parser.mly
не могу разобрать f(arg)
, но могу разобрать f(arg).method
следующее:
(* f(arg).method *)
BS_MAE MAE_LE_UN (
LE_IE IE_LE_AL (
LE_SNE SNE_I f,
AL_I arg),
UN_I method)
(* parser.mly: *)
block_statement:
| member_access_expression { BS_MAE $1 }
simple_name_expression: | IDENTIFIER { SNE_I $1 }
member_access_expression: | l_expression DOT unrestricted_name { MAE_LE_UN ($1, $3) }
unrestricted_name: | IDENTIFIER { UN_I $1 }
index_expression: | l_expression LPAREN argument_list RPAREN { IE_LE_AL ($1, $3) }
expression: | l_expression { E_LE $1 }
l_expression:
| simple_name_expression { LE_SNE $1 }
| index_expression { LE_IE $1 }
call_statement:
| simple_name_expression argument_list { CallS_SNE_AL ($1, $2) }
| member_access_expression argument_list { CallS_MAE_AL ($1, $2) }
argument_list: | IDENTIFIER { AL_I $1 }
Но если мы добавим еще одну строку | IDENTIFIER LPAREN expression RPAREN { BS_I_E ($1, $3) }
за block_statement
на этот раз он может разобрать f(arg)
следующее:
BS_I_E (
f,
E_LE LE_SNE SNE_I arg)
Однако на этот раз f(arg).method
не может быть проанализирован больше. Вызывает ошибку после прочтения .
Я не знаю, как позволить парсеру пойти дальше f(arg).method
в целом, если это возможно; Мне действительно нужен парсер, чтобы разобрать оба утверждения... Может кто-нибудь помочь?
1 ответ
Я хотел бы попробовать грамматику со структурой в соответствии с:
block:
| expr
expr:
| expr LPAREN argument_list RPAREN
| expr DOT unrestricted_name
| simple_expr
simple_expr:
| IDENTIFIER
Обратите внимание, что если вы хотите проанализировать полное предложение, а не только действительный префикс ввода, ваше правило верхнего уровня должно запросить наличие токена EOF (чтобы заставить анализатор перейти к концу ввода):
%start <block> main
main:
| b=block EOF { b }