问题标签 [antlr4]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
coldfusion - 语法完成后,遍历 ANTLR v4 树的最佳方法是什么?
目标
我正在开发一个为 Coldfusion CFscript 创建 Varscoper 的项目。基本上,这意味着检查源代码文件以确保开发人员正确地使用var
了他们的变量。
在使用 ANTLR V4 几天后,我有了一个语法,它在 GUI 视图中生成了一个非常好的解析树。现在,使用该树,我需要一种方法来以编程方式向上和向下爬取节点以查找变量声明,并确保如果它们在函数内部,则它们具有正确的作用域。如果可能的话,我宁愿不在语法文件中这样做,因为这需要将语言的定义与这个特定的任务混合。
我试过的
我最近的尝试是使用ParserRuleContext
并试图通过它的children
via getPayload()
。检查类后,getPayLoad()
我要么有一个ParserRuleContext
对象,要么有一个Token
对象。不幸的是,使用它我永远无法找到一种方法来获取特定节点的实际规则类型,只有它包含文本。每个节点的规则类型是必需的,因为该文本节点是被忽略的右手表达式、变量赋值还是函数声明都很重要。
问题
- 我对 ANTLR 很陌生,这甚至是正确的方法,还是有更好的方法来遍历树?
这是我的示例 java 代码:
cfscript.java
cfscript.g4
Test.cfc(测试代码文件)
conditional - ANTLR 将 1 对 1 语法规则链接在一起以解决条件
如果您查看 ObjectiveC antlr v3 语法(http://www.antlr3.org/grammar/1212699960054/ObjectiveC2ansi.g)和许多其他流行的语法,它们会采用与此类似的结构来解决条件
如果您阅读它,您会注意到他们执行了非常长的 1 对 1 条件链 from conditional_expression
to logical_or_expression
to logical_and_expression
to inclusive_or_expression
to exclusive_or_expression
。
现在,当谈到 ANTLR 时,我很天真,但这让我觉得这是一种奇怪的解析条件的方式。将logical_or_expression 的定义扭曲到所有其他条件表达式类型似乎非常复杂。毕竟,逻辑的定义OR
与左移位有什么关系?
是否有更好的方法,或者是否有特定的原因需要这种方法?
antlr - 使用 ParseTreeWalker 中止树遍历
我的任务是为Triangle Abstract Machine编写一个“Calc”编译器,它将 Calc 源文件转换为 TAM 程序集。
Calc 语言由变量声明(仅支持整数)组成,
作业
和打印功能。
目前,我正在使用 ANTLR4s 树行走设施,通过使用侦听器将 Calc 转换为 TAM 程序集(及其工作)。现在我想中止树遍历,如果发生上下文错误(例如使用未定义的变量)。
我怎样才能做到这一点?
error-handling - Antlr4 丢弃剩余的令牌而不是纾困
我正在使用 Antlr4,这是我编写的简化语法:
我使用了 BailErrorStategy 和 BailLexer,如下所示:
除了一种情况外,一切正常。我尝试了以下表达式:
我希望这个表达式被拒绝并抛出 IllegalArgumentException 因为“或”标记应该是小写而不是大写。但事实证明 Antlr4 并没有拒绝这个表达式,并且该表达式被标记为“KW_TRUE IDENTIFIER KW_FALSE”(这是预期的,大写的“OR”将被视为一个 IDENTIFIER),但是解析器在执行过程中没有抛出错误处理此令牌流并将其解析为仅包含“true”的树并丢弃剩余的“IDENTIFIER KW_FALSE”令牌。我尝试了不同的预测模式,但它们都像上面一样工作。我不知道为什么它会这样工作并进行了一些调试,最终导致了 Antlr 中的这段代码:
代码“int alt = getAltThatFinishedDecisionEntryRule(previousD.configs);” 返回 booleanTerm 中的第二种选择(因为“true”与第二种选择“booleanLiteral”匹配)但由于它不等于 ATN.INVALID_ALT_NUMBER,因此不会立即抛出 noViableAlt。根据那里的Java评论,“无论如何我们都会得到一个错误,所以延迟到决定之后”但似乎最终没有抛出错误。
我真的不知道如何让 Antlr 在这种情况下报告错误,有人可以帮我解释一下吗?任何帮助表示赞赏,谢谢。
antlr - “跳过”改变解析器的行为
添加skip
到规则并没有达到我的预期。这是一对用逗号和空格分隔的标记的语法。我制作了一个带有逗号标记的版本skip
,以及一个没有逗号的版本:
skip
在没有按预期工作的情况下测试规则:
Withskip
给了我一个错误:
如果我注释掉COMMA
andwithoutSkip
规则,我会得到:
我正在尝试获取仅包含不带逗号的数据标记的输出,如下所示:
我究竟做错了什么?
antlr4 - 在规则定义中指定一个方法,使得某个字符类可以被识别
当您为 ANTLR 编写词法分析器语法时,是否可以指定一种方法来决定是否应由规则接受读取的字符?
例如:
antlr4 - 如何匹配 ANTLR4 中的任何字符?
我想匹配 \u0000 到 \uFFFF 范围内的任何字符,以下代码是不够的:
编辑:
我在问,因为我想在类似 XML 的结构中插入二进制数据:
当然可以将自己限制在 [\u0000-\u00FF] 范围内,并且我的 Inputstream 只输出已处理数据的字节值,但是我必须实现额外的逻辑才能使用我的实际文本数据。
对我来说最好的解决方案是,ANTLR 以某种方式跳过二进制部分,所以我可以处理文本数据(要处理二进制部分,我只需要这些部分的开始和结束位置);
ant - 使用 ant 从源代码构建 ANTLR v4 的问题:[java] 错误(7):找不到或打开文件:*.g
我试图从源代码构建 ANTLR 版本 4,因为我从官方网站下载了它,但我不能使用 ant 来完成。正如build.xml所说,我将antlr-3.5-complete-no-st3.jar下载到/lib文件夹中,但是当我运行ant时它返回:
[mkdir] 创建目录:/../antlr/antlr4-master/build/generated-sources/antlr3/org/antlr/v4/parse [java] 错误(7):找不到或打开文件:*.g
构建失败/../antlr/antlr4-master/build.xml:108:执行此行时发生以下错误:/../antlr/antlr4-master/build.xml:84:Java返回:1
我在运行 OSX 10.8.2 的 MacBook 上为了使用 ant 成功编译,我还需要做些什么吗?
提前致谢, 迪莫斯
antlr4 - antlr4:创建 ParseTrees 时忽略多余的标记
我正在使用 ANTLR4 为实时语言 PEARL 开发编译器。
使用 ANTLR4,我的 ParseTree 填充了多余的标记,例如用于结束语法单元的分号。
有没有办法告诉 ANTLR 忽略这些类型的令牌?
antlr4 - 从 Own 类继承而不是从 XMLParserRuleContext
我正在使用“访问者”模式从我解析的代码中生成 XML。在典型的上下文类看起来像:
我使用 RuleContext 的“getText”成员函数访问访问者回调函数中的元素。我想编写一个继承自'ParserRuleContext'的类并重载'getText',以便用它们的xml转义序列替换'<'或'>'之类的字符。有没有一种方法可以生成我的代码并让上下文类继承自我的类,如:
谢谢您的帮助!亲切的问候,狼