Tag: antlr

如何强制ANTLR解析所有输入CharStream

我正在使用ANTLR4来解析语法文件。 当我使用BaseErrorListener来检测错误时,我遇到了问题。 当遇到非法输入字符串时,ANTLR会自动匹配相应的分支,然后忽略后续的字符流 ,即使它包含错误。 我想检测那个错误。 这是我的g4文件和java文件。 TransitionLexer是我的lexer文件, TransitionCondition是我的解析器文件。 ErrorDialogListener.java是我的errorListener和Test.java id主java文件。 TransitionLexer.g4 lexer grammar TransitionLexer; BOOLEAN: ‘true’ | ‘false’; IF: ‘if’; THEN: ‘then’; ELSE: ‘else’; NAME: (ALPHA | CHINESE | ‘_’)(ALPHA | CHINESE | ‘_’|DIGIT)*; ALPHA: [a-zA-Z]; CHINESE: [\u4e00-\u9fa5]; NUMBER: INT | REAL; INT: DIGIT+ |'(-‘DIGIT+’)’; REAL: DIGIT+ (‘.’ DIGIT+)? | ‘(-‘ DIGIT+ (‘.’ DIGIT+)? ‘)’; […]

ANTLR – 输入错误不匹配

我有一个看起来像是由特定语言的注释和控制语句组成的语法: 语法: grammar DD; ddlist: (ddstmt| jclcomment)+; ddstmt: dd1 | dd2 | dd3 | dd4 ; dd1: JCLBEGIN ddname DDWORD ‘DUMMY’; dd2: JCLBEGIN ddname DDWORD ‘DYNAM’; dd3: JCLBEGIN ddname DDWORD NAME’=’ (‘*’|NAME); dd4: JCLBEGIN ddname DDWORD ‘*’ inlinerec INLINESTMTEND?; inlinerec: (INLINEDATA )+ ; fragment INLINEDATA: (~[\r\n])*; ddname: NAME; jclcomment: JCLCOMMENT+; JCLCOMMENT: COMMENTBEGIN ~[\r\n]*; DDWORD: ‘DD’; […]

使用“$”,Java进行ANTLRexception处理

对于我在ANTLR中的语法,我的java代码可以捕获并打印包含“$”的输入的错误。 在我的实现中,我需要打印出成功输入的“成功”。 所以,我在我的java代码中执行以下操作, CharStream charStream = new ANTLRFileStream(filePath); myLexer lexer = new myLexer(charStream); TokenStream tokens = new CommonTokenStream(lexer); myParser parser = new myParser(tokens); /*if there is an error throws an exception message*/ parser.program(); /*if there is an error find how many, if 0 then print success,*/ int errorsCount = parser.getNumberOfSyntaxErrors(); if(errorsCount == 0){ System.out.println(“parsing successful”); […]

如何将自定义java类导入我的Antlr语法?

在名为Test的目录中,我在Word.java文件中有一个java类,如下所示: public class Word { public String value; public Word(String v) { value = v; } } 在同一目录下我的antlr4语法Test.g4是这样的: grammar Test; @header { import Test.Word; } @members { ArrayList words = new ArrayList(); } program @after { System.out.println(words.toString()); } : (ID { words.add(new Word($ID.text)); } )+ ; (在这个例子中,我只是使用Word而不是String来测试导入的东西。语法和动作不是我的问题) 现在,当我尝试运行java org.antlr.v4.runtime.misc.TestRig Test这就是结果: blablabla 引起:java.lang.ClassNotFoundException:Test.Word blablabla 这让我发疯,如何在.g4文件中导入我的类? 我知道可以加载默认的java包,但是如何导入我的自定义java类? […]

如何获取antlr解析的错误消息?

我用antlr 4.4编写了一个语法,如下所示: grammar CSV; file : row+ EOF ; row : value (Comma value)* (LineBreak | EOF) ; value : SimpleValueA | QuotedValue ; Comma : ‘,’ ; LineBreak : ‘\r’? ‘\n’ | ‘\r’ ; SimpleValue : ~(‘,’ | ‘\r’ | ‘\n’ | ‘”‘)+ ; QuotedValue : ‘”‘ (‘””‘ | ~'”‘)* ‘”‘ ; 然后我使用antlr 4.4生成解析器和词法分析器,这个过程是成功的 […]

是否有一个使用antlr4从java源代码创建AST并提取方法,变量和注释的简单示例?

有人可以提供一个详细的例子,说明我如何使用antlr4做到这一点? 安装antlr4及其依赖项的说明将受到高度赞赏。

ANTRL4:无法获取Python ANTLR来生成解析树的图形

我有一个简单的HelloWorld.g4语法(见底部)。 我能够使用以下方法成功生成.py文件: set CLASSPATH=.;antlr-complete.jar;%CLASSPATH% java org.antlr.v4.Tool -Dlanguage=Python2 HelloWorld.g4 现在我想使用带有-gui标志的-gui来生成解析树GUI。 我安装了ANTRL Python运行时( antlr4-python2-runtime-4.5.tar.gz )。 我可以打开Python解释器并输入: import antlr4 并且解释器识别antlr4模块。 当我像这样运行TestRig : set CLASSPATH=.;antlr-complete.jar;%CLASSPATH% java org.antlr.v4.gui.TestRig HelloWorld message -gui < input.txt 我收到此错误消息: Can’t load HelloWorld as lexer or parser 根据我的调查,我发现了几个列出相同错误消息的post。 但是,在这些情况下,他们忘记在类路径中包含句点(。)。 但正如您所看到的,我已将其包含在我的类路径中。 我没有关于如何让TestRig工作的想法。 注意:当目标语言是Java时,让TestRig使用相同的HelloWorld语法没有问题。 您将提供的任何帮助将不胜感激。 HelloWorld.g4 grammar HelloWorld; options { language=Python; } message : GREETING NAME; GREETING : […]

Antlr无关输入

我有一个语法文件BoardFile.g4(仅限相关部分): grammar Board; //Tokens GADGET : ‘squareBumper’ | ‘circleBumper’ | ‘triangleBumper’ | ‘leftFlipper’ | ‘rightFlipper’ | ‘absorber’ | ‘portal’ ; NAME : [A-Za-z_][A-Za-z_0-9]* ; INT : [0-9]+ ; FLOAT : ‘-‘?[0-9]+(‘.'[0-9]+)? ; COMMENT : ‘#’ ~( ‘\r’ | ‘\n’ )*; WHITESPACE : [ \t\r\n]+ -> skip ; KEY : [az] | [0-9] | ‘shift’ | […]

在JVM上运行/解释C?

有没有办法在JVM上运行普通的c代码? 不通过JNI连接,运行,就像你可以通过JRuby运行ruby代码,或通过Rhino运行javascript。 如果没有当前的解决方案,您会建议我应该做什么? 显然,我想尽可能多地使用部分解决方案来实现它。 ANTLR似乎是一个很好的起点,拥有完整的“ANSI C”语法实现…… 我应该使用ANTLR生成的代码在JVM上构建一个“玩具”VM吗?

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。