当前位置: 首页 > 知识库问答 >
问题:

防止语法歧义不清

景书
2023-03-14
expr : r1 EOF
     | r2 EOF
     ;

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

L1: 'a' ;
L2: 'a' ;
1ay

为什么不能正确解析?我能给它指示吗?

解析代码:

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));
}

共有1个答案

施默
2023-03-14

解析的第一步是根据lexer规则创建令牌流。标记是用首先匹配的规则创建的。所以在你的例子中,每个“A”都是L1。由于r1只是包含L1的解析器规则,所以它不能与输入匹配,因为规则'r1'期望的是'X',而不是'Y'。

因此,必须对lexer规则进行排序,这样特殊的、更具体的规则就会先于更模糊的规则。作为字符串的规则,数字将在最后,但作为'func'、'class'的规则将在它们之前。

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

 类似资料:
  • 使用上面的测试数据运行ANTLR4测试平台,输出为 我可以看到第一个标记是ID的<4>,值为'rrv0' 我已经尝试重新安排lexer项目顺序。我还尝试通过在语法规则中显式匹配来使用隐式lexer项(而不是通过显式lexer项)。我也试着做火柴。那些对我来说并不成功。

  • 有人能告诉我这些方法模棱两可的原因吗?提前谢谢你。

  • 根据antlr4书(第159页),并使用语法Ambig. g4,语法歧义可以通过以下方式报告: 或等效代码形式: grun命令使用antlr-4.5.3为我正确报告歧义。但是当我使用代码表单时,我没有收到歧义报告。这是命令跟踪: TestA_Listener.java代码如下: 有人能指出应该如何修改上述java代码以打印歧义报告吗? 为了完整起见,下面是代码 Ambig.g4 : 语法阿姆比格;

  • 问题内容: 当Angular插入标记并将范围变量插入样式模板时,它将转义HTML。 我正在构建的应用程序要求用户创建模板,使用大括号表示法插入变量名称,我不想通过引入某些变量的指令和其他变量的curlies来使其过于复杂。 有没有办法通过卷曲模板呈现未转义的HTML? 我唯一的选择是在用户尝试渲染时渲染代理元素,然后可以使用jQLite抓取并手动插入HTML,但这真是一团糟。有任何想法吗? 问题答

  • 问题内容: 今天就去旅行。我注意到我可以将结构文字传递给与指向结构的指针关联的方法,反之亦然。为什么允许这样做? 输出: 问题答案: 请参阅方法集: 一个类型可能具有与之关联的方法集(§接口类型,§Method声明)。接口类型的方法集是其接口。其他任何类型T的方法集都包含接收者类型T的所有方法。相应指针类型 T的方法集是接收者 T或T的所有方法的集合(也就是说,它还包含T)。进一步的规则适用于包含

  • 本文向大家介绍怎么防止HTML被转义?相关面试题,主要包含被问及怎么防止HTML被转义?时的应答技巧和注意事项,需要的朋友参考一下 <h1 dangerouslySetInnerHTML={{__html: 'cc © 2015'}}></h1>