问题标签 [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.

0 投票
1 回答
371 浏览

java - Antlr4 创建更有意义/一致的类型名称

默认情况下,该token.getType()方法返回一个int,并且对于基于代码的代码非常无用,无需加载和解析*.tokens生成的文件。

ANTLR 用户通常如何一致地使用令牌类型?我所说的一致的意思是,如果你改变语法,记号很可能会改变。

您通常会创建一个Utility加载*.tokens文件并解析它的类吗?

我的示例Search.tokens文件:

示例令牌流:

目前我正在做类似的事情:

然后我总是可以通过诸如LOCATIONor之类的名称来引用我的标记,GENDER而不必担心Integer会发生变化的值。

0 投票
1 回答
4196 浏览

antlr4 - Antlr4 优先级和关联性

我对解析诸如(B32|B5)&B31. 我的目标是找出这个表达式被评估的顺序。所以我的预期结果将是B2那时|B5也是最后&B31

我的表达式可以有特殊字符。与*,={. 所以 exp 可以是B31*{A1,A2}|B35. 在这种情况下,我希望B31*{A1,A2}作为一个令牌先被评估,然后B35.

我创建了以下语法。

我编译了上面Expr.g4的内容,-visitor以便生成访问者。然后我创建了一个访问者类来遍历每个表达式并将其捕获到一个列表中。

EvalExpression类如下

Value如下

现在最后我写了一个测试程序来打印出令牌列表和我需要查看它们的顺序

我的问题是当我运行EvalExprTest并在程序中使用String src = "(B32|B5)&B31". 我得到以下结果。

我的目标是获得优先级,以便首先评估括号中的表达式。但它似乎总是从最右边的表达式穿过树,在这种情况下它是B31

有人可以帮忙吗?语法正确吗?访客实现是正确的吗?

0 投票
1 回答
2239 浏览

lexer - 如何在 ANTLR4 中定义可以出现在多种词法模式中的标记?

我正在学习 ANTLR4 并尝试使用词汇模式。如何让相同的标记出现在多个词法模式中?作为一个非常简单的例子,假设我的语法有两种模式,我想匹配它们中的空格和行尾,我怎么能不以 WS_MODE1 和 WS_MODE2 结尾。有没有办法在两种情况下重用相同的定义?无论模式如何,我都希望在所有空白区域的输出流中获得 WS 令牌。这同样适用于 EOL 和其他可以出现在两种模式中的关键字。

0 投票
1 回答
4678 浏览

antlr4 - 如何使用 ANTLR4 构建 AST?

我有一个构建抽象语法树的 ANTLR3 语法。我正在考虑升级到 ANTLR4。然而,ANTLR4 似乎只构建解析树而不是抽象语法树。例如,该output=AST选项不再被识别。此外,“AST”“抽象语法”都没有出现在“The Definitive ANTLR4 reference”的文本中。

我想知道我是否遗漏了什么。

我的应用程序目前知道如何爬过 ANTLR3 生成的 AST。将其更改为处理解析树并非不可能,但这需要一些工作。在我开始这条路之前,我想确定这是必要的。

0 投票
1 回答
239 浏览

antlr4 - Antlr4 如何捕获表达式的求值顺序

我有以下语法

我想提取正在评估的表达式的节点,并按照评估的顺序需要它。因此对于诸如 1*{A42,A53,A16,A3}&(A26|A41)&(A51=P&A2=F|A7=C) 之类的表达式,它将按以下顺序进行评估

主要兴趣是弄清楚表达式的计算顺序。

你怎么处理这件事。我尝试编写访问者实现,但不知道如何提取订单。

0 投票
1 回答
488 浏览

java - 将 ANTLR4 集成到 Java 中

我已经用 ANTLR4 生成并编译了一个语法。通过命令行我可以查看是否有错误,但是我在将此解析器成功集成到 java 程序中时遇到问题。我可以使用 ANTLR4 方法,因为我已经在 Eclipse 中将 JAR 添加到我的库中,但是我完全无法检索令牌文本或找出是否以任何有意义的方式生成错误。任何帮助,将不胜感激。如果我以任何方式模棱两可,请告诉我,我将深入研究更多细节。

查看以前的版本,可能是我想要的类似 compilerUnit() 的等效方法。

0 投票
1 回答
613 浏览

c# - C# 4.0 Antlr4 运行时

有谁知道,其他非 java 运行时,尤其是 C# 4.0 何时可用。

早期的 Antlr 3.0 版本几乎为所有流行的编程语言提供了运行时。

0 投票
1 回答
291 浏览

antlr4 - Lexer 规则中没有量词的括号是什么?

假设以下语法:

我将以下输入传递给语法:-.-.-!

我希望 ANTLR 能够识别令牌 START_BLOCK 和 SEPERATOR。但相反,它找到了一个 Token 类型ID

我想我可以通过删除词法分析器规则“ID”中的前一对括号来解决这个问题:

现在一切正常,但为什么呢?上面的括号对我的语法有什么影响?

0 投票
2 回答
932 浏览

performance - 性能问题我的语法和antlr4

我是使用 antlr 4 的新手,以前从未写过语法。语法似乎适用于短样本,但我有一些较长的示例将在一夜之间运行而不会完成。我将 TestRig 与我的输入文件一起使用。我使用了 JVisualVM 并观察了大部分时间都花在这里的代码:

该问题似乎与以下格式的陈述量有关。

在其中的 12 到 72 个之间的某个地方出现了问题

我给了jvm 2G的内存,它使用的内存不到1G。堆增长和缩小,所以我不相信有内存泄漏。

关于如何调试这样的东西的任何建议?

我看不到附加文件的方法,堆栈跟踪是 422 行,大部分重复 1278 和 1325。我不了解 TestRig,所以我不知道它在做什么。如果我能找到它,将获得 antlr-4.0-complete.jar 的源代码。

我开始研究精简的语法以用作测试用例。这个练习确实帮助我识别了我从语法中删除的一些奇怪的东西。这解决了我精简语法的问题,但是当我恢复完整的语法时,性能问题又回来了。

在我看来,增加简单比较的出现次数会非线性地增加处理时间,这真的很奇怪。'TOKEN = "SOMESTRING" OR TOKEN = "SOMEOTHERSTING"' 的几个实例处理相对较快,但如果我有 75 个这样的比较,处理时间就会变得太多。

我无法确定 antlr4 源是否在某处可用。很高兴单步执行代码以查看发生了什么。

我想我会重复这个过程,看看它会产生什么。

0 投票
1 回答
1081 浏览

java - 在 ANTLR4 中遍历解析树时处理错误的惯用方式是什么?

我刚刚开始使用 ANTLR4,并且正在创建一个遍历解析树的侦听器。我还有一个自定义错误侦听器添加了Parser实例;在此基础上,我希望在调用期间报告的任何错误ParseTreeWalker.walk()也转到解析器的错误侦听器。我突然想到我可以调用Parser.getErrorListeners()并将它注入到我的侦听器类中,但我希望有一些更成熟的东西。

当我这样做时,我需要一种在报告错误时确定给定节点的行号和列号的方法。在报告听众或访问者发现的错误时,每个人都会自己动手吗?