使用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
我的语法如下(简化以显示问题):
解析以下字符串可以很好地工作:
TYPE1 ("abc") { COMMAND1(0) }
TYPE2 ("abc") { COMMAND2(0) }
但是,解析以下字符串会导致错误
TYPE2 ("abc") { COMMAND1(0) }
我得到“不匹配的输入'COMMAND1'应为FUNCTIONNAME2”
我如何才能让这个场景工作?也就是说,两个代码块可以包含相同的函数名?基本问题是lexer将始终将“COMMAND1”分配给令牌函数名1,因为该规
我有这样的语法来生成解析器:
grammar MyLang;
init: TERMINAL;
TERMINAL: '"' ~('"')* '"';
使用ANTLR4和上面的语法来解析像“data”这样的简单输入,我得到了一个错误:
mismatched input "data" expecting TERMINAL
我已经读过很多关于这个错误的问题。但我不知道怎么解决它。如果有什么问题,请告诉我好吗?您使用的是哪种antlr4版本?我用antlr 4.4尝试了你的语法,它是有效的。你可能
我需要使用下面的格式化块注释来搜索C源代码。
我想提取这些文件:“abcd”、“filedname1”、“attr1”、“attr2”、“filedname2”、“attr1”、“attr2”
我已经编写了一个如下所示的gramma文件,但是它的“BlockComment”无法获得正常的块注释,我仍然不确定gramma文件是否正确?
任何人都可以帮助我,谢谢
/*
*| abcd {
*| .filename1
*| {
*| :attr1= define;
*| :attr2=
我想让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:
我的语法包含以下内容:
assignment
: ID ASSIGN expr
;
expr
: MINUS expr #unaryMinusExpr
| NOT expr #notExpr
| expr MULT expr #multExpr
| expr DIV expr #divExpr
| expr PLUS expr #plusExp
我刚开始使用antlr4,我只想写一个语法,可以解析一个数字序列,但一次只能选择4个数字
例如,我有一个号码1234567891234567
然后我希望它将前4个数字解析为1个标记,下一个解析为另一个,下一个解析为另一个,这样我就得到了4个不同的4个数字标记
token1 = 1234,
token2 = 5678,
token3 = 9123,
token4 = 4567,
谁能帮我写一个语法吗
grammar TEST;
/*
* Parser Rules
我正在用一个在antlr3中工作的语法来尝试antlr4。完成了所需的2个语法更改,现在我有了生成lexer和parser的工具
但是,lexer有一个编译错误:
1) 该类型生成的字符串需要超过65535个字节才能执行
在常量池中以Utf8格式编码
该错误在Eclipse中的类名上显示,因此不确定它所指的是哪个字符串,但我怀疑是这个很长的字符串:
public static final String _serializedATN =
"\1\2\u01c5\u1741\
我有一个ANTLR4语法,它有一些规则试图匹配语言中表达式的部分应用。将其简化,规则如下所示:
grammar PartialExpression;
program
: (function '.')+
;
function
: name '=>' expression (';' expression)*
;
name
: SYMBOL
;
expression
: functionCall
| cl
我需要在它们的大列表中禁用一些替代项,以用于一些具体的上下文。
我决定通过语义谓词来实现这一点,但面临着奇怪的行为。看起来我做错了,但我不明白为什么
下面是一个最大限度简化的语法,它应该允许我展示正在发生的事情
输入文本是101,我希望它被解析为(规则1 0 1)。由于谓词失败,我希望antlr为rule1选择第二个选项,它与输入序列完全匹配
但是Antlr在输入“0”处抛出一个异常行1:1 no-available alternative,并生成这样的解析树:(rule1 1(rule2 0
您好,我在尝试本教程的简单示例时遇到此错误:
“格伦你好-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
context-free-grammar
我们知道逻辑操作的优先级从强到低:
不
及
或
我想在语法中加入逻辑运算,以尊重逻辑运算的优先性。。。
我的语法是:
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的词法器模式:
STRING: '"' -> pushMode(STRING_MODE);
mode STRING_MODE;
STRING_CONTENTS: ~('"'|'\n'|'\r')+ -> type(STRING);
END_STRING: '"' -> type(STRING), popMode;
STRING_UNMATCHED: . -> type(UNMATCHED);
是否有方法为模式中捕获的所有字符
在与解析侦听器玩了一会儿之后,我发现了一种出乎意料的行为。
我的问题是,我的期望是错误的,这种行为是需要的还是一种缺陷?如果需要这种行为,请解释
下面是示例语法:
grammar Labeled;
file: stmt;
stmt: stmt '+' stmt # Add
| stmt '*' stmt # Mult
| FLOAT # Value
| INTEGER # Value
;
FLOAT: '-'? DIGIT* '.
我有以下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上,比如:
标识:[a-zA-Z]+{/*设置令牌=token.toUpper*/}
除了我在文档中找不到任何允许我在lexer操作中更改令牌值的内容,并且查看生成的代码,看起来lexer操作中没有任何公开的内容允许这样做
我是否遗漏了一些内容,或者我需要在应用程序代码中处理这些内容?您可以这样做:
IDENT : [a-zA-Z]+ { setText(getText().toUppe
我对语法中的空格有意见
下面是一个仍然存在问题的最小语法:
sourceUnit
: ( foo ) EOF ;
foo
: (Identifier ':' Identifier)
;
StringLiteral
: '"' DoubleQuotedStringCharacter* '"'
;
DoubleQuotedStringCharacter
: ~["\r\n\\] | ('\\') ; // The problem is in here somewher
当前ANTLR4的TestRig工具支持-gui选项来解析整个输入文件并以图形方式显示整个结果解析树。我们是否可以首先获取解析树,修改它并调用一些API以图形方式显示解析树的子集/子树
我的输入源文件很大,无法查看TestRig显示的标准解析树。更重要的是,我想过滤掉很多不相关的语法,集中精力验证我需要测试的语法。但是很难从TestRig提供的标准大型解析树中找到一小段信息。您可以调用解析树中的任何非终端来查看该子集。此外,ANTLR的下一个版本在树GUI上包含一个Save to PNG按钮,该
我使用ANTLR4编写Fortran解析。现在我得到了解析树(ANTLR4中没有AST)。我的下一步工作是根据需要修改解析树,例如插入新的数据声明语句和替换当前语句。我在ANTLR java API文档中查找了addChild,但在RuleNode中似乎没有这样的方法。那么我该怎么办呢?一种方法是将代码嵌入语法文件中。这让事情变得一团糟
另一种方法是在单独的文件中编写类,在规则的@parser::members{…}部分或操作部分中创建所需的对象,并使用它们从语法中获取详细信息。这样,您将从语法
我正在尝试匹配Antlr4中的以下行:
约翰或苹果和约翰·史密斯或苹果酱
我使用以下规则:
conjunction : WORDS OR WORDS ;
WORDS: [A-Za-z ]+ ;
OR: ' or ' ;
但是antlr找到的第一个单词也包括'or'。因此,它并不认为约翰和苹果是由或分隔的两个不同的词
如何解决此问题?如果2个或多个lexer规则匹配相同数量的字符,则规则define first将获胜。换句话说,对于输入的或,可以匹配规则单词和或。既然单词是首先定义的,它就赢了
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]
我想写一个关于月份和年份的lexer规则,规则是(带正则表达式):
“hello”和“ever”文本仅用于调试
也就是说,一个或两个数字表示月份,两个或四个数字表示年份。更重要的是,今年的部分可能会被忽略
例如:
2015年8月->hello08ever2015或hello8ever2015或hello8ever15或hello8ever或hello08ever;
2015年10月->hello10ever2015或hello10ever15或hello10ever15
我的lexer规则如下(
我用这个词作为我自己语法的灵感。我想到了一件我不太明白的事。为什么不使用数据类型时会有Lexer规则?例如规则Double:'Double'从未被使用,但解析器规则类型说明符:('double'|…)(其他数据类型已删除以简化)用于多个位置。解析器规则类型说明符没有使用lexer规则Double有什么原因吗?该页面上的所有语法都是自愿提交的,不是ANTLR4的一部分。这显然是一个错误,但按照lexer规则的匹配方式,它不会对lexer产生影响。您可以选择实现显式规则:
Double : 'dou
我有这样一段语法片段
expr: left=expr '=' right=expr #exprassign
| atom #expratom
;
atom: TEXT
| ID
;
TEXT: '\''(.)*?'\'';
ID:[A-Z]+;
用我的访客方法
visitExprAtom()
如何找到当前的getparent上下文。假设我的方法在左边起作用,从左边说,从右边说
我需要改变我的方法,当我知道它是从左还是从右
谢谢
编辑:
假设我有一个代
我正在尝试解析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
使用ANTLR 4.7.1考虑以下简单语法
grammar Grammar;
ID: [a-z];
DOT: '.';
LPAREN: '(';
RPAREN: ')';
SEMICOLON: ';';
LT: '<';
GT: '>';
term
: ID LT ID GT LPAREN expr RPAREN # CallExpr
| ID # Id
| LPAREN expr RPAREN
我正在为一种语言创建一个antlr4语法,该语言具有多种变量声明前缀的可能性,例如,变量声明可以是以下任意一种:
IDENTIFIER
PREFIX1 IDENTIFIER
PREFIX2 IDENTIFIER
PREFIX1 PREFIX2 IDENTIFIER
PREFIX2 PREFIX1 IDENTIFIER
前缀是可选的,可以按任何顺序排列,但最多一个
如果我有一个规则:
var_declaration: (PREFIX1 | PREFIX2)? IDENTIFIER;
然后它将不
我正在通过ANTLR创建一种语言,我想发布给用户使用
有没有工具可以为我的语言创建自动化或半自动化文档
我想做一个像这样的文档
最后,我就像巴特和迈克说的那样,没有这样的工具可以帮助创建简单的文档。我从未见过这样的东西/工具。像巴特一样,我不知道有任何工具可以生成接近完整文档的内容(可能是因为,你需要的不仅仅是语法方面的信息),但是看看VS代码ANTLR插件。它可以生成记录所有规则的“铁路图”,我怀疑它们是你文档中的一个很好的补充。
我有以下语法
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 : '(';
我正试图为R6RS编写lexer/parser,但我被数据跳过注释所困扰
以下是我的lexer/parser规则的一部分:
BOOLEAN: '#t' | '#f' | '#T' | '#F';
NUMBER: DIGIT+; // TODO: incomplete
CHAR: '#\\' CHARNAME | '#\\x' HEXDIGIT+ | '#\\' . ;
STRING: '"' STRELEMENT* '"';
IDENTIFIER: INITIAL SUBSEQUENT* | P
我在这里使用C语法:解析表达式inta2=5。ANTLR版本是4.3
这里的“5”匹配一个非常大的规则链:initializer->assignmentExpression->conditionalExpression->logicalOrExpression->logicalAndExpression->。。。大约还有10个->primaryExpression->5个
虽然解析最终是正确的,但这似乎是语法中的一个错误。有人能建议修复或澄清吗
不,这不是错误。树越低意味着操作符的优先级越高
编
我一直在玩ANTLR4,试图转换一个ANTLR3项目
我已经从来自官方存储库的ANLTR4语法生成了一个lexer、一个解析器和一个visitor类。在visitor中,我使用visitor提供的ctx调用我的一个类:
myFunction(ctx.getChild(0))
然后,在myFunction中,我想检索具有特定类型的第一个子项,因此我尝试执行以下操作:
final ParseTree classNameElement =
(ParseTree) ((Gram
在下面的lexer解析器中,
从选项卡中选择AAA
可以分析,但
从选项卡中选择角色
无法分析,出现错误。
第1:7行输入“角色”不匹配,需要ID
“角色”与lexer规则的名称相同这一事实似乎是导致错误的原因。
但是,我想将“角色”与
ID:[A-Z]+
不想得到一个错误。
有没有办法解决这个问题
lexer grammar TSqlLexer;
FROM: 'FROM' ;
ROLE: 'ROLE' ;
SELECT:
我想匹配表单的输入::
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
我的.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
有没有一种简单的方法来终止lexer
有些代币我还不想处理。但是,如果输入中确实包含这些令牌,我还希望Lexer发出警报。我的简单策略是在操作中抛出RuntimeException:
CHARIZING: '#@' {throw new RuntimeException("charizing op not supported yet");};
但是该操作会产生编译错误,因为生成的Lexer在该操作之后有一个break命令,Java编译器会抱怨break是一个无法访问的语句
CPPDefine
以下是先前ANTLR版本的相关主题:
使用lexer规则,如:
R1
: [a-zA-Z0-9]* ';'
;
例如,我有以下输入文本:
test;rezrezr
zrezrzerz
它将匹配测试;这是正确的。我只需要测试字符串
我需要照顾'吗例如,在自定义侦听器中手动输入字符?或者有没有一种方法可以在语法中指定我只想使用lexer规则来避免它
更新
如果你想避免这种情况;字符,只需将其从lexer规则中删除即可。注意,我还将*改为a+,以确保R1永远不是零长度令牌
R1
: [a-zA
问:在Antlrv4中,有没有一种(更直接的)在解析时构建自定义解析树的方法
我想我们可以遍历并重写自动构建的树,但我想知道我们是否仍然可以在解析时手动构建树(或者调整树)(类似于ANTLR v3和ealier)。这个想法是,根据编写语法的方式,我们在ANTLR构建的树中得到了很多无用的节点,虽然我知道您只能覆盖您感兴趣的侦听器方法,但仍然需要检查和跳过无用的令牌类型,等等。否,我们对Antlr3的经验是,手动AST特性不可避免地导致代码更难维护和理解,从而导致开发人员在对语法进行任何更改时出现
我正在解析一种类似SQL的语言,解析注释时遇到问题。
我们的想法是忽略它们
我有以下规则:
NEWLINE: '\r'? '\n' -> skip
WS : [ \t]+ -> skip
我怎么能忽略:
介于“--”或“#”和下一个“\n”之间的所有内容
“/”和“/”之间的所有内容(斜杠+星号直到星号+斜杠-星号不知怎么消失)
在WS和NEWLINW之前,我尝试过类似的方法:
COMMENT1 : ('--'|'#') ~'\n'* -> skip;
没有
标签: Antlr4
stringtemplateantlr2
我有一个用antlr2语法编写的语法文件,需要帮助理解如何用antlr4语法重写一些解析器规则。我知道antlr4消除了构建AST的需要,因此我不确定如何处理AST操作翻译的规则。解释了一些语法以及如何使用#构造,但我仍然不确定如何阅读这些规则并重新编写它们
temp_root :
temp { #temp_root = #([ROOT, "root"], #temp_root); } EOF;
temp :
c:temp_content
{ #temp
我对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
要复制的最小语法:
grammar GeneralSearchQuery;
id : ID;
ID : ('A'[A-Z0-9]+);
anystring: ANYSTRING;
ANYSTRING: ~[ \t\r\n"\\'():^]+;
问题在于“anystring”规则。如果我删除任何id/id规则,那么奇怪的解析就会消失
其目的是匹配除某些有意义的字符外的任何字符(unicode、非unicode)
据我所知,它是这样分解的:
~ Negate the follow
我有一个语法,它应该区分ID、INT和IP地址。我的语法有更多的模式需要识别,但我正在努力解决的是像“123abc”这样的标记
通常语法会定义WS:[\t\r\n]+->skip;它会忽略空格,所以在我的语法输入中,像'123abc'会变成'123'和'abc'。这是lexer的正确行为。但是,我希望在这种情况下解析失败
我在SO和其他一些网站上也看到过类似的问题。我提出了一个可行的解决方案(如下),但在我看来,应该有更好的办法。我想知道是否有人能提出这样的建议
以下是我的(简化)工作语法:
g
我正在用ANTLR4编写一个DSL,现在我有一个右括号结尾的问题。为什么这个命令无效
这是命令:
set(buffer,variableX|"foo");
包含错误的解析树
这是我的语法
grammar Expr;
prog: expr+ EOF;
expr:
statement #StatementExpr
我在网上找不到任何能很好地描述这一点的好资源。“令牌类型”是指我们在编程语言中遇到的类型,如int、string、char等吗。?我知道它是一个整数,但这个整数是什么意思?什么是词汇表?寻找一些简单的最低语法解释。标记类型和词汇的概念非常简单,可能没有人想过正式描述它们。但这是:
在词法转换过程中,词法转换程序将数字分配给部分输入文本。这意味着在输入中的特定模式和任意数字之间创建映射。此号码称为令牌类型
语法中的lexer规则描述必须匹配的模式,lexer规则名称是根据匹配的输入创建的令牌的文本
我正在开发一个简单的Xquery处理器,并使用Antlr4解析语法。我使用访问者模式遍历解析树。现在,如果查询满足某些条件,我想重写一个查询。如果查询直接使用诸如“join”之类的关键字并符合“join”语法,处理器现在可以处理查询
如果查询可以更改为联接查询,我想首先重写解析树,否则什么也不做。有没有办法手动操作解析树?比如添加一个规则上下文或者构造一个新的解析树 对于Antlr4,惯用的方法是用分析产品装饰树节点,而不是改变树结构。也就是说,可以使用一个或多个树漫游来识别和标记可以合并为联接
我试图解析MS的SQL方言。根据规范,“top”的表达式必须用括号括起来
选择顶部(@rows*2)a、b、c从
但作为例外,如果值是无符号文字整数,则可以忽略这些值,因此
从以下位置选择前75名
我尝试在解析器中嵌入这个文本整数特例(松散地):
top_子句:'top'[0-9]+|'top'('expression')
因此,第一种选择是纯词法规则,第二种选择是解析器规则。因为整型常量是一个有效的表达式,所以它选择将其解析为表达式
问题是,1)我可以强制它作为没有谓词的lexer规则进行匹配
我正在尝试使用以下标准ANTLR设置代码块为Java的String类构建解析树。我使用的是antlr4存储库上发布的标准Java8.g4语法(完整代码可在上获得)
输出为:
Building the parse tree...
Built the parse tree...(took 21 seconds)
我试着跑了好几次,我发现这需要20多秒。
花这么长时间是正常的吗?我的设置是否有问题?有没有办法加快解析树的构建速度
要观察计算机上的问题,请执行以下命令:
git clone https
我正在将SystemVerilog语法从ANTLR2.7.7移植到ANTLR4.7
SystemVerilog从Verilog继承了大量指令。它们几乎可以出现在源代码的任何地方。因此,它们不能由
解析器。有些是由lexer解释的,永远不会深入(控制源代码加密),有些是用于预处理器(宏、条件编译等),但也有一些超出了该阶段。这些需要解析器和处理它们的直接令牌源之间的双向通信。当解析器遇到可能受这些指令影响的构造时(当访问者用于操作时,解析器需要请求这些信息以将其作为上下文的一部分记住),解析器会询
我想要一个语法,其中过滤器可以是操作或由|连接的任意数量的过滤器。我的语法是这样的:
filter
: filter ('|' filter)+ #pipedFilter
| OPERATION #operation
;
OPERATION
: [a-z]+
;
(这是一个简化的示例,将有其他方法对过滤器进行分组,这些方法的优先级与管道不同)
在类似于xxx | yyy的输入中,这工作正常,我们得到:
FILTER: [
OPERATION
1 2 3 4 5 6 ...
下一页 最后一页 共 15 页