ANTLR4词法分析器无法按语法顺序解决歧义

使用ANTLR 4.2,我尝试对该测试数据进行非常简单的解析: RRV0#ABC 使用最小语法: grammar Tiny; thing : RRV N HASH ID ; RRV : 'RRV' ; N : [0-9]+ ; HASH : '#' ; ID : [a-zA-Z0-9]+ ; WS : [\t\r\n]+ -> skip ; // match 1-or-more whitespace but discard 我预计lexer RRV将在ID之前匹配,基于以下Tere

Antlr4 如何共享不同令牌的值-输入不匹配';命令1';预期函数名为“2”-

我的语法如下(简化以显示问题): 解析以下字符串可以很好地工作: TYPE1 ("abc") { COMMAND1(0) } TYPE2 ("abc") { COMMAND2(0) } 但是,解析以下字符串会导致错误 TYPE2 ("abc") { COMMAND1(0) } 我得到“不匹配的输入'COMMAND1'应为FUNCTIONNAME2” 我如何才能让这个场景工作?也就是说,两个代码块可以包含相同的函数名?基本问题是lexer将始终将“COMMAND1”分配给令牌函数名1,因为该规

Antlr4 ANTLR:简单语法的输入不匹配

我有这样的语法来生成解析器: grammar MyLang; init: TERMINAL; TERMINAL: '"' ~('"')* '"'; 使用ANTLR4和上面的语法来解析像“data”这样的简单输入,我得到了一个错误: mismatched input "data" expecting TERMINAL 我已经读过很多关于这个错误的问题。但我不知道怎么解决它。如果有什么问题,请告诉我好吗?您使用的是哪种antlr4版本?我用antlr 4.4尝试了你的语法,它是有效的。你可能

Antlr4 如何使用ANTLRv4解析一些C语言块注释(格式良好)

