问题标签 [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.
antlr4 - 是 ANTLR4 EOF 错误还是我的错误
这是我精简的 ANTLR4 语法(注意我使用常量 false 来替换返回 false 的方法):
我的测试文件只包含 1 个单词“hello”,测试结果如下:
为什么当我添加一个语义谓词(虽然这里是一个虚拟的)作为替代时,它一直说“输入 '< EOF >' 的第 1:5 行没有可行的替代方案”?如果我删除带有错误语义谓词的替代项,则错误会按预期消失。
PS:我正在使用 antlr-4.0-complete.jar
javascript - 确定 ECMAScript 赋值表达式的左侧或右侧
我正在开发一个为 ECMAScript 文件的文本构建符号表的解析应用程序。我遇到的问题是在处理带有ParseTreeListener
.
这是使用Chris Lambrou 的 ANTLR 语法,它似乎与ECMAScript 规范中的官方语法非常接近。有一个名为 的解析器规则leftHandSideExpression
,但这是具有欺骗性的,因为当在 TestRig GUI 中显示时,它也始终显示在表达式的右侧。
这是一项需要访问者模式的任务吗?
欣赏建议。
antlr4 - 类 JSON 语言的语法
我正在尝试为类似 JSON 的语言设计语法。主要区别在于属性名称不需要双引号(尽管可以),并且数字只是整数(没有浮点数)。
这是一个例子:
这是我的(尝试)语法:
但是,尝试在我的示例输入上运行 TestRig,我得到
有什么想法我哪里出错了吗?
谢谢你的时间!
托马斯
antlr - “解析器规则中的隐式令牌定义”需要担心吗?
我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法。我已经基本完成了语法本身(它识别用所描述语言编写的代码并构建正确的解析树),但除此之外我还没有开始任何事情。
让我担心的是,解析器规则中每个第一次出现的标记都带有黄色曲线下划线,上面写着“解析器规则中的隐式标记定义”。
例如,在这条规则中,'var'
有那个曲线:
它看起来如何:
奇怪的是,ANTLR 本身似乎并不介意这些规则(在进行测试台测试时,我在解析器生成器输出中看不到任何这些警告,只是在我的机器上安装了不正确的 Java 版本),所以这只是 ANTLRWorks 抱怨。
是否需要担心或者我应该忽略这些警告?我应该在词法分析器规则中明确声明所有标记吗?官方圣经The Defintive ANTLR Reference中的大多数例子似乎都是按照我编写代码的方式完成的。
c++ - 解析 C++ 源代码时 ANTLR4 相互左递归错误
我正在尝试解析 cpp 源语法的一个子集。以下 ANTLR4 解析器规则直接从 c++ 语言规范中复制而来(连字符被下划线代替):
但是当 org.antlr.v4.Tool 解析语法时出现此错误:
错误(119):cppProcessor.g4::: 以下规则集是相互左递归的 [direct_abstract_declarator]
好像是direct_abstract_declarator?左侧的语法会导致错误。我应该如何纠正它?为什么ANTLR4不支持?
手动将规则重构为这种形式不会产生错误:
那么ANTLR4在处理左递归规则时是否可以直接支持第一种语法呢?
antlr - NetBeans 平台语言和 ANTLR 词法分析器
如何使 NetBeans LexerInput 适应 ANTLR 的 CharStream。我有下一个实现,但效果不佳。我想通过 ANTLR 词法分析器向 NetBeans 平台添加一种新语言。
Lexer 只发出 EOF,但令牌类型没问题,我不明白。
antlr4 - 基准跳过注释“#;” 在使用 ANTLR4 为 R6RS 制作解析器时
我正在尝试为 R6RS 编写词法分析器/解析器,但我遇到了数据跳过评论
这是我的词法分析器/解析器规则的一部分:
现在,我想像这样写skipDatum: '#;' datum -> skip
。不幸的是,解析器规则不允许->skip
. 两者都SKIPDATUM: '#;' datum -> skip
不起作用,因为词法分析器规则不能引用解析器规则。
在我看来,虽然“注释掉”是词法分析器的责任,而“构造数据”是解析器的责任,但#;
两者都需要规则。
这是我目前的解决方案:
虽然它正在工作,但它看起来很丑陋;在我真的想用 写规则的地方datum
,我总是必须这样写skipDatum* datum skipDatum*
有没有更好的解决方案?提前致谢。
antlr4 - 使 ANTLR4 解析树可序列化
是否可以保存由 ANTLR4 生成的解析树?例如,通过使 ParseTree 或其子类可序列化。
我想使用 ANTLR4 来解析我项目中的源文件。我的项目很大,包含数百个源文件。通常,我需要遍历几个源文件的解析树来获取我想要的信息。完整的语法非常庞大,即使只解析 1 个源文件也需要一段时间。因此,每次我启动工具以获取 1 条信息(例如函数的调用者)时,再次解析所有源文件是不切实际的。如果我可以只解析一次并将解析器输出保存到硬盘中,那就太好了。
grammar - 将终端分组到集合中
这个警告是什么意思?我该如何解决?
这是我指的代码
antlr4 - ANTLR4 API 显示任意 ParseTree
ANTLR4 当前的 TestRig 工具支持 -gui 选项来解析整个输入文件并以图形方式显示整个结果解析树。我们是否可以先获取解析树,对其进行修改并调用一些 API 以图形方式显示解析树的子集/子树。
我的输入源文件很大,无法查看 TestRig 显示的标准解析树。更重要的是,我想过滤掉很多不相关的语法,专注于验证那些我需要测试的语法。但是从TestRig提供的标准巨大解析树中很难定位到一小部分信息。