Разобрать два вида утверждений с приоритетом

Я хотел бы разобрать оба 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 }
Другие вопросы по тегам