我需要使用下面的格式化块注释来搜索C源代码。 我想提取这些文件:“abcd”、“filedname1”、“attr1”、“attr2”、“filedname2”、“attr1”、“attr2” 我已经编写了一个如下所示的gramma文件,但是它的“BlockComment”无法获得正常的块注释,我仍然不确定gramma文件是否正确? 任何人都可以帮助我,谢谢 /* *| abcd { *| .filename1 *| { *| :attr1= define; *| :attr2=

Antlr4 要分析相同的结构吗

我想让ANTLR4解析以下内容: FSM name type String state type State Relation name type String 我用的是这个语法: grammar Generator; classToGenerate: name=Name NL (attributes NL)+ classToGenerate| EOF; attributes: attribute=Name WS 'type' WS type=Name; Name:

我需要用antlr4中的4位数字来解析一个数字

我刚开始使用antlr4,我只想写一个语法,可以解析一个数字序列,但一次只能选择4个数字 例如,我有一个号码1234567891234567 然后我希望它将前4个数字解析为1个标记,下一个解析为另一个,下一个解析为另一个,这样我就得到了4个不同的4个数字标记 token1 = 1234, token2 = 5678, token3 = 9123, token4 = 4567, 谁能帮我写一个语法吗 grammar TEST; /* * Parser Rules

Antlr4 该类型生成一个字符串,该字符串需要超过65535字节才能在常量池中以Utf8格式编码

我正在用一个在antlr3中工作的语法来尝试antlr4。完成了所需的2个语法更改,现在我有了生成lexer和parser的工具 但是,lexer有一个编译错误: 1) 该类型生成的字符串需要超过65535个字节才能执行 在常量池中以Utf8格式编码 该错误在Eclipse中的类名上显示,因此不确定它所指的是哪个字符串,但我怀疑是这个很长的字符串: public static final String _serializedATN = "\1\2\u01c5\u1741\

Antlr4 语法中后缀和前缀子规则的不同结果

我有一个ANTLR4语法,它有一些规则试图匹配语言中表达式的部分应用。将其简化,规则如下所示: grammar PartialExpression; program : (function '.')+ ; function : name '=>' expression (';' expression)* ; name : SYMBOL ; expression : functionCall | cl

Antlr4失败的语义谓词应导致选择另一个替代项

我需要在它们的大列表中禁用一些替代项,以用于一些具体的上下文。 我决定通过语义谓词来实现这一点,但面临着奇怪的行为。看起来我做错了,但我不明白为什么 下面是一个最大限度简化的语法,它应该允许我展示正在发生的事情 输入文本是101,我希望它被解析为(规则1 0 1)。由于谓词失败,我希望antlr为rule1选择第二个选项,它与输入序列完全匹配 但是Antlr在输入“0”处抛出一个异常行1:1 no-available alternative,并生成这样的解析树:(rule1 1(rule2 0

“ANTLR4错误”;调用org.antlr.v4.gui.TestRig.main时出现问题;

您好,我在尝试本教程的简单示例时遇到此错误: “格伦你好-r树 警告:TestRig已移动到org.antlr.v4.gui.TestRig;自动调用 调用org.antlr.v4.gui.TestRig.main(args)时出现问题 " 我搞不懂发生了什么事。 您能帮我一下吗。听起来您已经设置好了要使用的“grun”别名: org.antlrv4.runtime.misc.TestRig //and from antlr4 onwards they deprecated that and

如何在antlr4中编写上下文无关语法方面的操作优先级

我们知道逻辑操作的优先级从强到低: 不 及 或 我想在语法中加入逻辑运算,以尊重逻辑运算的优先性。。。 我的语法是: expression : factor ( PLUS factor | MINUS factor )* ; factor : term ( MULT term | DIV term )* ; term : NUMBER | ID | PAR_OPEN expression PAR_CLOSE ; 使用ANTLR3和ANTLR 4,您可以执行如下操作: expressi

ANTLR4:处于Lexer模式时,Lexer返回单个令牌

我正在尝试使用具有以下词法语法的ANTLR4的词法器模式: STRING: '"' -> pushMode(STRING_MODE); mode STRING_MODE; STRING_CONTENTS: ~('"'|'\n'|'\r')+ -> type(STRING); END_STRING: '"' -> type(STRING), popMode; STRING_UNMATCHED: . -> type(UNMATCHED); 是否有方法为模式中捕获的所有字符

Antlr4 bug还是特性?在标记的规则上输入侦听器的方法

在与解析侦听器玩了一会儿之后,我发现了一种出乎意料的行为。 我的问题是,我的期望是错误的,这种行为是需要的还是一种缺陷?如果需要这种行为,请解释 下面是示例语法: grammar Labeled; file: stmt; stmt: stmt '+' stmt # Add | stmt '*' stmt # Mult | FLOAT # Value | INTEGER # Value ; FLOAT: '-'? DIGIT* '.

ANTLR4:正确匹配公共前缀

我有以下ANTLR4语法: grammar test; start_symbol: '(FILE' line* ')' EOF ; line: '(' ID ')' ; ID: [a-zA-Z_] [a-zA-Z0-9_]* ; White_space : [ \t\n\r]+ -> skip ; 。。。它在这个示例输入文件上非常有效: (FILE (LINE) ) 但我也希望它能在以下方面发挥作用: (FILE (FILELINE) ) 这是行不通的。显然,lexer生成

更改ANTLR4 lexer中的令牌值

我正在尝试解析ANTLR4中的一种语言,就标识符而言,它是不区分大小写的。如果可能的话,我想把它推到lexer上,比如: 标识:[a-zA-Z]+{/*设置令牌=token.toUpper*/} 除了我在文档中找不到任何允许我在lexer操作中更改令牌值的内容,并且查看生成的代码,看起来lexer操作中没有任何公开的内容允许这样做 我是否遗漏了一些内容,或者我需要在应用程序代码中处理这些内容?您可以这样做: IDENT : [a-zA-Z]+ { setText(getText().toUppe

单空格Antlr4语法无关输入

我对语法中的空格有意见 下面是一个仍然存在问题的最小语法: sourceUnit : ( foo ) EOF ; foo : (Identifier ':' Identifier) ; StringLiteral : '"' DoubleQuotedStringCharacter* '"' ; DoubleQuotedStringCharacter : ~["\r\n\\] | ('\\') ; // The problem is in here somewher

显示任意解析树的ANTLR4API

当前ANTLR4的TestRig工具支持-gui选项来解析整个输入文件并以图形方式显示整个结果解析树。我们是否可以首先获取解析树,修改它并调用一些API以图形方式显示解析树的子集/子树 我的输入源文件很大,无法查看TestRig显示的标准解析树。更重要的是,我想过滤掉很多不相关的语法,集中精力验证我需要测试的语法。但是很难从TestRig提供的标准大型解析树中找到一小段信息。您可以调用解析树中的任何非终端来查看该子集。此外,ANTLR的下一个版本在树GUI上包含一个Save to PNG按钮,该

如何在ANTLR4中修改解析树?

我使用ANTLR4编写Fortran解析。现在我得到了解析树(ANTLR4中没有AST)。我的下一步工作是根据需要修改解析树,例如插入新的数据声明语句和替换当前语句。我在ANTLR java API文档中查找了addChild,但在RuleNode中似乎没有这样的方法。那么我该怎么办呢?一种方法是将代码嵌入语法文件中。这让事情变得一团糟 另一种方法是在单独的文件中编写类,在规则的@parser::members{…}部分或操作部分中创建所需的对象,并使用它们从语法中获取详细信息。这样,您将从语法

Antlr4 匹配[STRING]或[STRING]

我正在尝试匹配Antlr4中的以下行: 约翰或苹果和约翰·史密斯或苹果酱 我使用以下规则: conjunction : WORDS OR WORDS ; WORDS: [A-Za-z ]+ ; OR: ' or ' ; 但是antlr找到的第一个单词也包括'or'。因此,它并不认为约翰和苹果是由或分隔的两个不同的词 如何解决此问题?如果2个或多个lexer规则匹配相同数量的字符,则规则define first将获胜。换句话说,对于输入的或,可以匹配规则单词和或。既然单词是首先定义的,它就赢了

如何获得有关antlr4 maven插件的帮助

antlr4 maven插件似乎不是antlr4网站上的文档。Antl4 maven插件有一个帮助目标,可以使用maven执行,如下所示: mvn antlr4:help -Ddetail=true 那可能会让你一无所获,就像我一样。试试这个: mvn org.antlr:antlr4-maven-plugin:help -Ddetail=true 产生: [INFO] Scanning for projects... [INFO]

ANTLR4 lexer规则不';I don’我没有按预期工作

我想写一个关于月份和年份的lexer规则,规则是(带正则表达式): “hello”和“ever”文本仅用于调试 也就是说,一个或两个数字表示月份,两个或四个数字表示年份。更重要的是,今年的部分可能会被忽略 例如: 2015年8月->hello08ever2015或hello8ever2015或hello8ever15或hello8ever或hello08ever; 2015年10月->hello10ever2015或hello10ever15或hello10ever15 我的lexer规则如下(

为什么ANTLR4C语法分析器规则是;“类型说明符”;“不使用lexer规则”;“双”字;?

我用这个词作为我自己语法的灵感。我想到了一件我不太明白的事。为什么不使用数据类型时会有Lexer规则?例如规则Double:'Double'从未被使用,但解析器规则类型说明符:('double'|…)(其他数据类型已删除以简化)用于多个位置。解析器规则类型说明符没有使用lexer规则Double有什么原因吗?该页面上的所有语法都是自愿提交的,不是ANTLR4的一部分。这显然是一个错误,但按照lexer规则的匹配方式,它不会对lexer产生影响。您可以选择实现显式规则: Double : 'dou

Antlr4 getParent当前上下文

我有这样一段语法片段 expr: left=expr '=' right=expr #exprassign | atom #expratom ; atom: TEXT | ID ; TEXT: '\''(.)*?'\''; ID:[A-Z]+; 用我的访客方法 visitExprAtom() 如何找到当前的getparent上下文。假设我的方法在左边起作用,从左边说,从右边说 我需要改变我的方法,当我知道它是从左还是从右 谢谢 编辑: 假设我有一个代

Antlr4 使用二进制运算符分析不匹配的输入

我正在尝试解析ANTLR中的现有语言,该语言目前正在使用Ruby库Parslet进行解析 这是我语法的精简版本: grammar FilterMin; filter : condition_set; condition_set: condition_set_type (property_condition)?; condition_set_type: '=' | '^='; property_condition: property_lhs CONDITION_SEPARATOR propert

antlr4:如何从解析器规则中的令牌集中最多选择一个令牌

我正在为一种语言创建一个antlr4语法,该语言具有多种变量声明前缀的可能性,例如,变量声明可以是以下任意一种: IDENTIFIER PREFIX1 IDENTIFIER PREFIX2 IDENTIFIER PREFIX1 PREFIX2 IDENTIFIER PREFIX2 PREFIX1 IDENTIFIER 前缀是可选的,可以按任何顺序排列,但最多一个 如果我有一个规则: var_declaration: (PREFIX1 | PREFIX2)? IDENTIFIER; 然后它将不

Antlr4 如何为ANTLR创建文档?

我正在通过ANTLR创建一种语言,我想发布给用户使用 有没有工具可以为我的语言创建自动化或半自动化文档 我想做一个像这样的文档 最后,我就像巴特和迈克说的那样,没有这样的工具可以帮助创建简单的文档。我从未见过这样的东西/工具。像巴特一样,我不知道有任何工具可以生成接近完整文档的内容(可能是因为,你需要的不仅仅是语法方面的信息),但是看看VS代码ANTLR插件。它可以生成记录所有规则的“铁路图”,我怀疑它们是你文档中的一个很好的补充。

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

我有以下语法 grammar Expr; prog: expr; expr: LP expr RP | expr LP expr RP | LP expr RP expr | expr '*' '{' ',' expr | expr op=NOT expr | expr op=AND expr | expr op=OR expr | ID ; NEWLINE:'\r'? '\n' ; NOT: '~'; AND: '&'; OR: '|'; LP : '(';

数据跳过注释&引用;在使用ANTLR4为R6RS创建解析器时

我正试图为R6RS编写lexer/parser,但我被数据跳过注释所困扰 以下是我的lexer/parser规则的一部分: BOOLEAN: '#t' | '#f' | '#T' | '#F'; NUMBER: DIGIT+; // TODO: incomplete CHAR: '#\\' CHARNAME | '#\\x' HEXDIGIT+ | '#\\' . ; STRING: '"' STRELEMENT* '"'; IDENTIFIER: INITIAL SUBSEQUENT* | P

Antlr4 简单C表达式的大型解析树

我在这里使用C语法:解析表达式inta2=5。ANTLR版本是4.3 这里的“5”匹配一个非常大的规则链:initializer->assignmentExpression->conditionalExpression->logicalOrExpression->logicalAndExpression->。。。大约还有10个->primaryExpression->5个 虽然解析最终是正确的,但这似乎是语法中的一个错误。有人能建议修复或澄清吗 不,这不是错误。树越低意味着操作符的优先级越高 编

ANTLR4:getFirstChildWithType与ParseTree

我一直在玩ANTLR4,试图转换一个ANTLR3项目 我已经从来自官方存储库的ANLTR4语法生成了一个lexer、一个解析器和一个visitor类。在visitor中,我使用visitor提供的ctx调用我的一个类: myFunction(ctx.getChild(0)) 然后,在myFunction中,我想检索具有特定类型的第一个子项,因此我尝试执行以下操作: final ParseTree classNameElement = (ParseTree) ((Gram

Antlr4 为什么lexer规则名称单词导致解析错误

在下面的lexer解析器中, 从选项卡中选择AAA 可以分析,但 从选项卡中选择角色 无法分析,出现错误。 第1:7行输入“角色”不匹配,需要ID “角色”与lexer规则的名称相同这一事实似乎是导致错误的原因。 但是,我想将“角色”与 ID:[A-Z]+ 不想得到一个错误。 有没有办法解决这个问题 lexer grammar TSqlLexer; FROM: 'FROM' ; ROLE: 'ROLE' ; SELECT:

ANTLR4:输入不匹配

我想匹配表单的输入:: commit a1b2c3 Author: Michael <michael@test.com> commit d3g4 Author: David <david@test.com> 提交a1b2c3 作者:迈克尔 提交d3g4 作者:大卫 以下是我写的语法: grammar commit; file : commitinfo+; commitinfo : commitdesc authordesc; commitdesc : 'com

Antlr4 为什么将令牌分配给通道时出错?

我的.g4文件中有以下代码 @lexer::members{ public static final int WHITESPACE = 1; public static final int COMMENTS = 2; } WS : (' '|'\t'|'\f')+ -> channel(WHITESPACE) ; COMMENT : '//' ~('\n'|'\r')* -> channel(COMMENTS) ; LINE_COMMENT

如何在ANTLR4中终止Lexer

有没有一种简单的方法来终止lexer 有些代币我还不想处理。但是,如果输入中确实包含这些令牌,我还希望Lexer发出警报。我的简单策略是在操作中抛出RuntimeException: CHARIZING: '#@' {throw new RuntimeException("charizing op not supported yet");}; 但是该操作会产生编译错误,因为生成的Lexer在该操作之后有一个break命令,Java编译器会抱怨break是一个无法访问的语句 CPPDefine

Antlr4 ANTLR 4 Lexer规则:如何忽略零件?

以下是先前ANTLR版本的相关主题: 使用lexer规则,如: R1 : [a-zA-Z0-9]* ';' ; 例如,我有以下输入文本: test;rezrezr zrezrzerz 它将匹配测试;这是正确的。我只需要测试字符串 我需要照顾'吗例如,在自定义侦听器中手动输入字符?或者有没有一种方法可以在语法中指定我只想使用lexer规则来避免它 更新 如果你想避免这种情况;字符,只需将其从lexer规则中删除即可。注意,我还将*改为a+,以确保R1永远不是零长度令牌 R1 : [a-zA

Antlr4 在ANTLR v4中构建自定义解析树

问:在Antlrv4中,有没有一种(更直接的)在解析时构建自定义解析树的方法 我想我们可以遍历并重写自动构建的树,但我想知道我们是否仍然可以在解析时手动构建树(或者调整树)(类似于ANTLR v3和ealier)。这个想法是,根据编写语法的方式,我们在ANTLR构建的树中得到了很多无用的节点,虽然我知道您只能覆盖您感兴趣的侦听器方法,但仍然需要检查和跳过无用的令牌类型,等等。否,我们对Antlr3的经验是,手动AST特性不可避免地导致代码更难维护和理解,从而导致开发人员在对语法进行任何更改时出现

Antlr4 ANTLR 4如何解析注释

我正在解析一种类似SQL的语言,解析注释时遇到问题。 我们的想法是忽略它们 我有以下规则: NEWLINE: '\r'? '\n' -> skip WS : [ \t]+ -> skip 我怎么能忽略: 介于“--”或“#”和下一个“\n”之间的所有内容 “/”和“/”之间的所有内容(斜杠+星号直到星号+斜杠-星号不知怎么消失) 在WS和NEWLINW之前,我尝试过类似的方法: COMMENT1 : ('--'|'#') ~'\n'* -> skip; 没有

将AST动作翻译重写为ANTLR4

我有一个用antlr2语法编写的语法文件,需要帮助理解如何用antlr4语法重写一些解析器规则。我知道antlr4消除了构建AST的需要,因此我不确定如何处理AST操作翻译的规则。解释了一些语法以及如何使用#构造,但我仍然不确定如何阅读这些规则并重新编写它们 temp_root : temp { #temp_root = #([ROOT, "root"], #temp_root); } EOF; temp : c:temp_content { #temp

使用PDDL语言的默认ANTLR4语法分析错误

我对ANTLR比较陌生,所以请容忍我 我试图解析一个有效的PDDL文件,但它似乎有某种我找不到的错误 line 3:13 mismatched input 'at' expecting NAME line 8:18 mismatched input 'at' expecting NAME line 8:25 mismatched input '?a' expecting {'(', NAME, NUMBER} 再现错误的最小输入: (define (domain foo) (:types ca

Antlr4 ANTLR似乎混淆了规则

要复制的最小语法: grammar GeneralSearchQuery; id : ID; ID : ('A'[A-Z0-9]+); anystring: ANYSTRING; ANYSTRING: ~[ \t\r\n"\\'():^]+; 问题在于“anystring”规则。如果我删除任何id/id规则,那么奇怪的解析就会消失 其目的是匹配除某些有意义的字符外的任何字符(unicode、非unicode) 据我所知,它是这样分解的: ~ Negate the follow

ANTLR4空格问题,将数字与字母分开

我有一个语法,它应该区分ID、INT和IP地址。我的语法有更多的模式需要识别,但我正在努力解决的是像“123abc”这样的标记 通常语法会定义WS:[\t\r\n]+->skip;它会忽略空格,所以在我的语法输入中,像'123abc'会变成'123'和'abc'。这是lexer的正确行为。但是,我希望在这种情况下解析失败 我在SO和其他一些网站上也看到过类似的问题。我提出了一个可行的解决方案(如下),但在我看来,应该有更好的办法。我想知道是否有人能提出这样的建议 以下是我的(简化)工作语法: g

为什么结尾括号在我的antlr4语法中无效?

我正在用ANTLR4编写一个DSL,现在我有一个右括号结尾的问题。为什么这个命令无效 这是命令: set(buffer,variableX|"foo"); 包含错误的解析树 这是我的语法 grammar Expr; prog: expr+ EOF; expr: statement #StatementExpr

ANTLR4中的标记类型和词汇是什么?

我在网上找不到任何能很好地描述这一点的好资源。“令牌类型”是指我们在编程语言中遇到的类型,如int、string、char等吗。?我知道它是一个整数,但这个整数是什么意思?什么是词汇表?寻找一些简单的最低语法解释。标记类型和词汇的概念非常简单,可能没有人想过正式描述它们。但这是: 在词法转换过程中,词法转换程序将数字分配给部分输入文本。这意味着在输入中的特定模式和任意数字之间创建映射。此号码称为令牌类型 语法中的lexer规则描述必须匹配的模式,lexer规则名称是根据匹配的输入创建的令牌的文本

如何手动重写Antlr4解析树?

我正在开发一个简单的Xquery处理器,并使用Antlr4解析语法。我使用访问者模式遍历解析树。现在,如果查询满足某些条件,我想重写一个查询。如果查询直接使用诸如“join”之类的关键字并符合“join”语法,处理器现在可以处理查询 如果查询可以更改为联接查询,我想首先重写解析树,否则什么也不做。有没有办法手动操作解析树?比如添加一个规则上下文或者构造一个新的解析树 对于Antlr4,惯用的方法是用分析产品装饰树节点,而不是改变树结构。也就是说,可以使用一个或多个树漫游来识别和标记可以合并为联接

由于歧义导致antlr4词法分析器/解析器冲突

我试图解析MS的SQL方言。根据规范,“top”的表达式必须用括号括起来 选择顶部(@rows*2)a、b、c从 但作为例外,如果值是无符号文字整数,则可以忽略这些值,因此 从以下位置选择前75名 我尝试在解析器中嵌入这个文本整数特例(松散地): top_子句:'top'[0-9]+|'top'('expression') 因此,第一种选择是纯词法规则,第二种选择是解析器规则。因为整型常量是一个有效的表达式,所以它选择将其解析为表达式 问题是,1)我可以强制它作为没有谓词的lexer规则进行匹配

为什么ANTLR4需要花费很长时间来为String类构建解析树

我正在尝试使用以下标准ANTLR设置代码块为Java的String类构建解析树。我使用的是antlr4存储库上发布的标准Java8.g4语法(完整代码可在上获得) 输出为: Building the parse tree... Built the parse tree...(took 21 seconds) 我试着跑了好几次,我发现这需要20多秒。 花这么长时间是正常的吗?我的设置是否有问题?有没有办法加快解析树的构建速度 要观察计算机上的问题,请执行以下命令: git clone https

Antlr4 控制前瞻深度或将令牌源与令牌消耗同步

我正在将SystemVerilog语法从ANTLR2.7.7移植到ANTLR4.7 SystemVerilog从Verilog继承了大量指令。它们几乎可以出现在源代码的任何地方。因此,它们不能由 解析器。有些是由lexer解释的,永远不会深入(控制源代码加密),有些是用于预处理器(宏、条件编译等),但也有一些超出了该阶段。这些需要解析器和处理它们的直接令牌源之间的双向通信。当解析器遇到可能受这些指令影响的构造时(当访问者用于操作时,解析器需要请求这些信息以将其作为上下文的一部分记住),解析器会询

使递归antlr4规则贪婪

我想要一个语法,其中过滤器可以是操作或由|连接的任意数量的过滤器。我的语法是这样的: filter : filter ('|' filter)+ #pipedFilter | OPERATION #operation ; OPERATION : [a-z]+ ; (这是一个简化的示例,将有其他方法对过滤器进行分组,这些方法的优先级与管道不同) 在类似于xxx | yyy的输入中,这工作正常,我们得到: FILTER: [ OPERATION

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