Tag: antlrworks

ANTLR java测试文件无法创建树语法对象

我正在使用针对java的ANTLR 3.x创建一个解析器。 我编写了解析器语法(用于创建抽象语法树,AST)和树语法(用于在AST上执行操作)。 最后,为了测试两个语法文件,我用Java编写了一个测试文件。 看看下面的代码, 协议语法 grammar protocol; options { language = Java; output = AST; } tokens{ //imaginary tokens PROT; INITIALP; PROC; TRANSITIONS; } @header { import twoprocess.Configuration; package com.javadude.antlr3.x.tutorial; } @lexer::header { package com.javadude.antlr3.x.tutorial; } /* parser rules, in lowercase letters */ program : declaration+ ; declaration :protocol |initialprocess |process |transitions ; protocol […]

生成无效javaexception的ANTLR会抛出代码

这些天我一直在使用ANTLRwork 1.5和antlr runtime 3.5。 这是我发现的一个奇怪的事情:Antlr为我生成这种java代码: public final BLABLABLAParser.addExpression_return addExpression() throws { blablabla… } 请注意,此函数不会抛出任何内容,这在java中无效。 所以我需要手动纠正这些错误。 谁知道为什么? 这里是示例语法,它直接取自书籍语言实现模式 。 // START: header // START: header grammar Cymbol; // my grammar is called Cymbol options { output = AST; ASTLabelType = CommonTree; } tokens{ METHOD_DECL; ARG_DECL; BLOCK; VAR_DECL; CALL; ELIST; EXPR; } // define a SymbolTable field […]

ANTLR不会在无效输入上抛出错误

我正在使用ANTLR来解析我正在编写的Java工具中的逻辑表达式,并且我遇到了问题,因为将无效的输入字符串传递给生成的ANTLR词法分析器并且解析器不会导致任何exception。 生成的文件不是像我期望的那样抛出RecognitionException,而是将错误消息打印到控制台并返回,好像没有发生错误,导致我的程序在以后遇到空数据时崩溃。 我使用ANTLRWorks版本1.4.3生成文件,似乎应该有某种选项让它实际抛出错误而不是打印到控制台,但我还没有找到任何东西。 有谁知道如何让ANTLR实际抛出错误信息? 我看到使用旧版本的ANTLR解决了C#中的同样问题,这是我需要做的吗? 编辑:在Bart指出我正在寻找的方向之后,我找到了这个页面 https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3 其“error handling”部分的代码完全符合我的要求。 要更改ANTLR捕获exception的方式,可以在语法文件中说明: @rulecatch { catch (RecognitionException e) { throw e; } } 这迫使ANTLR抛出exception而不是处理它并恢复。 该部分还有一些关于覆盖不匹配和恢复function的内容,以确保抛出所有可能的exception。