本书中的示例LabeledExpr.g4描述了如何为Singleton使用visitor类。但是如果我想参观一个收藏的课程,我该怎么做呢?e、 g.关于语法:
prog: stat+ ;
stat: expr NEWLINE # printExpr
;
用于打印的访问者功能如下所示:
public Integer visitPrintExpr(LabeledExprParser.PrintExprContext ctx) {
Integer value =
场景是我想使用ANTRL4创建一种基本(高级)语言
下面的测试输入是创建一个名为C$的变量并分配一个整数值。值赋值是有效的。print语句可以工作,除非将变量连接到它:-
************ TEST CASE ****************
$C=15
打印“危险的愤怒!”印刷品
打印“剩余GB数=”+$C
使用解析树检查器,我可以看到赋值工作正常,但当它识别字符串中的变量时,似乎存在不匹配的输入“+”
我想知道是否有人能在这里帮助我,看看我需要对我的规则和语法做什么调整
我正在为一个基于VBScript的脚本编写语法。
在脚本中,变量赋值是以i=10的常规方式完成的,另外还有一个变体:Set i=10
方法调用可以通过多种方式完成,同时对对象调用方法,如:
另一个(10).呼叫(20).链(30)
我在语法中把“设置”作为关键词。但是,在一些预定义的CALSS中,允许开发人员将方法命名为“Set”,因此,可能会有如下调用(让我将其标记为行A):
另一个(10)。呼叫(20,30)。设置40,50
我的语法:
definition: body EOF;
body:
我对ANTLR 4有什么期望
它比3号快吗?我指的是解析速度。
注意:代码生成速度也很有趣
出于设计原因 首先是简单的部分-ANTLR 4工具只执行语法的最小分析,特别是不需要像ANTLR 3那样静态计算DFA表。因此,在生成解析器方面,它比ANTLR3快得多
ANTLR4最初的4.0版本从略快于ANTLR3到慢于ANTLR3不等,这取决于语法和输入。然而,ANTLR4能够处理许多ANTLR3根本无法处理的语法和输入。此外,ANTLR 4运行时的优化版本已经在开发中,其性能大大优于ANTLR 3
我使用的是ANTLR4,语法中有一个“import”语句
ANTLR4是否有自动打开和解析输入文件的选项,而不是在我的访问者中进行(为每个“导入”声明创建另一个解析器/词法分析器和访问者)
“漂亮”当然我已经看过了,但我再也找不到了
在我的语法中:
importStatement : 'import' ID ';' // Here ? an action (Java code)
// to prepend an AST to m
我正在学习ANTLR4的第2天。我的最终目标是为RTF格式的文件编写解析器。我遇到了这样的情况,我不知道ANTLR在做什么,也不知道我在误解什么。我将尝试提供一个简化的代码片段:
grammar Rtf;
document : LBRACE '\\rtf1' control+ fonttable (control | text)+ RBRACE ;
text : TEXT ;
fonttable : LBRACE '\\fonttbl' SPACE? (fontdecl)+ RBRACE ;
基本上,我要做的是在ANTLR 4.1中为国际化的资源标识符创建语法。到目前为止,我所经历的最困难的一段时间是试图让ipv6address的生产规则正常工作。ipv6address在中的定义方式是,对于该生产规则,ABNF格式基本上有9种不同的替代方案:
IPv6address = 6( h16 ":" ) ls32
/ "::" 5( h16 ":" ) ls32
我的原始语法使用skip命令在解析过程中忽略空格
WS : [ \t]+ -> skip ;
但是,对于重构方法,我需要将空白标记发送到隐藏通道,以便根据以下receipe使用TokenStreamRewriter:
现在的问题是,解析器将空白识别为标记,我希望在默认解析过程中避免这种情况
是否可以根据常规解析过程或重构方法(使用相同语法)的解析过程在同一规则的两个不同实现之间切换
我需要语义谓词吗?或者CommonTokenStream中是否有一种方法可以跳过或启用W
我使用的是antlr-4.2-antlr的完整版本。
我无法理解确切的问题
更新:
我给出的输入像MID(9)问题是您的规则不明确。“9”应该是什么?它可以是字符串或and INT。我强烈建议使用antlr社区提供的字符串、WS、COMMENT和换行符的预定义文本
请注意,这是antlr3代码正如你所看到的,字符串是引号中的某物(我想这也是你想要的)
我不确定我是否理解你的意思,我只使用了antlr3,但如果你想验证MID,我很确定你不应该把它放在“引号”中。请发布一个你作为输入和预期结果的例子
我正在使用IntelliJ中的ANTLR 4插件,我有一个最奇怪的bug。我将从相关的解析器/词法分析器规则开始:
// Take care of whitespace.
WS : [ \r\t\f\n]+ -> skip;
OTHER: . -> skip;
STRING
: '"' [A-z ]+ '"'
;
evaluate // starting rule.
: textbox? // could be an empty textbox.
;
textbox
: (r
如果我有这样的语法:
g: String -> String ;
String: [A-Z]+ ;
有没有办法在语法中编写规则来检查第一个字符串是否与第二个字符串不同?
例如,我想解析这样的字符串a->B!
但不是像这样的A->A。
如果令牌相等,我希望解析器能够抛出错误。
这是我能用语法做的吗?还是我只能通过一个听众来验证?(当我在解析树中行走时)。谢谢 您可以使用谓词来实现这一点,如:
g: s1 = String '->' s2 = String { s1.getText(
我需要处理一个平面文本文件,我试图用antlr4生成一个解析器。文件格式如下:
该文件可以包含多条记录
每行是一条记录
每个记录都有多个字段
字段的数量取决于记录类型
每条记录的总长度不是固定的,取决于单个字段的数量
记录类型由前3个字母数字元素定义
每个字段都有一个特定的起始位置(记录中的列)和许多元素
样本文件
ACF0000000101IAR
FAT0000000203IARGL9344KDKK
FAT0000000301IARGM
示例语法
grammar Cat;
file : r
有人能帮助我理解在Lexer和Parser级别编写的规则的行为吗
basicInterfaceType
: ('Port-channel' | 'fortyGigE' | 'TenGigabitEthernet' | 'GigabitEthernet')
;
当作为ctx.basicInterfaceType().getText()访问时,上面的解析器规则返回了预期值TenGigabitEthernet,而当作为ctx.BASIC\u INTF\u TYPE().getText()访
我创建了以下语法:
val: ID;
ID: [0-9A-Za-z$&#@][0-9A-Za-z$&#@]*
IDX
:
ID +
;
ID
:
'#' | '&' | '$' | '.' | '?'| '*' | 'à' | '£' | '@' | [0-9A-Za-z]
;
当我在测试中给出一个值,例如“a”或“&X”时,我得到了以下错误:
val:1:0:不匹配的输入“&X”应为ID
val:1:0:不匹配的输入“A”应为ID
由于ID的两个部分相同,
我正在尝试为遗留语言构建一个简单的命令处理器
我正在尝试使用C#使用antlr4版本“ANTLR”,“4.6.6”)
我无法在一种情况下取得进展,其中有几种情况
以下示例显示了命令PKS的各种示例调用
PKS
我无法解决的情况是PKS命令后跟文件名
Command:
PKS
(block (line (expr (command PKS)) (eol \r\n)) <EOF>)
Command:
PKS?
(block (line (expr (command PKS) (quer
我想扩展我的语法,这样就可以在双引号内定义正则表达式值,下面是一个我想允许的示例
matches(value, test| ".*foobar[A-Z]");
实际上这是不可识别的,因为点和方括号以前是可识别的。这是解析树
我如何解决这个问题,我尝试了一个新的规则:ANY:。但有了这些,我无法解决它。有什么想法吗
这是我的语法
grammar FEL;
prog: expr+ SEMI? EOF;
expr:
s
我想解析“原子”列表,即在某些情况下必须放在单引号中的简单字符串,以免与变量名或整数混淆,以允许包含空格以及允许包含单引号本身
应处理一个输入文件,其中包含数字,后跟一个ORN,后跟一个原子的Prolog列表
例如,输入文件可以是:
1: [ foo, bar ]
2: [ alpha, 'THIS IS VARIABLE NAMES WITH BLANKS THUS QUOTES' , '_also_a_variable_name' ]
3: [ empty_atom_follows, ''
我试图在解析器中测试一些子规则,以检查变体。我正在检查的规则是表达式规则
expression: expression PLUS expression # plusExpression
| expression IS NOT? NULL # nullExpression
| columnIdentifier # columnExpression
| literal
我有一个单独的lexer和parser语法(源自示例ModeTagsLexer/ModeTagsParser),并且在AntlWorks 2中得到一个我不理解的警告:
警告(125):解析器中打开的令牌的隐式定义
如果我将打开规则替换为,则此规则属于此处:
lexer grammar STLexer;
// Default mode rules (the SEA)
OPEN : '<' -> pushMode(ISLAND) ; // switch to IS
我正在尝试将工作antlr移植到antlr4,但找不到出现错误的原因:
语法错误:“public”让我大吃一惊
关于:
?
顺便说一句,我还得到:
syntax error: '->' came as a complete surprise to me while looking for rule element
syntax error: '^' came as a complete surprise to me
务实的解决办法
只需删除public修改器。默认情况下,规则是公共的
我的语法如下:
grammar Aligner;
line
: emptyLine
| codeLine
;
emptyLine
: ( KW_EMPTY KW_LINE )?
( EOL | EOF )
;
codeLine
: KW_LINE COLON
indent
CODE
( EOL | EOF )
;
indent
: absol
我使用ANTLR3已经有一段时间了。我只是切换到ANTLR 4。一般来说,在我的编译器课上,我的学生更容易理解它。然而,从我找到的书和其他文档中还不清楚如何制作构成解析树定制类节点的标记和上下文。对于Antlr3,我只是使用这些选项让生成的代码在生成的代码中重命名它们。在ANTLR 4中呢?有我应该能够找到的文档吗?实现TokenFactory其中CustomTokenType扩展CommonToken。在调用解析器之前,在lexer(以及所需的解析器)上设置TokenFactory
在“”一书
我想解析像TOM*、TOM、*TOM、TOM*这样的字符串,以及所有这些不带引号的字符串。我创建了两个规则名为带引号的\u和不带引号的name,但带引号的字符串给出了预期的标记:error
我在lexer.g4文件中有以下令牌
ID : [a-zA-Z0-9-_]+ ;
WILDCARD_STARTS_WITH_STRING: ID'*';
WILDCARD_ENDS_WITH_STRING: '*'ID;
WILDCARD_CONTAINS_STRING : '
在ANTLRv3中,可以在一个lexer规则中添加多个代码块,但在版本4中,这是不可能的
允许。什么是最好的替代方法
TAG
: '{' (~('}'))* '}'
{ setText(getText().substring(1, getText().length()-1)); }
| '{!{' (options {greedy=false;} : .)* '}!}'
{ setText(getText().substring(3, getText().leng
我正在尝试使用AntlR4.4构建我的antlr项目。我使用Maven运行,但这些工具的发行版似乎不匹配。我能找到的antlr maven插件4.4的唯一发行版是Tunnelvision实验室。当我使用他们版本的运行时jar和maven插件时,我的构建失败了。它找不到org.antlr.v4.runtime.misc.Pair
我试图使用antlr.org上的antr-runtime-4.4.jar,但它无法与Tunnelvision实验室的antlr maven插件配合使用。它返回一个错误“找
使用antlr4 TestRig,您可以使用-ps生成PostScript树。我不能看我的树
附言:
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 54 48
0.3 setlinewidth
%% x y w h highlight
/highlight {
4 dict begin
/h exch def
/w exch def
/y exch def
/x exch d
我使用ANTLR解析一种编程语言。根据ANTLR手册(第9.4章),我实现了一些“错误替代方案”。书中通过通知错误侦听器描述了一个简单的实现:
.....
| ID '{' expr '}' '}' {notifyErrorListeners("Too many braces");}
.....
读了这本书之后,我认为作为监听器实现通知会更容易,所以我在BaseListener中写道:
public void exitExprError(@NotNull MyParser.ExprErrorC
我有这样的语法:
grammar MkSh;
script
: (statement
| targetRule
)*
;
statement
: assignment
;
assignment
: ID '=' STRING
;
targetRule
: TARGET ':' TARGET*
;
ID
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
我正在尝试学习ANTLR(使用v4),并且我正在使用访问者了解ANTLR生成的AST
为了帮助我学习,我想出了一种愚蠢的语言来解析。它有“参议员”名单
FirstName LastName(party)e.gBA Baracus(R)
它们填充了一个宇宙(在ArrayList()中),您以后可以使用它来做事情
。。。还有一些"行动",
~printRhouse打印出众议院(即打印出按党派分组的宇宙)
ANTLR为我生成了一个基础访问者,它是一个参数化类——因此我用一个名为T的类进行了子类化——在
Ace编辑器使用mode.js突出显示关键字,使用worker.js检查语法。在ACE编辑器中,我想验证给定用户输入的ANTLR语法规则(来自.g4文件)的语法并突出显示它们。默认情况下,ACE可以验证Javascript(JSHint)、JSON等的语法
同样的,ANTLR语法也可以这样做吗?如果是这样,怎么做
我试图在语法中匹配W或W*。这是一个精简版:
grammar PdfStream;
content : stat* ;
stat
: wCap ;
wCap: 'W' '*'? ; // Set clipping path using nonzero winding ('W') or even-odd ('W*') rule
// Accept all characters except whitespace and defined delimiters ()<>[
警告如下:
规则包含一个可选块,其中至少有一个可选块可以匹配空字符串。示例:Oracle中的row_limiting_子句,其中offset_子句和fetch_子句都是可选的
你不能压制这样的警告,你应该认真对待它们。即使ANTLR4可以从该语法生成有效的ATN,它也可能根据输入做出意外的决定
相反,试着修正语法部分。警告是关于以下内容的:
a: b?;
b: c? d?;
c: 'C';
d:'D';
您在这里看到的是,规则b不仅作为一个整体是可选的,而且它的所有部分也是可选的。这有点重复了
在ANTLR中,我怎样才能制定一个规则,在任何顺序中只匹配所有备选方案一次
i、 e
我希望“示例”和“示例2”只匹配一次,然后再转到下一条规则
应匹配以下各项的输入:
example
example2
example
example
example2
或
但不包括:
example
example2
example
example
example2
在ANTLR中,我怎样才能制定一个规则,在任何顺序中只匹配所有备选方案一次
“所有备选方案只需一次”只是规则:altA altB altC
我正在学习antlr。我已经让它与Java一起工作,但无法让任何东西在C#中工作。我用权威的Antlr书中的一个例子创建了我能找到的最简单的案例,但我仍然遇到问题
这是我的代码和语法。我已经硬编码了“hello parr”作为输入并获取
第1行:6不匹配的输入'parr'应为ID
制备剂g4
grammar PreParser;
import PreParseLex;
r: 'hello' ID;
PreParserLex.g4
lexer grammar PreParseLex;
ID
我读了“确定的ANTLR4参考”,它说
虽然Antlrv4可以处理直接左递归,但不能处理间接左递归
递归
在第71页。
但在第90页的json语法中,我看到了下一步
grammar JSON;
json: object
| array
;
object
: '{' pair (',' pair)* '}'
| '{' '}' // empty object
;
pair: STRING ':' value ;
array
我是antlr4的新手,我正在努力充分利用antlr从解析器错误中恢复并继续的能力。我发现它可以继续访问解析树,即使在出现解析错误时,它也会匹配规则,但有时并非所有的规则元素都存在。这会在我的访问者代码中导致问题,因为我的代码期望规则匹配的所有元素都在那里,并且会引发异常
我在考虑两个选择:
1解析后,请检查parser.getNumberOfSyntaxErrors>1,如果是,请不要继续访问解析树。这将停止抛出异常,但不会给用户尽可能好的反馈。antlr4确实可以很好地从错误中恢复,并且可以
标签: Antlr4
keywordidentifierambiguitymismatch
关于以下简化语法
proof_command : 'Proof' 'using' collection '.';
collection : 'Collection' IDENT ':=' section_subset_expr
| 'Collection' KeySOME ':=' IDENT IDENT IDENT
;
KeySOME : 'Some';
(在Java中,IDENT只是一个常用的标识符)我试图解析以下内容:使用集合Some进行证明
我正在用ANTLR 4创建我自己的语言,我想创建一个规则来定义变量及其类型,例如
string = "string"
boolean = true
integer = 123
double = 12.3
string = string // reference to variable
这是我的语法
// lexer grammar
fragment LETTER : [A-Za-z];
fragment DIGIT : [0-9];
ID : LETTER+;
STRING : '"' (
此代码将报告以下错误:
import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor;
import org.junit.Test;
import javax.xml.bind.SchemaOutputResolver;
public class T1 {
@Test
public void t1() {
我正在用ANTLR4为实时语言PEARL开发一个编译器
使用ANTLR4,我的ParseTree中填充了超级标记,例如用于结束
语法单位
有没有办法告诉ANTLR忽略这些类型的令牌
有没有办法告诉ANTLR忽略这些标记
不需要,但是使用ANTLR4的内置侦听器/访问者,不需要删除这些令牌
请参阅:Yes,对于当前的Visitor和Listener方法,对令牌不做任何操作实际上等同于忽略它。
我有一个“自定义”要求,即在解析时(即在成功匹配函数调用之后)验证语言中的函数调用。我知道这通常是语义相关的,因此通常稍后执行,但再一次,一个“自定义”需求
目前,我使用一个操作,在成功匹配后添加函数验证代码。当验证失败时,我尝试抛出一个全新的RecognitionException实例,但显然DefaultErrorStrategy类硬编码了它处理的错误类型,并将其自身限制为RecognitionException子类
问题是我想重新使用整个默认的错误处理机制,同时使用我自己的异常类型(或者至
我正在尝试使用ANTLR 4为一个简单的DSL创建一个解析器。我从我的测试和ANTLRWorks中得到“输入时没有可行的替代方案”
语法:
grammar Test;
process: action ('|' action)* ;
action: (filter) | (transform) | (log);
transform: 'transform' '(' ( ('name' '=' transformName)|('regex' '=' regex)) ')' ;
transformNa
我正在尝试为正在使用的逻辑创建解析器。
我有一个Pb的表达式的形式是:
Ag(s1,SC(s3,s2,p))。
我想确定s1=s3
但是,s1是一个随机字符串,定义为
VAR_NAME : [a-zA-Z]+[a-zA-Z0-9]*;
所以规则是这样的:
s : 'Ag' '(' VAR_NAME ',' 'SC' '(' VAR_NAME ',' VAR_NAME ',' pathformula ')' ')';
我需要第一个和第二个变量名相等
是否有类似的标记强制s1和s3值相同?如果
我使用示例代码来更好地理解ANTLR。据我所知,行规则返回一个映射值。文件规则内的行标签收集所有RowContext对象。从文件规则中的for each循环中,是否有方法访问行规则返回的映射值
如果没有,我如何实现从文件规则访问所有行规则映射值
代码片段:
/** Derived from rule "file : hdr row+ ;" */
file
locals [int i=0]
: hdr ( rows+=row[$hdr.text.split(",")] {$i++;} )
我正在尝试使用ANLTR语法为一种语言建模。一个特性是“下一个X参数可以默认设置”。从语法上看,它如下所示:
考虑一个
f(a=1, b=2, c=3, d=4, e=5)
f是一个具有5个参数a、b、c、d和e的函数,分别具有默认值1、2、3、4、5。该语言允许用户通过如下方式指定“默认下一个X参数”:
f(2, 3#, 10)
这里调用函数f时,a=2,b/c/d=default,e=10。因此,它相当于
f(2, 2, 3, 4, 10)
在ANTLR4中是否有一个可以“跳过下一个X
我正试图为木偶风格的声明性语言编写语法。我有我的基本语法,还有一个JUnit测试,试图实现一个侦听器方法来加载它。JUnit测试捕获第一个资源,但不捕获第二个资源,它几乎就像resources规则从未得到评估一样。我将日志语句添加到我的加载器中,资源永远不会进入/退出
grammar Bosse;
resources : resource+;
resource : ID LBRACE STRING COLON attributes RBRACE ;
attribu
这可能很简单,但我看不出解决方案。Antlr V4.0告诉我:
error(50): C:\Users\Brenden\Dev\proj\WikiParser\antlr\wiki\wikigrammar.g4:27:8:
syntax error: extraneous input '' LINK_BODY '' expecting GT while looking for rule element
这用于输入行:
link: '<' LINK_BODY '>' ;
链接:“”
我想解析cpp预处理指令,同时跳过所有其他cpp语法。特别是,我需要区分类函数宏和类对象宏:
# define abc(x,y) x##y //function like macro & token pasting operator
# define abc (a,b,c) //object like macro, replace 'abc' by '(a,b,c)'
关键区别在于,类似于函数的宏在标识符abc和它后面的左括号之间没有任何隐藏标记(空格或多行注释)
但问题是,我已
我有两种语言,分别称为A和B(使用AGrammar.g4、BGrammar.g4、ALexer.g4和BLexer.g4)。B是a的超集,因此我有B导入a
我有一个将A编译成X语言的访问者代码
我正在编写将B编译成X语言的访问者代码,并希望重用A2X代码。但是,生成的B.java代码重新定义了A.java中已经存在的所有嵌套规则类
有没有办法让B.java重新使用A.java中生成的代码,这样我就不必复制所有A访客代码?没有。而且没有提供足够的信息来建议替代方案。如果BLang真的是ALang的
用ANTLR为从右向左的语言(如阿拉伯语或希伯来语)编写语法的正确方法是什么?
我是否从左到右写入语法中的标记和规则,然后创建从右到左填充Lexer中字符的InputStream?RTL读取只是一种表示,而在内存中(这对于ANTLR4 Lexer来说很重要),字符以递增的内存地址顺序存储,就像任何其他语言一样。ANTLR4现在完全支持Unicode,您应该能够用Unicode支持的任何语言编写规则(语法规则名称和lexer内容)。这可能会有帮助:谢谢YaFred-这似乎与上述内容一致。这是官方推
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 15 页