防止语法不清楚

叶夫根尼

在以下语法中:

expr : r1 EOF
     | r2 EOF
     ;

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

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

当我解析一个表达式时

1ay

我希望解析器创建适当的解析树,但是出现以下错误:

第1行:2的输入“ y”不匹配,期望为“ 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合并为一个规则,然后在两个解析器规则中使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章