Tag: antlr4

ANTLR4 Lexer错误报告(违规字符长度)

我正在使用ANTLR4为某种语言开发一个小型IDE,并且当词法分析器无法匹配时需要强调错误的字符。 在这种情况下,内置的org.antlr.v4.runtime.ANTLRErrorListener实现会向stderr输出一条消息,类似于: line 35:25 token recognition error at: ‘foo\n’ 我没有问题理解如何获取有关错误的行和列的信息(作为参数传递给syntaxError回调),但如何在回调中获取’foo\n’字符串? 当解析器是错误的来源时,它会将违规令牌作为syntaxError回调的第二个参数传递,因此提取有关错误输入的开始和停止偏移的信息变得微不足道,这也在参考书中进行了解释。 但是当源是词法分析器时呢? 在这种情况下,回调中的第二个参数为null,大概是因为词法分析器无法形成令牌。 我需要不匹配字符的长度才能知道要强调多少,但在调试我的监听器实现时,我无法在提供的回调参数中的任何地方找到此信息(除了通过字符串操作从提供的错误消息中提取它,这只是错误)。 ‘foo\n’字符串显然可以以某种方式获得,所以我错过了什么? 我怀疑我可能正在寻找错误的地方,我应该考虑扩展DefaultErrorStrategy ,在那里形成错误消息。

Antlr4 – 是否有使用ParseTree Walker的简单示例?

Antlr4有一个新类ParseTreeWalker。 但是我该如何使用它? 我正在寻找一个最小的工作示例。 我的语法文件是’gram.g4’,我想解析文件’program.txt’ 到目前为止,这是我的代码。 (这假设ANTLR运行了我的语法文件并创建了所有的gramBaseListener , gramLexer等等): import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.*; import static org.antlr.v4.runtime.CharStreams.fromFileName; public class launch{ public static void main(String[] args) { CharStream cs = fromFileName(“gram.g4”); //load the file gramLexer lexer = new gramLexer(cs); //instantiate a lexer CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens gramParser parser = new gramParser(tokens); //parse the […]

ANTLR4 Parser,未创建访问者

我是ANTLR的新手,并尝试在ANTLR4中编写语法,而不需要事先刷过以前的版本。 我正在阅读“ The Definitive ANTLR 4 Reference ”一书。 我使用Eclipse并安装了ANTLR4 IDE,如下所示。 我在Expr.g4中写了以下语法: grammar Expr; import Common; options{ language = Java; } prog: stat+; stat: expr NEWLINE | ID ‘=’ expr NEWLINE | NEWLINE; expr: expr (‘/’|’*’) expr | expr (‘+’|’-‘) expr | INT | ID | ‘(‘expr’)’; Common.g4包含以下内容: lexer grammar Common; ID: [A-Za-z]+; INT: [0-9]+; NEWLINE: […]

ANTLR4中的规则变量

我正在尝试将我的语法从v3转换为v4并遇到一些麻烦。 在第3节我有这样的规则: dataspec[DataLayout layout] returns [DataExtractor extractor] @init { DataExtractorBuilder builder = new DataExtractorBuilder(layout); } @after { extractor = builder.create(); } : first=expr { builder.addAll(first); } (COMMA next=expr { builder.addAll(next); })* ; expr returns [List ext] … 但是,随着v4中的规则返回这些自定义上下文对象而不是我明确告诉他们返回的内容,事情都搞砸了。 什么是v4方式来做到这一点?

使用antlr4获取预处理器行并解析C代码

我使用Antlr4来解析C代码,我使用以下语法来解析: 链接到C.g4 默认情况下,上述语法不提供任何解析规则来获取预处理程序语句。 我稍微改变了语法,通过添加以下行来获得预处理器行 externalDeclaration : functionDefinition | declaration | ‘;’ // stray ; | preprocessorDeclaration ; preprocessorDeclaration : PreprocessorBlock ; PreprocessorBlock : ‘#’ ~[\r\n]* -> channel(HIDDEN) ; 在Java中,我使用以下监听器来获取预处理器行 @Override public void enterPreprocessorDeclaration(PreprocessorDeclarationContext ctx) { System.out.println(“Preprocessor Directive found”); System.out.println(“Preprocessor: ” + parser.getTokenStream().getText(ctx)); } 永远不会触发该方法。 有人可以建议一种获取预处理器线的方法吗? 输入: #include int k = 10; int f(int a, int […]

如何在ANTLR4中实现error handling

我有以下语法来解析应用于图形的一阶逻辑公式: grammar Graph; /*—————————————————————— * PARSER RULES *——————————————————————*/ input : formula EOF ; formula : TRUE | FALSE | formula AND formula | formula OR formula | quantifier formula | ST condition ; condition : atom EQUALS QUOTE? (assignment | atom) QUOTE? ; quantifier : (FOREACH | EXISTS) variable IN domain ; domain : (GRAPH_A […]

如何使用antlr4访客

我是antlr的初学者。 我试图在我的代码中使用访问者并遵循网络上的说明。 但是,我发现访问者没有进入我创建的方法。 愿谁有人告诉我我做错了什么? 这是我的访客: import java.util.LinkedList; import org.antlr.v4.runtime.misc.NotNull; /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * * @author Sherwood */ public class ExtractMicroBaseVisitor extends MicroBaseVisitor { //LinkedList ll = new LinkedList(); //MicroParser parser; //System.out.println(“11”); @Override public Integer visitPgm_body(@NotNull MicroParser.Pgm_bodyContext ctx){ System.out.println(ctx.getText()); […]

如何获取antlr4规则匹配的原始文本?

使用Java 7语法https://github.com/antlr/grammars-v4/blob/master/java7/Java7.g4我想找到具有特定名称的方法,然后打印出该方法。 我看到匹配时我可以使用methodDeclaration规则。 所以我将Java7BaseListener子类Java7BaseListener并覆盖此侦听器方法: @Override public void enterMethodDeclaration(Java7Parser.MethodDeclarationContext ctx) { } 如何获取原始文本? ctx.getText()给我一个字符串,其中删除了所有空格。 我想要评论和原始格式。

ANTLR4使用DOTGenerator解析树到DOT

如何使用DOTGenerator将解析树转换为ANTLR4中的DOT / graphviz格式? 我找到了这个相关的问题,但唯一的答案是使用TreeViewer在JPanel中显示树,这不是我所追求的。 另一个问题是我需要的,但没有得到答案。 我偶然发现的其他一切都与ANTLR3的DOTTreeGenerator有关,并没有帮助。 我正在使用Java和IntelliJ的ANTLR4插件。

如何强制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+)? ‘)’; […]