防止语法模糊不清

时间:2016-04-14 10:36:46

标签: antlr antlr4

在下面的语法中:

<------------Correct and inccorrect predictions------------> 
Total Labels: 743 Predicted Labels: 522 Accuracy: 0.702557200538

当我解析表达式时

expr : r1 EOF
     | r2 EOF
     ;

r1 : '1' L1 'x' ;
r2 : '1' L2 'y' ;

L1: 'a' ;
L2: 'a' ;

我希望解析器能够创建适当的解析树,但是我收到以下错误:

  

第1行:2输入'y'不匹配期望'x'

为什么不能正确解析?我可以给它指令吗?

解析代码:

1ay

1 个答案:

答案 0 :(得分:2)

解析的第一步是根据词法分析器规则创建令牌流。使用首先匹配的规则创建令牌。所以在你的情况下,每个'a'将是L1。由于r1只是包含L1的解析器规则,因此无法匹配输入,因为规则'r1'期待'x',而不是'y'。

因此,必须对词法分析器规则进行排序,以使特殊的和更具体的规则更加模糊。作为字符串的规则,数字将在最后,但规则为'func','class'将在它们之前。

要解决此问题,请将L1和L2合并为一个规则,并在两个解析器规则中使用它。