防止语法中出现不明确的歧义
Preventing unclear ambiguity in grammar
语法如下:
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));
}
解析的第一步是根据词法分析器规则创建令牌流。使用将首先匹配的规则创建令牌。因此,在您的情况下,每个 'a' 都是 L1。由于 r1 只是包含 L1 的解析器规则,它无法匹配输入,因为规则 'r1' 需要 'x',而不是 'y'.
因此必须对词法分析器规则进行排序,以便特殊和更具体的规则出现在更模糊的规则之前。规则为字符串,数字将在最后,但规则为 'func'、'class' 将在它们之前。
要解决这个问题,请将 L1 和 L2 合并为一个规则并在两个解析器规则中使用它。
语法如下:
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));
}
解析的第一步是根据词法分析器规则创建令牌流。使用将首先匹配的规则创建令牌。因此,在您的情况下,每个 'a' 都是 L1。由于 r1 只是包含 L1 的解析器规则,它无法匹配输入,因为规则 'r1' 需要 'x',而不是 'y'.
因此必须对词法分析器规则进行排序,以便特殊和更具体的规则出现在更模糊的规则之前。规则为字符串,数字将在最后,但规则为 'func'、'class' 将在它们之前。
要解决这个问题,请将 L1 和 L2 合并为一个规则并在两个解析器规则中使用它。