Почему эта грамматика неоднозначна?

Я использую Antlr4. Вот моя грамматика:

assign : id '=' expr ;
    id : 'A' | 'B' | 'C' ;
  expr : expr '+' term
       | expr '-' term
       | term ;
  term : term '*' factor
       | term '/' factor
       | factor ;
factor : expr '**' factor
       | '(' expr ')'
       | id ;
    WS : [ \t\r\n]+ -> skip ;

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

1 ответ

factor : expr '**' factor

Рассмотрим вход

A + B ** C

A + B является expr чтобы мы могли проанализировать это как factorсемантически (A+B)C

Но другая, более общепринятая интерпретация (A + (BC)) также возможно:

<expr>                   => 
<expr> + <term>          =>
<term> + <term>          =>
<factor> + <term>        =>
A        + <term>        =>
A        + <factor>      =>
A + <expr> ** <factor>   =>
A + <term> ** <factor>   =>
A + <factor> ** <factor> =>
A + B ** <factor>        =>
A + B ** C
Другие вопросы по тегам