在Antlr4中解析以注释结尾的C预处理器语句

我正在尝试为以下行创建语法规则: #define FLAG /* this is a comment */ 及 这是我目前的规则: DefineDirective : '#' Whitespace? 'define' ~[\r\n]* Newline -> channel(2) ; 但是,它也会使用注释。我需要检查行中是否包含“//”或“/*”,在这种情况下会出现中断,但我不知道如何。有人有想法吗?找到了一个可行的解决方案,所以分享它: Define

与ANTlr4的问题<;EOF>;何时<;EOF>;从自定义模式内部访问

我的语法中有几个不同的模式,并且发现如果在其中一个模式中达到,则当前文本将合并到标记中 例如,如果我通过语法传递一个格式错误的表达式,例如top hat“tails,我会得到WORD,而不是WORD中的 ctx={org.epo.presto.pql.grammar.pql$ParseContext@520}"[]" children={java.util。ArrayList@869}尺寸=2 [0]={org.epo.presto.pql.grammar.pql$ProximityExpres

Antlr4 实现一个跳转函数

我正在尝试使用ANTLR4为我的脚本语言创建一个解释器。我已经使用访问者实现了标准操作(mul、div、sub等),现在我要实现一个jump\Salta函数调用。跳转(n)函数调用在调用后忽略n行。例如: Fai var1 = 3,var2 = 4; Fai Salta(1); //my jump() function call Fai var1=4; println(var1); output: 3 这是我目前的语法: grammar TL; @members{ int salta=

Antlr4解析器不处理自定义令牌类型

我正在将语法从版本3迁移到版本4。我认识到版本4有听众和访问者,我计划使用它们,但希望能实现迁移。我想暂时把动作完整地留在语法中。 我正在使用一个自定义标记,并在语法的选项部分使用TokenLabelType指定它。但是,生成的代码使用了一个“match”方法,该方法没有升级到我的自定义标记,从而导致java编译失败。 我还注意到令牌的“start”属性也没有升级为自定义令牌类型。 我还应该做些什么来正确使用代码中的自定义标记?如果内存可用,Ter在Antlr.org网站上发布了一份设计文档,概

Antlr4 ANTLR lexer模式匹配任何文本-无关输入

我切换模式以便可以接受语法中的任何文本。这个例子不包括现实生活中的复杂情况。我改编了ANTLR书中的一个例子 Lexer parser grammar StringsParser; @header { package lexertest; } options { tokenVocab=StringsLexer; } test:quotedString+; quotedString:LQUOTE content; content:TEXT+?; lexer grammar Str

Can';用Antlr4解析COBOL源代码

我正在学习如何使用Antlr4解析COBOL源代码。目前,我正在遵循这些步骤,正如Enam Biswas在Youtube上所展示的那样 基本上,我已经下载了antlr-4.7.1-complete.jar,并将其放在C:\Javalib中。是的,我还将路径包括到我的Windows环境中,并创建了antlr.bat和grun.bat文件 对于语法文件,我使用的是取自Ulrich Wolffgang的和。同时,我使用示例源代码来了解解析是如何工作的 运行antlr.bat后,我执行了以下命令: C:

ANTLR4:未将逗号检测为unicode字符

我有一种我想解析unicode字符的语言。这些角色由%主持。 所以这个文本:%,this:a=&,或者甚至this:a,b=%,应该将“,”检测为unicode字符 它会一直这样做,直到我为a,b添加模式 下面是不带a,b的代码: grammar example; test: expr | decl; decl: (VARIABLE_DECLARATION? ID ) '=' expr ; VARIABLE_DECLARATION : 'public' | 'private

Antlr4 ANTLR-由单引号包围的数字

我想让ANTLR识别'10'(包括单引号),但它只给出 告诉我错误:在“10”处缺少“” 以下是我为测试提供的Test.g4: grammar Test; rules : number; number : QUOTE NUM QUOTE; NUM : [0-9]+; QUOTE : '\''; WS : [' '\t\r\n]+ -> skip ; 然后,驱动程序文件如下所示: public class TestStuff{ public static void main(S

Antlr4 用括号代替换行符的语法是什么?

例如,我正在尝试编写语法来解析DNS区域文件。资源记录通常由换行符分隔。但是,一条记录可以通过使用括号跨多行断开。例如: record1第1部分第2部分第3部分第4部分 或 record1第1部分(第2部分) 第三部分 第四部分 ) 我想不出如何允许括号存在于记录中的任何位置。这个如何(未经过彻底测试) 语法: grammar dns; file : (record|NL)+ EOF ; record : recordName recordPart+ (NL|EOF)

Antlr4 如何使用ANTLR访问者处理可选语法块?

这个问题以前可能有人问过,但我找不到。所以如果你们发现类似的东西,请告诉我 根据以下规则: fix_body : ident binders (annotation)? (':' term)? ':=' fix_body_term; 我有一个可选的注释和一个可选的术语。相应的visitorRule如下所示: public FixBody visitFix_body(coqParser.Fix_bodyContext ctx) 我的问题是,我如何发现,是否有一个术语 有一种通过使用ctx.t

Antlr4 区分文字\n与嵌入换行符

我正在用antlr编写的模型验证Rust解析器的手写内容。我遇到了antlr转义字符串的问题: [15:48:50]~/src/rust2/src/grammar> grun RustLexer tokens -tokens "\n" [@0,0:3='"\n"',<46>,1:0] [15:48:50]~/src/ru

Antlr4 Visual Studio 2015 C#ANTLR

为了让我的雇主相信ANTLR和StringTemplate的好处,我首先用Java构建了一个小演示。但是Java不是我们喜欢的语言之一,所以我把它翻译成了C。使用VS2015(社区版)和网上的各种说明,我只得到了目前为止。我现在明白了 自版本4.3起,ANTLR无法生成“org.ANTLR.v4.codegen.CSharp\u v4\u 5\u 2Target”代码 不兼容的版本?哪些版本的库与成功构建兼容。我不知道如何使用GitHub。似乎没有可下载的软件包,我也看不到如何下载一组要编译的文

ANTLR4规则优先级

我正在尝试使用ANTLR4获得一个简单的语法。基本上是由分隔的关键字列表可以使用Not进行否定。例如,类似这样的事情: Not negative keyword;positive 我写了以下语法: grammar input; input : clauses; keyword : NOT? WORD; clauses : keyword (SEPARATOR clauses)?; fragment N

我可以让我的ANTLR4 Lexer从输入流中丢弃一个字符吗?

我正在解析PDF流。在关于文字字符串对象的第7.3.4.2节中,说明应忽略文字字符串中未后跟行尾字符、一到三个八进制数字或其中一个字符“nrtbf()\”的反斜杠。有没有办法让我的lexer中的recover方法在这种情况下忽略反斜杠 以下是我的简化解析器: parser grammar PdfStreamParser; options { tokenVocab=PdfSteamLexer; } array: LBRACKET object* RBRACKET ; dictionary:

Antlr4匹配部队优先级

我有一个查询语法,我正在工作,并发现了一个案件,是证明难以解决。下面提供了复制语法的最低版本 grammar scratch; query : command* ; // input rule RANGE: '..'; NUMBER: ([0-9]+ | (([0-9]+)? '.' [0-9]+)); STRING: ~([ \t\r\n] | '(' | ')' | ':' | '|' | ',' | '.' )+ ; WS: [ \t\r\n]+ -> skip ; comma

antlr4:令牌未被识别为预期的

我正在尝试使用antlr4构建一个语法,它应该能够将中间解析结果存储为变量,以便以后使用。我考虑使用一个关键字,比如as(或者德语als),它将触发此存储功能。除此之外,我还有一个通用令牌ID,它将匹配任何可能的标识符。 存储能力应该是用户的选择。因此,我使用的是?在我的语法定义中 我的语法如下: grammar TokenTest; @header { package some.package.declaration; } AS : 'als' ; VALUE_ASSIGNMENT : A

ANTLR4:获取侦听器中特定规则的标记列表

我在ANTLR4中扩展了一个侦听器,我想获得与解析器中特定规则相关联的所有标记,有没有一种方法可以做到这一点 i、 e 当输入myConfiguration解析规则时,我如何告诉我的侦听器查找CONFIG和EQUALS的值 有没有我可以使用的某种for循环 for( all tokens in this rule) { System.out.println(token.getText()); } 我可以通过parser类看到标记列表,但是我找不到与当前规则关联的标记列表 我问这个问题的

ANTLR4-从左到右求值,优先级相等

解析器规则: expression : L_BRACKET expression R_BRACKET #Parenthesis | left=expression op=AND right=expression #And | left=expression op=OR right=expression #Or | left=expression op=XOR right=expression #Xor | l

antlr4语法,用于迭代解析单个InputStream中的重复内容

我有一个InputStream,其中包含如下重复块: fld1:val1 fld2:val2 [A B C D] [E F] fld1:val3 fld2:val4 [M N] [Q S T Y] fld1:val5 ... 我想构造一个解决方案,我可以解析 FLD:Val块,跳过空白行分隔符,然后解析“Listy”部分,然后停止在下一行的解析,并在同一个打开的流中重置解析器以处理下一个块。我在想,通过访问解析器并调用reset(),可以在重写baselistener类exitList

Antlr4 指定给非集合块的标签x

尝试升级antlr4时,语法中有两行代码生成错误消息: 指定给非集合块的标签tok 特别是对于如下所示的语法行: contextRadius: tok=('radius' 'change-authorize-nas-ip') (IP4_ADDRESS|IP6_ADDRESS) 'encrypted' 'key' ID 'port' INT_TOK 'event-timestamp-window' INT_TOK 'no-reverse-path-forward-check' ; 这到底

ANTLR4有ANTLR4语法吗

我知道ANTLR3有一个ANTLR3语法,在我看来,ANTLR4发行版包含了用ANTLR3编写的ANTLR4语法,但有没有用ANTLR4本身编写的ANTLR4语法?目前没有官方语法,但有一个作为ANTLRWorks 2的一部分提供。此语法肯定缺少一些官方语法中的错误报告功能,并且在行为上可能略有不同 :这是词法语法。语法使用了abstract=true选项,该选项已从正式的ANTLR版本中删除,因此语法仅适用于我的项目分支中的特殊版本 :这扩展了生成的AbstractGrammarLexer.

sql解析器上的antlr4输入不匹配错误

我在解析时遇到以下错误,但不确定为什么会发生 第1行:24不匹配的输入“1”应为NUM 第1行:24不匹配的输入“1”应为NUM 从abc限制1中选择一个 -- 语法SQLCmd 解析:sql ; sql:('select'((columns(','columns))| count)'from') 桌子 (‘where’条件((和|或)条件))*(限制);’ ; 限制:“限制”NUM ; num:num ; 计数:'计数(*)' ; 列:VAL ; 表格:VAL ; 条件:(左“=”右)+ ;

Antlr4 Lexer,重叠规则,但需要较短的匹配

我想读取一个输入流,并将输入分为两种类型:模式和单词权重,定义如下 问题产生于这样一个事实,即为单词_WEIGHT定义的所有字符对模式也是有效的。当我们有多个单词权重,且两个单词之间没有空格时,lexer将匹配模式,而不是提供多个单词权重 我需要能够处理以下情况并获得指示结果: [20] =>字的重量 cat=>模式 [狗]=>图案 这个案子,这就是问题所在。它符合模式,因为 lexer将选择两种可能性中较长的一种。注: 他们之间没有空隙 [20] [30]=>单词权重单词权重 还需要处

antlr4-如何;凌驾;流行音乐模式?

大多数情况下,LG2被用作“孤岛”语言。 但在某些情况下,我希望能够直接启动LG2模式。 我可以做到以下几点: Lexer.g4 ... TEST: 'EXEC' -> pushMode (LG2) ... mode LG2; ... END_LG2: S_SEMICOLON -> type(S_SEMICOLON), popMode; ... 问题是,在这种情况下,我不想要“;”跳回另一种语言。 简言之:如果我直接从LG2语言开始,我如何“保持”LG2语言? 有没有办法“推

ANTLR4-如何在相同的字符串值之间解析内容

我正在尝试编写一个antlr4解析器规则,它可以在一些相同的任意字符串值之间匹配内容。到目前为止,我还没有找到一种方法来做这件事 例如,在下面的输入中,我需要一个规则来提取Hello和Bye。不过我对提取xyz不感兴趣 TEXT你好TEXT TEXT1再见TEXT1 TEXT5 xyz TEXT8 由于它非常类似于XML元素语法,所以我尝试了中给出的XML解析器示例,但它解析输入,如没有错误,这不是我想要的 我也尝试过使用语义谓词,但没有多大成功 任何人都可以帮助提示如何匹配嵌入在相同字符串之间

Antlr4 如何在具有ANTLR 4的侦听器中使用语义测试?

我希望避免在解析器语法文件中使用编程,而在侦听器中使用语义检查。我能做吗?怎么做?我是否抛出异常?调用解析器的方法 多谢各位 编辑:我说莱克瑟,这是个错误。我指的是解析器。最简单的方法是使用识别器#addErrorListener(antlerrorlistener)捕获语义和其他错误——解析器扩展识别器 在解析器运行后检查捕获的错误是否存在,以决定是否/如何继续 要影响解析器处理错误的方式,请使用parser\setErrorHandler(antlErrorStrategy)。运行时包括一个

Antlr4 ANTLR有VPAT吗?

ANTLR是否有VPAT(自愿产品可访问性模板)文档?我试图从ANTLR.org网站上获取ANTLR的VPAT信息。但是,我在antlr.org网站上没有找到任何信息。ANTLR4不需要VPAT文档,因为它不是图形工具。可访问性是指(残疾人)如何访问图形应用程序(鼠标、键盘、视觉、颜色等)。然而,ANTLR4是一个命令行工具

如何解析antlr4中的可选孤岛文本

作为我的继续,我想问一下如何解析下面的文本。这次我只是想跳过尾部规则,但这是一个孤岛,对我来说并不明显。最好的,不那么刻薄的方法 a : sss a : eeee:yyyy a : a : tttt:aaa 使用以下使用词法模式的语法: SimpleL.g4 简单g4 这样做的目的是为了抓住不存在尾部规则的情况。但是,如果跳过所有的空格,下一节a:tttt:aaa将变成尾部,我无法区分这些情况。目标情况如下: (prog (entry (head a) (semi :) (tail s

Antlr4 未调用的规则会导致无效的错误消息

用下列语法 grammar Gram; exprEof : expr EOF ; expr : Uident | expr '(' Uident ')' ; Uident : [A-Z][a-z]* ; WS : [ \n\t]+ -> skip ; 如果我试图从exprEof解析输入Foo(ab),我会得到预期的错误 line 1:6 extraneous input 'B' expecting ')'

如何将antlr4的ParseTree恢复到源

我已经用antlr4构建了一个用于分析SQL的ParseTree,但是如何将ParseTree对象恢复到它的源代码中呢 例如,我分析了SQL to树: select a from (select 1 from tab); 我提取子查询并将其转换为sql,如下所示: select 1 from tab 我知道写一个函数来检索树可以将树恢复到源代码,但是我想知道ANTLR4现在是否有这个函数 谢谢

antlr4中=的含义

我有一本语法书 规则1:GO计数=十进制 规则2:名称“=”表达式 我不理解规则1和规则2中的“=”符号之间的区别。赋值是变量赋值。ANTLR4将为您生成一个名为count的成员变量,该变量在匹配时获取十进制标记,因为它是可选的,count可能为空/null 例如,您可以在侦听器代码中使用count直接获取该值,但也可以使用DECIMAL。因此,它对于语法中的动作代码或谓词非常有用。您可以使用例如$count: 仅当GO后面的值小于4时才匹配 旁注:toInteger在这里只是伪代码。使用目标

如何使用ANTLR4解析嵌套的源文件?请再试一次

我在Terrence Parr的一篇文章中找到了这段代码(如下所示),该文章展示了如何在ANTLR3 for Java中处理INCLUDE文件。我试图把这个添加到我用ANTLR4(用C++目标)使用的语法中,但是当我试图生成解析器时,我得到了错误 error(50): : syntax error: '^' came as a complete surprise to me error(50): : syntax error: mismatched input '->' expectin

带条件缺少分隔符的Antlr4表达式

我想解析Smalltalk。 通常在表达式序列中,它们之间需要一个句点(.)作为分隔符,如“;”在java中。 表达式本身不需要句点。 因此,我在表达式规则中匹配此句点: 表达式:表达式(句点表达式)* 而特定表达式的不同子规则本身并不匹配句点 但是,有一种特殊类型的表达式调用本机库: 当后面跟着另一个表达式时,周期出乎意料地不需要 这种情况如何处理 也许注射一段时间。在“primitive”规则中,告诉lexer接下来注入一个句点标记。但是怎么做呢 还是有更好的解决方案 弗兰克也许是这样的:

Antlr4 在规则定义中指定方法,以便可以识别某个字符类

当您为ANTLR编写lexer语法时,是否可以指定一个方法来决定读取字符是否应该被规则接受 例如: WS : x = . [ only accept, iff Character.isWhitespace($x.text[0])==true] -> skip 是的,使用语义谓词: WS : . {Character.isWhitespace(getText().charAt(0))}? -> skip ; 但不会很快。

Antlr4:输入不匹配

这里有一个简单的语法测试,我认为它很容易解析,但我一下子就得到了“不匹配的输入”,我不知道Antlr在寻找什么 输入: # include "something" program TEST1 { BLAH BLAH } 我的语法: grammar ProgHeader; program: header* prog EOF ; header: '#' ( include | define ) ; include: 'include' string ; define: '

Antlr4 有没有一种语言不可知的方法可以在解析器中执行简单的谓词? 目标

我想减少(或消除)解析器中特定于Java的操作和谓词。也许这是不可能的,但我想在这里问一下,以防我错过了ANTLR4的一些特性。(语言本身是第三方的,所以我无法控制它。) 简化示例 我想使用的谓词大多是精确的(或者不区分大小写)字符串匹配。我可以创建大型并行解析器规则集,但我不希望这样,因为现实生活中的示例要复杂得多 假设我得到了类似于: isWidget(int) : "Whether it is a widget" : 4 ; ownerFirstName(string) : "john"

Antlr4 输入端没有可行的替代方案'';

我知道以前有人问过这个问题,但我还没有找到解决我具体问题的办法。我将Antlr4与C#目标一起使用,我有以下lexer规则: INT : [0-9]+ ; LETTER : [a-zA-Z_]+ ; WS : [ \t\r\n\u000C]+ -> skip ; LineComment : '#' ~[\r\n]* -> skip ; 这些都是lexer规则,但是有很多解析器规

Antlr4 如何从表达式中获取值

我正在使用来自的语法,并尝试填充where子句中的列名和值。我遇到的问题是如何确定SQLiteParser.Column_nameContext和value context是否是where的一部分。当涉及到“和”时,它会变得更复杂一些 所以我想要的是在下面的sql中获得“a”/“b”(列)和“g”/“h”(值): select * from table where a = "g" and b = "h"; 您似乎对expr产品感兴趣。在这种情况下,您可以

Antlr4 如何实现lookbehind和lookahead,以便在类似标记的语法中对粗体和斜体文本范围进行词法分析?

我正在为类似标记的语法构建一个解析器,目前正在努力实现对粗体和斜体文本范围的强大支持。我想将以下粗体范围开头的正则表达式“翻译”为ANTLR4 lexer语法(该表达式取自Atom编辑器的标记语法突出显示): 但是我如何实现查找检查呢?如何检查已解析的整个字符串的开头或结尾?不要使用正则表达式创建语法分析器。这两种技术的工作方式都不同,你很容易就会走错方向。你想做大量的回顾和展望是一个错误的方向。这是典型的(复杂)正则表达式,但不是普通的解析器。相反,看看其他语法作者写了什么。有,有。你也可以先

Antlr4 将分数视为空白。这正常吗?

在我的语法中,我有一个空格: WS: (' '|'\r'|'\t'|'\n') -> skip ; 但是,如果我放置一个未加分数而不是一个空格,解析器不会阻塞 My-first-module_DEFINITIONS_::= 被认为是 My-first-module DEFINITIONS ::= 是否有一个选项我必须在lexer中设置一些 谢谢 这是简化的语法,有助于再现我所看到的内容 grammar ASN; /*--------------------- Modul

Antlr4 sqlite3.g4语法无法正确处理左连接

github sqlite3语法github.com/antlr/grammars-v4/blob/master/sqlite/sqlite.g4存在左连接问题 对于此sql select * from t1 left join t2 on t1.owner = t2.email 单词“left”被解析为表别名。从那以后,情况迅速恶化 我想我可以通过说table\u alias是any\u name除了K\u LEFT、K\u RIGHT、K\u INNER之外的任何名称来解决这个问题,但我不

antlr4可以';不要将Hello作为lexer或解析器加载

我最近不得不使用解析器来做一个项目。我下载了ANTLR4,并按照《权威ANTLR4参考》一书中描述的步骤进行操作。以下是我在命令行中键入的步骤: 1. export CLASSPATH=".:/<Mydirectory>/antlr-4.2.2-complete.jar:$CLASSPATH" 2. alias antlr4='java -jar /<My directory>/antlr-4.2.2-complete.jar' 3. alias grun='jav

Antlr4 Antlr 4:手动创建树

在将现有查询语言解析器从Antlr 2移植到Antlr 4时,我一直在“踢轮胎”。但由于Antlr 4代表着与Antlr 2和Antlr 3的重大偏差,这代表着重大风险,因为我不完全了解Antlr 4;我知道Antlr 2,Antlr 3离它很近,至少我在那里很舒服。现有的转换(最终转换为SQL)依赖于两个在Antlr4中不再可用的主要租户:树行走(树解析器)和树重写。基本上,我有一个多阶段转换,每个阶段输出一个稍微规范化/简化的树。在某种程度上,我觉得其中一些仍然是需要的。也许这只是因为我不熟

如何使用ANTLR4构建AST?

我有一个ANTLR3语法,它构建了一个抽象语法树。我正在考虑升级到ANTLR4。然而,ANTLR4似乎只构建解析树,而不是抽象语法树。例如,output=AST选项不再被识别。此外,“最终ANTLR4参考”文本中既没有“AST”也没有“抽象语法” 我想知道我是否遗漏了什么 我的应用程序目前知道如何爬过ANTLR3生成的AST。将其更改为处理解析树并不是不可能的,但需要做一些工作。在我开始这条路之前,我想确定这是必要的。ANTLR 4基于语法生成解析树,而不是基于任意AST运算符和/或重写规则生成

如何描述在ANTLR4 lexer规则下包含范围计数字符的字符串?

航班号有一条规则(例如:CZ3102),它有2个字符,后跟3-4个数字。 其正则表达式应为: [A-Z]{2}[0-9]{3,4} 那么如何在ANTLR4下编写lexer规则呢 一个简单的lexer规则是: [A-Z][A-Z][0-9][0-9][0-9][0-9][0-9] 但这并不优雅,如果范围很大,比如1-255,那么lexer规则就不那么容易了 谢谢 但这并不优雅,如果范围很大,比如1-255,那么lexer规则就不那么容易了 只标记数字,并在解析器侦听器或访问者中验证数值 相关链接:

上一页   1   2   3    4   5   6  ... 下一页 最后一页 共 15 页