Почему эта грамматика неоднозначна?
Я использую 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