ANTLRWorks标准树

在ANTLRWorks中调试语法时,ANTLRWorks构建了一个漂亮的树,在规则中没有任何“^”和“!”运算符。不向语法源添加“^”、“!”运算符就可以访问此树吗?因为您没有定义^和运算符(或重写规则),必须指解析树(而不是AST)。但是,答案是:不,那是不可能的。它们是在AntlWorks内部创建的,没有(公共)API来访问此结构

Antlr 为什么我的输入不匹配'=';在我的antl4语法中

我试图建立一个语法,但我陷入了这个错误,看不出我错在哪里了 如果我输入以下短语: if(hello = "test", 1, 0) 在antlr4测试装备中,我得到*“不匹配的输入”=“期望比较”*。我做错了什么 这是我的全部语法: prog: (expr|stats); val_expr: (rename|rex); cond_expr: (match|xif|compare_op); expr: (val_expr|cond_expr|var|math_expr|eval); rename

ANTLR4:尝试查找匹配的解析器子规则时出错

我有这样一个解析器规则,我需要知道哪个子规则匹配: dt returns [DT v] : (d1=date t1=time?|t2=time d2=date?) {if ($d1 == null) // right side matched ... } ; 我收到一条ANTLR4错误消息:“缺少对“$d1”中规则引用“d1”的属性访问 我可以通过放置例如$d1.v来消除此错误,但在运行时,我会在 if (((DtrContext)_localctx).

Antlr4语法不贪婪不会停止匹配

我有这样的语法: grammar Test; startnode : BEGIN PART_A ( dont_care | care )* END PART_A EOF ; dont_care : BEGIN I_DONT_CARE .*? END I_DONT_CARE ; care : BEGIN CARE VALUE STRING END CARE ; BEGIN : '/b

ANTLR v3:缺少方法JavaParser.javaSource()和类JavaParser.javaSource\u返回

使用语法为Java.g(例如)的antlr-3.5.1-complete.jar中的org.antlr.Tool执行时,不会生成方法JavaParser.javaSource()和类JavaParser.javaSource_返回,但会在中生成。为什么?这两篇文章没有使用相同的Java.g文件。对于您引用的文件,入口点是规则compilationUnit,它生成JavaParser.compilationUnit()和JavaParser.compilationUnit\u return中不再提

Antlr 从ParserRuleContext检索令牌列表 主要问题

有没有一种简单的方法可以从解析器规则类ParserRuleContext获取令牌列表(理想情况下是以TokenStream的形式) 相关答案 在对一个问题的回答中,出现了这种解决方案: ParserRuleContext pctx=ctx.getParent(); 列表节点=pctx.getTokens(pctx.getStart(),pctx.getStop()); 但是在ANTLRv4中没有签名为parseruleContext::getTokens(令牌,令牌)的方法 我的解决方案 我考

Antlr 如何将属性添加到TerminalNode

我正在研究一个antlr语法,它有一个类似于operation:REGISTER'='operation-TYPE-OPERATOR','OPERATOR的规则。类型是这样定义的type:'int'NUMBER'*'?。 现在我已经创建了一个基本的访问者,它覆盖了visitoOperation,并且一切正常 在这一点上,我希望能够识别类型是否是指针,这取决于*的存在。我尝试使用局部变量、@parser和@lexer,但它们都不允许我做一些事情ctx->TYPE()->isPointer()。我注

如何在ANTLR中启用orExpression和andExpression规则的组合?

我想用antlr4解析以下内容 isSet(foo) or isSet(bar) and isSet(test) 事实上,我可以在解析树中看到,只有第一个or被识别,我可以添加多个or,解析树会增长,但是一个额外的or不会被识别。我如何在语法中定义它 这是我当前的语法文件: grammar Expr; prog: (stat)+; stat: (command | orExpression | andExpression | n

CIL ANTLR语法?

是否有任何.NET CIL(也称为MSIL)ANTLR语法?根据,Microsoft在Microsoft Visual Studio安装文件asmparse.grammar中提供了MSIL语法。如果您没有MSV,语法也会在出版物中列出(参见第79页) 如果我没有弄错的话,语法可以被复制并粘贴到ANTLR语法文件中(即,它是一个语法,而不是一个语法)。如果您不熟悉两者之间的区别,请看一看。From-by-Pascal Lacroix

简单语法上的ANTLR不匹配TokenException

首先,我对ANTLR和EBNF语法一无所知,所以这可能是一个我根本不理解的基本问题 我有一个规则,例如: version_line : WS? 'VERS' WS? '=' WS? '1.0' WS? EOL ; WS : ' '+ ; EOL : '\r' | '\n' | '\r\n' | '\n\r' ; 与输入文件中的语句相匹配,如下所示(带可选空格): 使用上面的规则表单,我获得了一个成功的匹配,尽管我得到了此表单的一个例外: version_line : WS? 'VERS' WS

Antlr-对象引用未设置为对象的实例

有人知道Antlr是如何工作的吗?我在开发服务器上遇到一个错误: [NullReferenceException:对象引用未设置为对象的实例。] Antlr.StringTemplate.CommonGroupLoader.LocateFile(字符串文件名)+19 Antlr.StringTemplate.CommonGroupLoader.LoadGroup(字符串组名,StringTemplateGroup超组,类型lexer)+67 同样的代码在本地运行良好,我可以在dev服务器的bin

ANTLR-调试时未找到测试类错误

我得到了测试类not found错误的错误,即使我已经通过命令完成了它 java org.antlr.Tool something.g 当通过AntlWorks进行调试时。我一直在网上搜索,但没有成功。你知道怎么解决我的问题吗 谢谢 编辑-语法: grammar Expr; prog : stat+ ; stat : expr NEWLINE | ID '=' expr NEWLINE | NEWLINE ; expr :

ANTLR解析器,需要匹配哪个解析器规则

在ANTLR中,对于给定的令牌,有没有一种方法可以判断匹配了哪个解析器规则 例如,根据ANTLR语法: tokens { ADD='Add'; SUB='Sub'; } fragment ANYDIGIT : '0'..'9'; fragment UCASECHAR : 'A'..'Z'; fragment LCASECHAR : 'a'..'z'; fragment DATEPART : ('0'..'1') (ANYDIGIT) '

Antlr 不匹配双令牌

在ANTLR中,我有一个不匹配的TokenException,定义如下: type : IDENTIFIER ('<' (type (',' type)*) '>')?; 其中明确指示ANTLR单独处理每个标记 我怎样才能解决这个问题呢?我无法重现这个问题。由以下程序生成的解析器: grammar T; type : IDENTIFIER ('<' (type (',' type)*) '>')?; IDENTIFIER : 'A'..'Z'; 语法T;

Antlr 是";解析器规则中的隐式令牌定义;有什么好担心的吗?

我正在用ANTLR和AntlrWorks2创建我的第一个语法。我基本上已经完成了语法本身(它识别用所描述的语言编写的代码,并构建正确的解析树),但除此之外,我还没有开始任何工作 让我担心的是,语法分析器规则中第一次出现的标记都会用黄色的波浪线划线,表示“语法分析器规则中的隐式标记定义” 例如,在该规则中,'var'具有波形: variableDeclaration: 'var' IDENTIFIER ('=' expression)?; 它的确切外观: 奇怪的是,ANTLR本身似乎并不在意这

ANTLR4解析错误:输入时没有可行的替代方案

我的语法显然是错误的,因为解析一个简单的文件会产生奇怪的错误消息 在不改变错误的情况下,我尽可能简化了以下语法(如果删除'this',AntlWorks的树gui输出会对示例文件的标记int进行不同的着色,尽管结构似乎相同) 演示代码: void main() { a = c; int b; } ANTLRWorks 2向我提供以下错误消息: line 3:8 no viable alternative at input 'intb' line 3:9 mismatched i

Antlr 带括号和空格的Antl语法

我正在使用AntlWords 2.1为AntlrV4创建语法。无论出于何种原因,都不承认这种现象。我找了很多,但找不到原因。你能找到错误吗 grammar bracketsGrammar; OPENINGBRACKET : '['; CLOSINGBRACKET : ']'; lParanthesis : OPENINGBRACKET ; rParanthesis : CLOSINGBRACKET ; WS : ' ' ->skip; WORD : ~[ "]+ ; parenth

优先匹配ANTLR4中的较短标记

我目前正在尝试使用ANTLR4编写解析器。我目前的方法是将每个有效的单元和前缀定义为令牌 这里是定义的令牌的一个非常小的子集。我可以做一个简化版的语法作为例子,但似乎没有必要解决这个问题(或者指出我的做法完全错误) 标准测试用例之一是mosm,lexer应该从中生成令牌流MILLI\u或\u-meter-OSMOLE。不幸的是,由于ANTLR优先匹配较长的令牌,因此它会生成令牌流月秒毫秒或米,然后导致解析器引发错误 有没有可能让ANTLR4 lexer首先尝试使用较短的标记进行匹配?向MONTH

ANTLR在输入查询时没有可行的替代方案

我正在为一种小型语言设计一个解析器,语法如下: grammar Test; r : specification+; specification : MODULE module_def EOF; module_def : ID EQ classExp; classExp : basicClassExp | altClassExp ; basicClassExp : CLASS (classCode)* END; altClassExp : ALTC

ANTLR识别单个字符

我很确定这是不可能的,但我想问问以防万一 我有公共ID令牌定义: ID: LETTER (LETTER | DIG)*; 问题是,在我需要解析的语法中,有一些指令使用单个字符作为操作数,如: a + 4 但是 这是不可能的 所以我不能写这样的规则: sum: (INT | LETTER) ('+' (INT | LETTER))* 因为由于ID的优先级较高,LeXER会考虑“A”作为ID(并且我不能改变优先级,因为它不能识别单个字符ID),所以 所以在那个规则中我只能用ID代替字母。这很难

Antlr 什么';在xtext中同时使用int和字符串编写规则的正确方法是什么?

我正在定义一个Xtext语法规则来解析一个简单的时间戳,比如YYYY-MM-DDTHH-MM-SS,但是,当我发送类似于2019-01-01T08:12:14的内容时,解析器不会解析,但当我发送2019-01-01 t 08:12:14时,它会解析 我已经尝试去除规则定义标记之间的所有空白,但没有帮助(而且可能不应该有帮助) 规则是: Timestamp : year=INT '-' month=INT '-' day=INT 'T' hour=INT ':' minut

Antlr 如何在一个规则中指定多个lexer规则?

我有以下解析器规则: declaration : (KW_VARIABLE DT_IDENTIFIER) | (KW_VARIABLE DT_IDENTIFIER OP_ASSIGNMENT DT_DATA_TYPES) OP_SEMICOLON; 以及以下lexer规则: KW_VARIABLE : 'var'; OP_ASSIGNMENT : '='; OP_SEMICOLON : ';'; DT_IDENTIFIER

ANTLR语法:如果匹配其他规则,则拒绝

我是antlr的初学者, Im尝试为以下规则编写antlr语法(.g4文件): 在两个变量之间接受和(&):A&B、ABC&X、 接受以U&'hex字符串开头的Unicode字符串:U&'000b',U&'0020' 接受变量(字符串类型)和字符串之间的concat字符串:A&'123',ABC&'XyZ' 我的问题是如何拒绝U和'XyZ'之间的concat字符串?因为U&是unicode字符串的前缀 感谢阅读U&'XyZ'不应被解析器识别为AND表达式,因为U&'XyZ'已在lexer中标

ANTLR中的固定数字格式

如何在antlr语法中指定固定位数 我想解析一行,其中包含固定字符数的字段。每个字段都是一个数字 0034 | 9056 | 4567 | 0987 |-2340 |+345 | 1000 上述线为采样线指示不在实际文件中的字段边界。此处所示仅用于指示边界 字段可以包含空白字符+/-以下内容如何: INT : ('+'|'-')? ('0'..'9')+; 我希望lexer语法尽可能简单,只需在解析器语法中匹配零个或多个空格,后跟可选符号和数字。匹配后,检查解析器语法中字段的宽度是否正确 语法

处理antlr 3中的隐藏通道

我正在写一个ANTR语法,用于将一种语言翻译成另一种语言,但是关于使用隐藏通道的文档非常稀少。我到处找不到一个例子。我唯一发现的是www.antlr.org上的FAQ,它告诉你如何访问隐藏频道,但不是如何最好地使用此功能。目标语言是Java 在我的语法文件中,我传递空格和注释,如下所示: // Send runs of space and tab characters to the hidden channel. WHITESPACE : (SPACE | TAB)

ANTLR重写查询文本以与早期节点重复文本

我是ANTLR新手,正在尝试使用以下方法解析查询 grammar SearchEngineQuery; options { language = CSharp2; output = AST; } tokens { AndNode; } LPARENTHESIS : '('; RPARENTHESIS : ')'; AND : 'and'; OR : 'or'; ANDNOT : 'andnot'; NOT : 'not'; NEAR : 'nea

Antlr 如何使用JavaSwing查看表单中的解析树?

我正在使用JavaSwing构建GUI应用程序。我想以一种形式查看解析树(就像-gui选项),以便在“最终ANTLR 4参考”中提到,我必须使用TreeView类, TreeView(列表,树) 我的问题是:构造函数中的第一个参数代表什么 这是构造函数签名: public TreeViewer(@Nullable List<String> ruleNames, Tree tree) List<String> ruleNames = Arrays.asList(parse

ANTLR-仅在括号之间写入数字

我不喜欢在括号内写字母/数字。然而,我的语法不接受数字 规则在我的语法文件中定义如下: id_list : '(' ID (',' ID)* ')' -> ID+ ; ID : ('a'..'z' | 'A'..'Z' | '_' | '.' | '-' | Digit)* ; Number : Int ('.' Digit*)? ; fragment Int : '1'..'9' Digit*

使用ANTLR4生成的访问者生成AST

我正在将ANTLR3语法转换为ANTLR4语法,这意味着我必须删除所有树重写规则,因为它们现在必须在代码中实现,通过使用自定义的访问者访问ParseTree,可以生成AST 旧语法具有防止歧义的重写规则,并自动生成通缉目录树。我在网上找不到任何有用的资源来展示如何使用访问者/监听器范例来实现这一点 Visitor需要一个类型,该类型用作所有visit*函数的返回类型。如果我需要生成AST,我应该使用什么返回类型?ANTLR3使用了CommonTree对象 当输入visit*节点时,我可以创建树的

Antlr 指定语法规则为;以任何顺序出现,但最多出现一次”;

假设我有三个符号A,B,C 在ANTLR中,我如何指定在一个句子中,a、B和C最多只能出现一次,并且它们可以以任何顺序出现。(例如,ABC、BCA都是合法的) 我试过了 (A | B | C)* 知道它只能处理“任意订单”部分,但想不出一种方式来表示它最多只能出现一次 编辑:我尝试过使用布尔标志,这很有效,但似乎太复杂了-必须有一个更简单的方法,是吗 myrule; { boolean aSeen = false; boolean bSeen = false;

Antlr字符串模板中的条件

我们使用Antlr StringTemplates来控制实体名称的输出方式 基本的Stringtemplate是 $FirstName$$Initial$$LastName$, $Suffix$,$Degree$ 我想给该模板添加一些智能,以便逗号仅在必要时输出,即第一个逗号仅在有后缀或度时输出,第二个逗号仅在有后缀时输出 我尝试了以下模板字符串位,但它不起作用。我想我误解了 $FirstName$$Initial$$LastName$ 美元后缀$ ,$Degree$ 如果它有助于我们使用此C处

ANTLR:在语法中定义新通道

我知道在ANTLR语法中可以在默认和隐藏令牌通道之间切换,但假设我想要第三个通道。如何在gramar中定义新的令牌通道?例如,假设我想要一个名为ALTERNATIVE的频道。它们只是中的最终int,因此您可以简单地在lexer中引入一个额外的int,如下所示: grammar T; @lexer::members { public static final int ALTERNATIVE = HIDDEN + 1; } // parser rules ... FOO : 'foo

为什么';这个ANTLR语法文件是否生成?如何修复它?

这是我在AntlWorks控制台中得到的错误消息 grammar mygrammar; string : '"' ( ESC | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"'; number : HEX_NUMBER | '-'? INTEGER_NUMBER ( '.' INTEGER_NUMBER )?; HEX_NUMBER : '0x' HEX_DIGIT+; INTEGER_NUMBER : DIGIT+; WS: (' '|'\n

Antlr语法谓词行为不一致:为什么?

给出此输入时,以下语法正常工作: cd/someotherpath/someotherpath/path 此输入应解析为标识符(cd)和对象路径(someotherpath/someotherpath/path),由“/”分隔 我花了好几个小时才找到一条有效的语法规则来做这件事。语法中有一条注释掉的标识的\u路径规则不起作用。该规则中的问题是,接受开头的独立标识符,即使存在无法解析的字符。这就是让我困惑的地方。当使用注释掉的规则时,Antlr开始解析,看到cd,将其识别为标识符,然后看到“/”

ANTLR:令牌的组合

我有一个问题,我正在搜索大约一个小时。给定的ANTLR lexer规则由2个(或更多)子规则组成。Lexer现在生成单独的AST节点 例如: [...] variable: '$' CamelCaseIdentifier; CamelCaseIdentifier: ('a'..'z') Identifier*; Identifier: ('a'..'z' | 'A' .. 'Z' | '0'..'9')+; [...] 给定的[…]$a[…]输入结果是..,$,a,… 我正在寻找一种方法来告诉

Antlr 标记分析器失败

对于我试图解析的标记语言,我决定尝试使用ANTLR生成解析器。我是新手,我把事情搞砸了 我的语法是 grammar Test; DIGIT : ('0'..'9'); LETTER : ('A'..'Z'); SLASH : '/'; restriction : ('E' ap) | ('L' ap) | 'N'; ap : LETTER LETTER LETTER; car : LETTER LETTER; fnum

如何在条件规则重写中使用ANTLR lexer标记值

我是ANTLR的新手,我想做以下工作: 给出下面的语法片段,我有一个选择规则*comparison_op*,它可以匹配许多标记中的一个。我想做的是编写条件重写规则——例如,如果令牌是DOESNOTENDWITH do something,如果它是DOESNOTCONTAIN do something等等 我就是不能把这件事做好。甚至有可能做到这一点吗?当然,我可以为每个条件编写特定的规则,但这似乎也不是最好的方法 有什么建议吗 试试这个: condition_comparison : (co

使用antlr语法分析输入字符串

我的语法有以下问题: 我将要分析的输入字符串如下所示: ruledef COMPLEX1 ftp command args = abc ftp command args = ftp ftp command args = cde exit 我使用的语法是: grammar main; /*Lexical*/ NUM : [0-9]+; STRING : [0-9a-zA-Z]+; WS : [ \t\r\n]+ -> skip; // Whitespace de

使用Antlr完成源代码是否可行?

我不知道这个问题是否有效,因为我不太熟悉源代码解析。我的目标是为一种现有的编程语言(语言“X”)编写一个源代码完成函数,以便于学习。 Antlr(v4)是否适用于此类任务,或者假设不存在现有解决方案,是否应该手动创建和解析必要的AST/解析树 我没有找到关于这个特定主题的太多信息,除了编译器书籍的列表,除了编译器不是我想要的。GoWorks中的代码完成完全是使用ANTLR 4实现的。以下视频显示此代码完成引擎的完成级别。代码完成示例从5分钟运行到视频结束 我在代码完成算法方面已经工作了很多年,

如何使用ANTLR创建建议消息?

我想创建一个交互式版本的ANTLR,它告诉用户下一步要键入什么。例如,在开始时,ID、INT、NEWLINE和WS标记是可能的。忽略WS,建议消息可以是: 键入标识符、数字或换行符。 解析数字后,消息应为 Type+、-、*、或换行符。 等等。如何做到这一点 编辑 到目前为止,我所尝试的: private void accept(String sentence) { ANTLRInputStream is = new ANTLRInputStream(sentence); Ope

ANTLR程序停止读取输入文件

我对这种语法有问题: //parser macchinaTuring: { init();} listaIstruzioni {env.insertwarning(); } ; listaIstruzioni : (istruzioni)+ ; istruzioni : (LP statoiniziale VI statofinale VI DIR RP PV (commento)?

ANTLR走错了路

我有一个非常简单的语法: grammar LispExp; expression : LITERAL #LiteralExp | '(' '-' expression ')' #UnaryMinusExp | '(' OP expression expression ')' #OpExp | '(' 'if' expression expression expression ')' #IfExp; OP : '+' |

ANTLR语法迁移工具

假设我有以下简单语法(查询DSL): 然后在某个时候,我决定需要更改文本术语格式,例如: Text(value = "123") -> MyText(val = "123") 如何迁移用户使用以前版本的语法生成的现有数据? 让我们通过为'TEXT'字符串引入标记TEXT来简化语法 语法测试语法; WS:[\t\r\n]+->频道(隐藏);//保留空白字符! T_值:“值”; 字符串:“'”.+?“'”; 文本:“文本”; 学期 :textTerm; 文本术语 :文本“(“T_值”=“字符

如何将ANTLR4生成的代码转换为jar并删除解析树检查器?

我确实用ANTLR4生成了一个代码来解析我在用JavaEE创建的站点上需要的文本输入,所以我必须将其转换为.jar文件来集成它。我该怎么做? 我不需要一直炫耀的解析树检查器,我只需要生成它的输出。我怎样才能删除它? 谢谢这里似乎有误会。生成的解析器+支持文件就是您需要分发的所有文件。您可以像对待任何Java项目一样将它们打包到jar中,例如在Eclipse中,将解析内容组织到库中,并将其导出为jar 除此之外,您还需要ANTLR4运行时。你可以从电话簿上得到。这就是部署解析器的关键

使用Antlr4标识语法版本

有没有一种好方法让Antlr4识别用于解析输入的语法版本 如果我有两个语法,GA和GB,其中GA是GB的子集,其中GB导入GA,如果使用GA或GB解析解析解析的输入,有没有办法让Antlr4报告 我可以试着先用GB解析它,如果失败,试着用GA解析它,但我想知道是否有更有效的方法让Antlr跟踪使用的规则,并说,“我成功解析了它,但只使用了GA语法中的规则” 正确的方法是将每个规则(或仅关键规则)关联到解析器版本 首先,您需要一个字段来跟踪当前版本: @members { int curr

ANTLR:匹配未转义字符?

我有一条规则,比如 charGroup : '[' .+ ']'; 但我猜这会匹配类似于[abc\]的东西。假设我想让它只匹配unscaped]s,我该怎么做?在正则表达式中,我会在后面使用负数 编辑:如果可能的话,我还希望它是不灵活/懒惰的。以便只匹配[a][b]中的[a] 我会用负面的眼光看后面 这不是不必要的复杂吗?那么: charGroup : '[' ('\\]' | .)+ ']'; 您可能想做以下事情: charGroup : '[' ('\\' . |

Antlr 简单数学表达式解析器

我有一个简单的数学表达式解析器,我想自己构建AST(意味着没有AST解析器)。但每个节点只能容纳两个操作数。因此,2+3+4将生成如下树: + / \ 2 + / \ 3 4 问题是,我无法让我的语法进行递归,这里只是“添加”部分: 但最终这会产生一棵树,就像: + / \ 2 4 我知道问题出在哪里,因为“加法”永远不会或无限(*)但我不知道如何解决这个问题。我想到了这样的事情:

带EBNF的Antlr语法

我试图通过使用ANTLR的简单语法生成一个Lexer/解析器。我现在所做的: grammar ExprV2; @header { package mypack.parte2; } @lexer::header { package mypack.parte2; } start : expr EOF { System.out.println($expr.val);} ; expr returns [int val] : term e=exprP[$term.

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