草庐IT

java - ANTLR:以编程方式运行解析器时忽略语法错误

我目前正在使用ANTLR创建一个或多或少简单的表达式求值器。我的语法很简单(至少我希望如此)并且看起来像这样:grammarSXLGrammar;options{language=Java;output=AST;}tokens{OR='OR';AND='AND';NOT='NOT';GT='>';//greaterthenGE='>=';//greaterthenorequalLT=''|'='|'='|'!=')^commonExpression)?;commonExpression:multExpr(('+'^|'-'^)multExpr)*|DATE;multExpr:atom(

java - 获取 Antlr 规则的原始文本

我是ANTLR初学者,想计算符号的SHA1-Hash。我的简化示例语法:grammarExample;method@after{calculateSha1($text);}:'call'ID;ID:'A'..'Z'+;WS:(''|'\n'|'\r')+{skip();}COMMENT:'/*'(options{greedy=false;}:.)*'*/'{$channel=HIDDEN}当词法分析器移除所有空格时,不同的字符串callABC、call/*DEF*/ABC不幸地得到了相同的SHA1-Hash值。是否有可能获得开始和结束标记之间的规则的“原始”文本以及所有跳过的空格和其他

java - ANTLR4:忽略输入中的空格但不忽略字符串文字中的空格

我有一个简单的语法如下:grammarSampleConfig;line:ID(WS)*'='(WS)*string;ID:[a-zA-Z]+;string:'"'(ESC|.)*?'"';ESC:'\\"'|'\\\\';//2-charsequences\"and\\WS:[\t]+->skip;输入中的空格被完全忽略,包括字符串文字中的空格。finalStringinput="key=\"valuewithspacesinbetween\"";finalSampleConfigLexerl=newSampleConfigLexer(newANTLRInputStream(inpu

java - 如何列出 Java 方法/函数中的所有局部变量?

我的主要问题:我知道您通常可以使用反射输出类字段,即使您不知道变量名称、类型,甚至不知道有多少。但是,假设我不知道变量名称是什么,是否有一种方法可以列出当前函数或当前范围内的所有变量?换句话说:intx=5;inty=42;//somemorecode//NowIwanttoprintlnxandy,butassumingIcannotuse"x"or"y".我也很乐意回答这个问题:假设我可以存储所有变量的名称,这有帮助吗?例如:SetvarNames=newHashSet();intx=5;varNames.add("x");inty=42;varNames.add("y");//s

java - 将无效字符视为 ANTLR4 词法分析器中的单个标记

我正在使用JSONgrammarfromtheantlr4grammarrepository为编辑器插件解析JSON文件。它有效,但一个一个地报告无效字符。以下代码段导致18个词法分析器错误:{sometext-without-quotes:42}我想通过将相同类型的连续无效单字符标记视为一个更大的无效标记来将其归结为1-2。对于类似的问题,建议使用自定义词法分析器将“未知”元素粘合到较大的标记:Inantlr4lexer,Howtohavearulethatcatchesallremaining"words"asUnknowntoken?我假设这会绕过通常的词法分析器错误报告,如果可

java - 使用 ANTLR v3 编译 Java 源代码时出现问题

我正在尝试从命令行运行ANTLRC语法文件(DummyC.g)来解析C源文件和头文件(a.h)。当我使用antlr.jar文件运行它时,它会生成解析器和词法分析器文件。但是当我编译测试文件Main.java时。它给出了缺少ANTLR包的错误,如下所示。C:\antlr-2.7.6\test>javacMain.javaMain.java:1:packageorg.antlr.tooldoesnotexistimportorg.antlr.tool.;^Main.java:2:packageorg.antlr.runtimedoesnotexistimportorg.antlr.runt

java - 如何在ANTLR4中实现错误处理

我有以下语法来解析应用于图形的一阶逻辑公式:grammarGraph;/*------------------------------------------------------------------*PARSERRULES*------------------------------------------------------------------*/input:formulaEOF;formula:TRUE|FALSE|formulaANDformula|formulaORformula|quantifierformula|STcondition;condition:a

java - 理解 ANTLR 中的树

我正在尝试将Antlr用于一些类似文本IDE的功能——特别是解析文件以识别代码折叠点和应用语法高亮显示。第一个问题——Antlr是否适合这个需求,或者它是否矫枉过正?这可以使用正则表达式和/或手动解析器来实现...但似乎Antlr可以为我完成这项工作。我浏览了...和优秀的教程资源here.我已经设法构建了一个Java语法(使用standardgrammar),并将所有内容整齐地解析为一棵树。但是,我希望看到嵌套在树中的元素。事实上,一切都是最顶层元素的子元素。例如。鉴于:packagecom.examplepublicclassFoo{StringmyString="HelloWor

java - 如何简化 token 预测 DFA?

词法分析器DFA导致“代码太大”错误我正在尝试使用ANTLR3解析Java服务器页面。Java对单个方法的字节码有64k的限制,我在编译ANTLR生成的Java源代码时一直遇到“codetoolarge”的错误。在某些情况下,我已经能够通过破坏我的词法分析器来修复它。例如,JSP使用XML“名称”标记,它可以包含多种字符。我决定在我的“名称”token中只接受ASCII字符,这极大地简化了一些测试,词法分析器允许它编译。然而,我已经到了无法再偷工减料的地步,但DFA仍然太复杂。我该怎么办?是否存在导致复杂DFA的常见错误?有没有办法抑制DFA的生成,也许是依靠语义谓词或固定前瞻来帮助预

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

Antlr4有一个新类ParseTreeWalker。但是我该如何使用它呢?我正在寻找一个最小的工作示例。我的语法文件是'gram.g4',我想解析一个文件'program.txt'到目前为止,这是我的代码。(假设ANTLR已经运行了我的语法文件并创建了所有的gramBaseListener、gramLexer等等):importorg.antlr.v4.runtime.*;importorg.antlr.v4.runtime.tree.*;importstaticorg.antlr.v4.runtime.CharStreams.fromFileName;publicclasslaun