为什么这个语法含糊不清?

时间:2017-11-05 13:03:28

标签: grammar antlr4 ambiguity ambiguous-grammar

我使用的是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 个答案:

答案 0 :(得分:1)

factor : expr '**' factor

考虑输入

A + B ** C

A + Bexpr,因此我们可以将其分析为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