问题标签 [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 - 标签“标签”类型与之前的定义不匹配:TOKEN_LABEL!=RULE_LABEL
我注意到我不能写这样的规则:
它给出了以下错误:
标签“标签”类型与之前的定义不匹配:TOKEN_LABEL!=RULE_LABEL
看起来这是因为一次标签引用解析器规则,一次引用词法分析器规则。如果我稍微改变规则:
一切正常。但为什么?我的第一次尝试有什么问题?
antlr - 用不明确的字符串值解析 ANTLR4 规则
我有一个语法,我无法消除可能属于布尔值或字符串的值的歧义。
该语法有几个字符串类型和布尔类型的字段。字符串字段几乎可以包含引号内的任何内容,布尔值可以包含“Y”或“N”。问题:有时字符串字段也可以包含“Y”或“N”(通常作为多个单字符值列表的一部分)。
以下是相关的语法规则。我尝试使用谓词来消除布尔比较与字符串的歧义,只要该字符串是“Y”或“N”。
尝试解析布尔表达式时的错误消息:
是:
在 antlr3 中,我只会使用前瞻,但这不再是一个选项。
那里有任何帮助吗?
parsing - ANTLR4:空白处理
我见过许多使用空格处理的 ANTLR 语法,如下所示:
所以空格被丢弃,分别发送到隐藏通道。
使用这样的语法:
有效输入是“ not true ”或“ not false ”,但也有“ nottrue ”,这不是期望的结果。将语法更改为:
解决了这个问题,但我不想在每个规则中手动处理空格。
通常,我希望每个标记之间有一个空格,但有一些例外(例如,' !true ' 之间不需要空格)。
有没有一种简单的方法可以做到这一点?
grammar - ANTLR 4 java.g4 -> 奇怪的语法规则
这是我在 java.g4 中看到的规则之一:
DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
为什么不这样写:
DecimalLiteral : ('0'..'9'+) IntegerTypeSuffix? ;
有什么我想念的吗?感谢您的反馈意见
问候菲利普弗兰克森
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 编写解析器吗?
multithreading - 并行运行多个 ANTLR4 词法分析器/解析器实例
我正在使用 ANTLRv4 生成的解析器来处理具有多核机器上的大量文件。为了获得一些额外的速度,我想并行处理文件。
为了检查解析器性能是否受 CPU 限制,我将文件分成组,并使用独立进程解析它们,每个进程在专用 JVM 实例中运行相同的解析器。这大大提高了性能。
这鼓励我尝试使用多个线程而不是进程进行相同的尝试,但是没有成功。我创建了两个工作线程,每个线程都有自己的解析器、词法分析器和文件流实例。返回的结果是正确的,但是,使用两个线程实际上比使用一个线程花费的时间稍长。
为了确保我正确使用线程并且 JVM 安装没有问题,我暂时将解析代码替换为计算斐波那契序列的代码:在这种情况下,使用多个线程会提高性能。
分析这种行为,我发现当使用多个解析线程时,没有一个 CPU 达到高使用率。看起来线程正在争夺一些共享资源。
看了一下ANTLR源代码,在ParserATNSimulator.java中发现如下注释:
“同一个解析器的所有实例通过一个静态字段共享相同的决策 DFA。每个实例都有自己的 ATN 模拟器,但它们共享相同的 decisionToDFA 字段。它们还共享一个 PredictionContextCache 对象,确保所有 PredictionContext 对象在 DFA 之间共享状态。这有很大的不同。
我想知道对这些共享资源的同步访问是否会导致性能问题。如果是这样,是否有可能创建这些资源的唯一实例?或者是否有更简单的解决方案?
提前致谢!
费边
java - ANTLR 中使用监听器的 if/else 语句
我正在为一个学校项目创建一种简单的编程语言。我正在使用 ANTLR 4 从我的语法中生成词法分析器和解析器。到目前为止,我一直在使用 ANTLRs 监听器模式来应用编程语言的实际功能。
现在我想实现 if/else 语句,但我不确定在使用侦听器模式时是否可以实际实现这些语句,因为 ANTLR 决定在使用侦听器时遍历解析树的顺序,我想 if/ 的实现else 语句将需要根据语句中满足的条件在解析树中跳转。
谁能告诉我是否可以使用 ANTLR 实现 if/else 语句,或者我是否必须自己实现访问者模式?另外,任何人都可以给出一个非常简单的实现语句的例子吗?
while-loop - 使用 ANTLR 同时执行 while 和 while
早些时候我创建了这个问题,询问如何使用 ANTLR 4 创建 if/else 语句。我得到了一个很好的答案,它还展示了如何执行 while 循环。我已经用我的语言实现了这一点,现在我正在尝试使用几乎相同的原理制作一个 do-while 循环。
对于 while 循环,我的语法如下:
这就是我想要的 do-while 循环:
我已经对其进行了测试,但是它们都可以工作,但是不能同时工作。以下是我的语法(很抱歉将其全部发布,但我认为这是必要的)。
如果我的WHILE
和标记在我的和END_WHILE
标记之上,那么 while 循环有效。但是,如果我在我的 do-while 循环中切换它们。如果我将令牌更改为除了while之外的任何东西,那么两者都可以。DO_WHILE
DO_WHILE_CONDITION
DO_WHILE_CONDITION
无论如何,我可以让它们都使用当前的语法吗?我知道这可能是个问题,因为我对多件事使用相同的关键字,但我希望有办法做到这一点。
maven - 哪个antlr4-runtime?
我正在尝试在 Eclipse 中添加依赖antlr4-runtime。它显示了两个可供选择的实例。
- com.tunnelvisionlabs::antlr4-runtime (324566 b)
- org.antlr::antlr4-runtime (242694 b)
这些文件大小不同。
我应该使用哪一个?
java - Antlr 获取子代币
如果我的术语不正确,请原谅我。
假设我有一点简化的语法:
所以这当然会匹配'boy vs girl'
or'girl vs boy'
等。但我的问题是当我创建 Lexer 时,即
这会打印出类似这样的内容:9 [boy vs girl],即它与我的查询匹配得很好,但现在我希望能够执行类似的操作,获取当前令牌的子令牌。
我的直觉告诉我我需要使用树,但对于我的示例,我真的不知道如何在 Antlr4 中执行此操作。谢谢