问题标签 [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 回答
833 浏览

antlr4 - 标签“标签”类型与之前的定义不匹配:TOKEN_LABEL!=RULE_LABEL

我注意到我不能写这样的规则:

它给出了以下错误:

标签“标签”类型与之前的定义不匹配:TOKEN_LABEL!=RULE_LABEL

看起来这是因为一次标签引用解析器规则,一次引用词法分析器规则。如果我稍微改变规则:

一切正常。但为什么?我的第一次尝试有什么问题?

0 投票
1 回答
447 浏览

antlr - 用不明确的字符串值解析 ANTLR4 规则

我有一个语法,我无法消除可能属于布尔值或字符串的值的歧义。

该语法有几个字符串类型和布尔类型的字段。字符串字段几乎可以包含引号内的任何内容,布尔值可以包含“Y”或“N”。问题:有时字符串字段也可以包含“Y”或“N”(通常作为多个单字符值列表的一部分)。

以下是相关的语法规则。我尝试使用谓词来消除布尔比较与字符串的歧义,只要该字符串是“Y”或“N”。

尝试解析布尔表达式时的错误消息:

是:

在 antlr3 中,我只会使用前瞻,但这不再是一个选项。

那里有任何帮助吗?

0 投票
1 回答
17635 浏览

parsing - ANTLR4:空白处理

我见过许多使用空格处理的 ANTLR 语法,如下所示:

所以空格被丢弃,分别发送到隐藏通道。

使用这样的语法:

有效输入是“ not true ”或“ not false ”,但也有“ nottrue ”,这不是期望的结果。将语法更改为:

解决了这个问题,但我不想在每个规则中手动处理空格。

通常,我希望每个标记之间有一个空格,但有一些例外(例如,' !true ' 之间不需要空格)。

有没有一种简单的方法可以做到这一点?

0 投票
1 回答
681 浏览

grammar - ANTLR 4 java.g4 -> 奇怪的语法规则

这是我在 java.g4 中看到的规则之一:

DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;

为什么不这样写:

DecimalLiteral : ('0'..'9'+) IntegerTypeSuffix? ;

有什么我想念的吗?感谢您的反馈意见

问候菲利普弗兰克森

0 投票
1 回答
5625 浏览

antlr4 - ANTLR4:布尔表达式的解析器

我正在尝试解析以下类型的布尔表达式 B1=p & A4=p | A6=p &(~A5=c)

我想要一棵可以用来评估上述表达式的树。所以我在 Antlr3 中用Antlr parser for and/or logic 中的示例尝试了这个 - 如何在逻辑运算符之间获取表达式?

它在 Antlr3 中工作。现在我想对 Antlr 4 做同样的事情。我想出了下面的语法并编译。但是我在编写 Java 代码时遇到了麻烦。

Antlr4 语法的开始


我已经编写了 Java 代码(下面的代码段)来获取表达式“B1=p & A4=p | A6=p &(~A5=c)”的树。我期待 & 与孩子 B1=p 和 |。孩子| 运算符将有子 A4=p 和 A6=p &(~A5=c)。等等。这是Java代码,但我一直在试图弄清楚如何获得树。我能够在 Antlr 3 中做到这一点。

Java 代码

get Children 方法如下。但这似乎并没有提取任何令牌。

有人可以帮我弄清楚如何用 Java 编写解析器吗?

0 投票
1 回答
1108 浏览

multithreading - 并行运行多个 ANTLR4 词法分析器/解析器实例

我正在使用 ANTLRv4 生成的解析器来处理具有多核机器上的大量文件。为了获得一些额外的速度,我想并行处理文件。

为了检查解析器性能是否受 CPU 限制,我将文件分成组,并使用独立进程解析它们,每个进程在专用 JVM 实例中运行相同的解析器。这大大提高了性能。

这鼓励我尝试使用多个线程而不是进程进行相同的尝试,但是没有成功。我创建了两个工作线程,每个线程都有自己的解析器、词法分析器和文件流实例。返回的结果是正确的,但是,使用两个线程实际上比使用一个线程花费的时间稍长。

为了确保我正确使用线程并且 JVM 安装没有问题,我暂时将解析代码替换为计算斐波那契序列的代码:在这种情况下,使用多个线程会提高性能。

分析这种行为,我发现当使用多个解析线程时,没有一个 CPU 达到高使用率。看起来线程正在争夺一些共享资源。

看了一下ANTLR源代码,在ParserATNSimulator.java中发现如下注释:

“同一个解析器的所有实例通过一个静态字段共享相同的决策 DFA。每个实例都有自己的 ATN 模拟器,但它们共享相同的 decisionToDFA 字段。它们还共享一个 PredictionContextCache 对象,确保所有 PredictionContext 对象在 DFA 之间共享状态。这有很大的不同。

我想知道对这些共享资源的同步访问是否会导致性能问题。如果是这样,是否有可能创建这些资源的唯一实例?或者是否有更简单的解决方案?

提前致谢!

费边

0 投票
1 回答
40120 浏览

java - ANTLR 中使用监听器的 if/else 语句

我正在为一个学校项目创建一种简单的编程语言。我正在使用 ANTLR 4 从我的语法中生成词法分析器和解析器。到目前为止,我一直在使用 ANTLRs 监听器模式来应用编程语言的实际功能。

现在我想实现 if/else 语句,但我不确定在使用侦听器模式时是否可以实际实现这些语句,因为 ANTLR 决定在使用侦听器时遍历解析树的顺序,我想 if/ 的实现else 语句将需要根据语句中满足的条件在解析树中跳转。

谁能告诉我是否可以使用 ANTLR 实现 if/else 语句,或者我是否必须自己实现访问者模式?另外,任何人都可以给出一个非常简单的实现语句的例子吗?

0 投票
1 回答
1888 浏览

while-loop - 使用 ANTLR 同时执行 while 和 while

早些时候我创建了这个问题,询问如何使用 ANTLR 4 创建 if/else 语句。我得到了一个很好的答案,它还展示了如何执行 while 循环。我已经用我的语言实现了这一点,现在我正在尝试使用几乎相同的原理制作一个 do-while 循环。

对于 while 循环,我的语法如下:

这就是我想要的 do-while 循环:

我已经对其进行了测试,但是它们都可以工作,但是不能同时工作。以下是我的语法(很抱歉将其全部发布,但我认为这是必要的)。

如果我的WHILE和标记在我的和END_WHILE标记之上,那么 while 循环有效。但是,如果我在我的 do-while 循环中切换它们。如果我将令牌更改为除了while之外的任何东西,那么两者都可以。DO_WHILEDO_WHILE_CONDITIONDO_WHILE_CONDITION

无论如何,我可以让它们都使用当前的语法吗?我知道这可能是个问题,因为我对多件事使用相同的关键字,但我希望有办法做到这一点。

0 投票
1 回答
433 浏览

maven - 哪个antlr4-runtime?

我正在尝试在 Eclipse 中添加依赖antlr4-runtime。它显示了两个可供选择的实例。

  1. com.tunnelvisionlabs::antlr4-runtime (324566 b)
  2. org.antlr::antlr4-runtime (242694 b)

这些文件大小不同。

我应该使用哪一个?

0 投票
1 回答
1269 浏览

java - Antlr 获取子代币

如果我的术语不正确,请原谅我。

假设我有一点简化的语法:

所以这当然会匹配'boy vs girl'or'girl vs boy'等​​。但我的问题是当我创建 Lexer 时,即

这会打印出类似这样的内容:9 [boy vs girl],即它与我的查询匹配得很好,但现在我希望能够执行类似的操作,获取当前令牌的子令牌。

我的直觉告诉我我需要使用树,但对于我的示例,我真的不知道如何在 Antlr4 中执行此操作。谢谢