parsing器不知道该怎么做的默认行为是将消息打印到terminal,如: 行1:23在'}'缺lessDECIMAL 这是一个好消息,但在错误的地方。 我宁愿接受这个例外。 我试过使用BailErrorStrategy ,但是这会抛出一个ParseCancellationException没有消息(由InputMismatchException引起,也没有消息)。 有没有办法让我能通过例外来报告错误,同时保留消息中的有用信息? 这就是我真正的追求 – 我通常使用规则中的动作来build立一个对象: dataspec returns [DataExtractor extractor] @init { DataExtractorBuilder builder = new DataExtractorBuilder(layout); } @after { $extractor = builder.create(); } : first=expr { builder.addAll($first.values); } (COMMA next=expr { builder.addAll($next.values); })* EOF ; expr returns [List<ValueExtractor> values] : a=atom { $values = Arrays.asList($a.val); } | fields=fieldrange { $values […]
注意:这是一个自我回答的问题 ,旨在提供有关ANTLR用户最常犯的错误之一的参考。 当我testing这个非常简单的语法时: grammar KeyValues; keyValueList: keyValue*; keyValue: key=IDENTIFIER '=' value=INTEGER ';'; IDENTIFIER: [A-Za-z0-9]+; INTEGER: [0-9]+; WS: [ \t\r\n]+ -> skip; 通过以下input: foo = 42; 我结束了以下运行时错误: 第1行:6个不匹配的input“42”,期望INTEGER 第1行:8个不匹配的input';' 期待'=' 为什么在这种情况下,ANTLR不认为42是INTEGER ? 它应该匹配模式[0-9]+就好了。 如果我将INTEGER和IDENTIFIER的定义顺序颠倒INTEGER ,似乎可行,但为什么顺序是重要的呢?
我正在为一个学校项目创build一个简单的编程语言。 我使用ANTLR 4从我的语法生成一个词法分析器和一个parsing器。 到目前为止,我一直使用ANTLR的监听模式来应用编程语言的实际function。 现在我想实现if / else语句,但是我不确定这些实际上是否可以在使用监听器模式时实现,因为ANTLR在使用监听器时决定以何种顺序来遍历分析树,我想象一下if /否则语句将需要根据语句中的哪个条件满足而在parsing树周围跳转。 任何人都可以告诉我是否可以使用ANTLR来实现if / else语句,还是必须自己实现访问者模式? 另外,任何人都可以给出一个非常简单的例子来执行这个语句吗?
我一直在寻找一个关于这一点,我找不到有用的东西,真的帮助我build立一个AST。 我已经知道ANTLR4并不像ANTLR3那样build立AST。 每个人都说:“嗨,使用游客!”,但我怎么能做到这一点,我找不到任何例子或更详细的解释… 我有一个语法必须像C,但用葡萄牙语(葡萄牙语编程语言)写的每个命令。 我可以使用ANTLR4轻松生成分析树。 我的问题是:我现在需要做什么来创build一个AST? 顺便说一句,我正在使用Java和IntelliJ … 编辑1:我能得到的最接近的是使用这个话题的答案: 是否有一个简单的例子,使用antlr4从java源代码创build一个AST并提取方法,variables和注释? 但它只打印访问方法的名称.. 由于第一次尝试不适合我,因为我期望,我试图从ANTLR3使用本教程 ,但我不知道如何使用StringTamplate,而不是ST … 阅读这本书The Definitive ANTLR 4 Reference我也找不到任何与AST有关的东西。 编辑2:现在我有一个类来创buildDOT文件,我只需要弄清楚如何正确使用访问者
我想开始使用ANTLR,但花了几个小时在antlr.org网站上查看示例之后,我仍然无法清楚地理解Java过程的语法。 有没有一个简单的例子,像ANTLR通过parsing器定义和Java源代码一起实现的一个四操作计算器?
什么是ANTLR中的语义谓词 ?