Tag: antlr4

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’; […]

如何获取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中生成AST?

我正在开发一个项目,我必须为给定的程序生成抽象语法树。 这里的程序可以是任何主流编程语言。 在ANTLR4中生成AST的标准方法是什么? 我只知道ANTLR4的基础知识,我能够为给定的程序生成Parse树。

ANTLR4 java解析器可以处理非常大的文件,还是可以流文件

ANTLR生成的java解析器是否能够传输任意大的文件? 我尝试使用UnbufferedCharStream构建一个Lexer并将其传递给解析器。 我得到了一个UnsupportedOperationException,因为在UnbufferedCharStream上调用了size,并且exception包含一个解释,你不能在UnbufferedCharStream上调用size。 new Lexer(new UnbufferedCharStream( new CharArrayReader(“”.toCharArray()))); CommonTokenStream stream = new CommonTokenStream(lexer); Parser parser = new Parser(stream); 我基本上有一个文件,我使用猪从hadoop导出。 它有大量以’\ n’分隔的行。 每列用’\ t’分隔。 这很容易在java中解析,因为我使用缓冲读取器来读取每一行。 然后我用’\ t’分割得到每一列。 但我也希望进行某种模式validation。 第一列应该是格式正确的日期,后面是一些价格列,后面是一些hex列。 当我查看生成的解析器代码时,我可以像这样调用它 parser.lines().line() 这会给我一个概念上我可以迭代的列表。 但似乎列表在我得到它时会有一个固定的大小。 这意味着解析器可能已经解析了整个文件。 API的另一部分是否允许您流式传输大型文件? 就像在阅读文件时使用Visitor或Listener来调用一些方法一样? 但它无法将整个文件保留在内存中。 它不合适。

我们可以使用ANTLR定义非上下文语法吗?

我对ANTLR4很新,现在我正在尝试用它来定义哪种语法。 据我所知,ANTLR中有两种规则: 解析器规则 (小写单词)和词法分析器规则 (大写单词)。 例: grammar Test; init: prog(‘,’prog)*; prog: A | prog ; A: [az]+; 从语法生成规则的立场出发,我会说解析器规则是NON-TERMINAL符号,可以用词法分析器规则定义的一系列令牌代替。 因此,很明显,语法在定义中没有上下文。 语法生成的语言的alpahbet包含由小写拉丁字母组成的所有单词。 问题:我们可以使用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’ | […]

Antlr:初学者期望ID的不匹配输入

作为初学者,当我从The Definitive ANTLR 4参考书中学习ANTLR4时,我尝试从第7章开始运行我修改过的练习版本: /** * to parse properties file * this example demonstrates using embedded actions in code */ grammar PropFile; @header { import java.util.Properties; } @members { Properties props = new Properties(); } file : { System.out.println(“Loading file…”); } prop+ { System.out.println(“finished:\n”+props); } ; prop : ID ‘=’ STRING NEWLINE { props.setProperty($ID.getText(),$STRING.getText());//add one […]

在Eclipse Luna上设置ANTLR 4 IDE的麻烦(4.4)

我正在尝试在Eclipse Luna(4.4)上安装ANTLR 4 IDE 。 我已经从Marketplace安装了它,但我不知道如何创建一个包含ANTLR 4 Lexer / Parser的项目。 当我去创建一个新项目时,我没有看到ANTLR 4的任何选项。我尝试创建一个.g4文件,它在编辑器中打开,但是当我保存它没有做任何事情。

ANTLR4访问者模式简单的算术例子

我是一个完整的ANTLR4新手,所以请原谅我的无知。 我遇到了这个演示文稿 ,其中定义了一个非常简单的算术表达式语法。 看起来像: grammar Expressions; start : expr ; expr : left=expr op=(‘*’|’/’) right=expr #opExpr | left=expr op=(‘+’|’-‘) right=expr #opExpr | atom=INT #atomExpr ; INT : (‘0’..’9′)+ ; WS : [ \t\r\n]+ -> skip ; 这很好,因为它会生成一个非常简单的二叉树,可以使用访问者模式遍历,如幻灯片中所述,例如,这是访问expr的函数: public Integer visitOpExpr(OpExprContext ctx) { int left = visit(ctx.left); int right = visit(ctx.right); String op = ctx.op.getText(); switch […]