2016-04-14 39 views
1

在下面的语法:防止含糊不清语法

expr : r1 EOF 
    | r2 EOF 
    ; 

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

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

当我解析表达式

1ay 

我希望解析器创建相应的解析树,但是我越来越出现以下错误:

line 1:2 mismatched input 'y' expecting 'x'

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

解析代码:在解析

private static void parse(String str) 
{ 
    ANTLRInputStream input = new ANTLRInputStream(str); 
    AmbLexer lexer = new AmbLexer(input); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    AmbParser parser = new AmbParser(tokens); 
    ParseTree tree = parser.expr(); 
    System.err.println(tree.toStringTree(parser)); 
} 

回答

2

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

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

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