ANTLR4书引用了一个多模式示例
与
有没有我不见的安特福?这是在使用antlr4 maven插件
wiki提到了一些类似的内容,但我的阅读方式与github上的示例和使用时的轶事经历相矛盾,出现了以下情况之一:
您忘记在ModeTagsLexer.g4中更新OPEN规则以使用以下表单:
OPEN : '«' -> mode(ISLAND) ;
您在Antlr4中发现了一个bug,应该向管理员报告
您是否指定了ANTLR在读取语法时应该使用的文件编码?欧洲字符少于255应该没问题
在anltr4 java语法()中,我想知道何时有完整的表达式。在本例中,我尝试进行类似以下的转换:
from: String foo = bar + ", " + baz + "; are true";
to: String foo = String.format("{0}, {1}; are true", bar, baz);
问题从语法的声明开始:
expression ('+'|'-') expression"
这也是一个表达的孩子。鉴于上述示例,回调将类似于以下内容:
0:
一、 我试图将antlr4与语法一起使用,以实现idl文件应该遵循的一些检查。一条规则是关于名字的。规则如下:
ID仅包含字母、数字和符号下划线
我以一封信开头
ID以字母或数字结尾
ID不是艾达、C、C++、java、IDL中的保留字
执行此检查的一种方法是编写一个函数,用于检查这些属性的字符串,并在每个具有ID的规则的出口侦听器中调用它。例如,在exitConst_decl()、exitInit_decl()、exitSimple_declarator()和许多其他位置中(参考IDL.
我有一个非常简单的语法,它试图将“é”与标记E_代码匹配。
我已经使用TestRig工具(带-tokens选项)对其进行了测试,但解析器无法正确匹配它。
我的输入文件是用UTF-8编码的,没有BOM,我使用的是ANTLR版本4.4。
其他人也可以检查一下吗?我在控制台上获得了以下输出:
第1行:0“Ă”处的令牌识别错误
grammar Unicode;
stat:EOF;
E_CODE: '\u00E9' | 'é';
我测试了语法:
grammar Unicode;
stat: E_
我试图在lexer中使用语义谓词来预测一个标记,但不知何故,我无法正确地得到它。以下是我所拥有的:
词汇语法
lexer grammar TLLexer;
DirStart
: { getCharPositionInLine() == 0 }? '#dir'
;
DirEnd
: { getCharPositionInLine() == 0 }? '#end'
;
Cont
: 'contents' [ \t]* -> mode(CNT)
因此,我正在使用ANTLRWorks 2.1在ANTLR4中编写一个组合语法。我有lexer规则Identifier和Block,它们没有被识别为已定义的lexer规则,但仅在定义的最后一个解析器规则中。在这些规则之后添加文字将删除(或隐藏)这些错误
我的语法结尾有错误(斜体标记抛出错误):
语法组合;
选项{language=Cpp;}
@lexer::命名空间{AntlrTest01}
@解析器::命名空间{AntlrTest01}
/*第一Lexer级*/
位:“0”|“1”;
数字:“0
我有一个antlr语法,其中嵌入的操作用于自底向上收集数据并构建聚合数据结构。下面给出了一个简短的版本,其中只打印聚合的数据结构(即在这个简短的示例代码中没有为它们创建类)
由于antlr的目标之一是保持语法文件的可重用性和动作独立性,因此我尝试从该文件中删除动作并将其移动到树漫游器。我第一次尝试使用以下代码:
public class Main {
public static void main( String[] args) throws Exception
{
Sampl
我想解决以下歧义:
grammar test;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ -> skip;
program
:
input* EOF;
input
: '%' statement
| inputText
;
inputText
: ~('%')+
;
statement
: Identifier '=' DecimalConstant ';'
我正在开发一个简单的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解释的,永远不会深入(控制源代码加密),有些是用于预处理器(宏、条件编译等),但也有一些超出了该阶段。这些需要解析器和处理它们的直接令牌源之间的双向通信。当解析器遇到可能受这些指令影响的构造时(当访问者用于操作时,解析器需要请求这些信息以将其作为上下文的一部分记住),解析器会询
我必须定义一个表示以下语句的规则:{x in y | x>0}。
对于理解“x在y中”的第一部分,我有子规则:
FIRSTPART: Name "in" Name
,而名称可以是一切
我的问题是我不想有贪婪的行为。因此,它应该解析到“|”符号,然后停止。由于我是ANTLR4的新手,我不知道如何实现这一点
请注意,通常,lexer/parser规则应该表示源输入流的允许语法
源如何匹配任何规则或子规则的评估(以及结果)是一个语义问题——输入是否匹配特定子规则,以及这是否应该控制规则的最终评估方式
我尝试用ANTLR4编写我的第一个解析器。我在一个已经更大的grammerfile中使用的规则之一应该是匹配2个数字作为2D点。下面是语法的简化示例:
grammar example;
WS: [ \t\r\n]+ -> channel(HIDDEN);
INT: [0-9]+;
FLOAT: [0-9]*'.'?[0-9]+ ;
IDSTRING: [a-zA-Z_] [a-zA-Z0-9_]*;
NUMBER: (INT | FLOAT) ;
id: IDSTRING;
num:
我正在使用ANTLR在Java中创建一个解释器。我有一个语法,我已经使用了很长时间,我已经围绕这个语法生成的类构建了很多代码
语法中的“false”定义为文字,变量名也有定义,允许从数字、数字、下划线和点构建变量名(见下面的定义)
问题是-当我使用'false'作为变量名时。
varName.nestedVar.false。将false标记为false文本的规则优先
我试着用我在互联网上找到的所有东西玩空白。当我删除空白:[\t\r\n]->通道(隐藏)时的解决方案和在每个规则中使用显式WS*或
ANTLR4 ATN中原子跃迁、集合跃迁和ε跃迁之间的区别是什么?在网上找不到任何定义。你找不到任何定义,因为这是大多数人都不感兴趣的内部细节
不同的转换类型主要用于指示ATN行走算法处理它们时要匹配的条件。其中有10个:
ε:一种无条件且不消耗输入的转换。步行者只是跳过了他们。
范围:可能是集合转换的旧版本,不用于ANTLR4。唯一的区别是,Range采用要匹配的范围的起始值和结束值,而Set采用间隔集。
规则:解析器ATN中的ε转换为子规则。不消耗任何东西。
谓词:以附加谓词作为条件的ε转换
我想匹配表单的输入::
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规则名称是根据匹配的输入创建的令牌的文本
我是ANTLR的n00b,通过尝试在ANTLR4中运行ASN.1解析器,我变得越来越强大。我目前正处于将输入文件传递给grun的阶段,并看到类似“第1行:12029输入时没有可行的替代方案…”这样的错误
我试图将这与我的规则中的一些问题联系起来,但是通过字符计数定位有问题的输入是一个挑战。ANTLR解析器将输入视为一行是正常的,还是因为规则问题(我在OSX系统上)而无法识别EOL?如果将输入视为一个长行是正常的,有人能推荐一种工具来定位文件中给定的字符位置吗?您的代码是否只使用\r行结尾?ANT
如何将带有子树的ParserRuleContext展平为令牌数组?ParserRuleContext.getTokens(intttype)看起来不错。但是什么是t类型?是令牌类型吗?如果要包括所有令牌类型,使用什么值?parseruleContext.getTokens(int ttype)仅检索父节点的某些子节点:它不会递归进入父树
然而,写下自己的话很容易:
/**
*按顺序从{@code tree}中检索所有标记。
*
*@param树
*要从中获取所有令牌的解析tee。
*
*@按顺序
是否有任何方法可以使用Antlr4Java7语法来解析java8文件,而无需对java.g4语法文件进行太多更改。据我所知,从java7到java8的语法变化是lambda表达式语法和双列运算符。我能够合并lambda表达式,但在当前语法文件中包含双列运算符似乎有点复杂 您是否尝试过ANTLR repo中的Java8语法:?是的。但我不能简单地从Java7迁移到Java8。我已经编写了一套API,它依赖于Java7语法的规则名称。我一直在寻找的是将Java8新引入的语法元素合并到我现有的Java
我试图获取关于标记文本位置的信息:开始/结束行和列
好的,使用令牌API中的getCharPositionInLine和getLine,我可以得到一些我需要的东西。这有助于我获取结束信息。但是,令牌流中的最后一个令牌呢?如何获取最后一个令牌的最后一列和最后一行
也许在课文中计算换行,但我不喜欢
提前感谢。令牌流中的最后一个令牌是长度为0的EOF令牌。该标记的行和列是流中最后一个真实标记的结束行和列。我猜是这样的。非常感谢。
lexer操作中的getText()似乎无法检索正确匹配的令牌。这是正常的行为吗?例如,我的部分语法中有以下规则
解析支持U-Unode的C++样式标识符,将Unicode字符嵌入标识符名称的一部分:
grammar CPPDefine;
cppCompilationUnit: (id_token|ALL_OTHER_SYMBOL)+ EOF;
id_token:IDENTIFIER //{System.out.println($text);}
;
CRLF: '\r'? '\n' ->
我需要得到每个规则的开始和结束索引。即,开始索引是属于规则的第一个令牌的第一个字符的字符位置,结束索引是属于规则的最后一个令牌的最后一个字符位置。有了这些数字,我可以精确地从输入文件中裁剪出规则的结果
这样做的直接方法应该是使用$start和$stop标记,即$start.getStartIndex()和$stop.getStopIndex()。但是,我遇到了$stop标记经常是null,即使在@after操作中使用
根据确定的Antlr4参考,$stop标记定义为:“要匹配的最后一个非隐藏通道
我必须解析文件中有表达式的部分,如:
garbage garbage garbage
BEGIN <something> END
garbage garbage...
它正确地解析了我的表达式,如果它是我文件中唯一的东西的话。遗憾的是,当我在文件中遇到BEGIN时尝试踢解析器时,解析器将正确地解析表达式,但随后将尝试在结束后获取其他标记
我已经阅读了ANTLR4书中的abiut Fyzy语法部分,但这不是我想要的,因为解析的结果基本上会影响文件的其余部分,解析的结果将产生一组替换,
我正试图为现有的DSL构建v4语法,但我有点不知所措。我想尽一切办法都试过了,但运气不好。我们可以有一个函数调用,比如foo(param1,param2),我一直在工作。有一个可选的构造,比如foo(y,z)x100这意味着要调用fx 100次(x是文字标记,很好的选择,嗯!)这是我无法实现的
我的func_调用现在看起来像这样:func_调用:标识符'('arg_list')
添加(('x'|'x')expr)及其变体无效。它开始被名为x的变量所迷惑
如果有帮助的话,这种语言的旧yacc语法有
鉴于这种语法:
grammar ColonTest;
main : statement* EOF;
statement : NUM_LITERAL expression SEMICOLON;
expression : primary (MULT_OP primary)*;
primary : WORD+;
NUM_LITERAL : [0-9]+;
SEMICOLON : ';';
MULT_OP : '*' | '/'; // | ':';
WORD
现在,如果标记只包含一个替代项,则ANTLR不会返回Lexer标记名,例如,对于标记SUZY:'SUZY''Suzy'将在解析树中进行编码
现在,我使用标记名来编码一些有用的信息,例如,SUZY_GENDER_femal:'SUZY'
到目前为止,我已经找到了两种解决方案来获取令牌名称,即使令牌只包含一个备选方案:
在标记中重复相同的选项:SUZY_GENDER_femal:'SUZY'|'SUZY'
使用fragment关键字:
这两种解决方案都有效,但并不理想。我正在研究ANTLR实现,以一
于20年10月25日更新
我有一种面向记录的文件格式,其中('\r'?'\n'|'\r')[即换行符]可以是字符序列的终止,也可以是两个记录之间的分隔符。每个记录中都有自由文本
我面临的两个问题是:
如果我在文本定义中包含数字和标点符号,则时间戳将停止识别
我想处理分隔两条记录的换行符,它与换行符终止换行符不同
我想分析这个简单的文件格式:
1
00:00:01,123 --> 00:00:10,000
First caption is here
Second caption is here
我想在解析树中插入新节点,我的解析器在访问该树时刚刚得到该节点。该位置可能是当前节点的父节点或同级节点,或者就在它之前,因此我需要通过调用ParseRuleContext中的getParent和getChild方法来检查是否存在与新节点的规则名称匹配的节点getParent返回ParseRuleContext,但getChild返回ParseTree。为什么这两个方法返回不同的类型
顺便说一句,当前节点也可能被新节点替换
在解析树上实现这种修改的最佳方法是什么?谢谢 ANTLR 4中的解析树由终
我有下面的antlr4 lexer语法,目标是在字符串不以“-”开头的情况下从字符串生成一个标记字符串_模式
我正在使用来实现一个前瞻性测试
因为我想为字符串的lexer本身添加更多的代码,并且想添加其他前缀,而不仅仅是应用不同规则的“-”,所以我想立即推一个模式并继续那里的lexer
lexer grammar StrStrLexer;
@members {
public boolean testAssertion(int assertionMode, int passingRule)
我的语法在使用“pushMode”和“popMode”时失败,但在使用“mode”时有效
此语法结构有效:
TAG: '{' -> pushMode( TAG_MODE ), skip;
TEXT: ~[{]+;
mode TAG_MODE;
TAG_COMMENT: '*' -> skip, mode( COMMENT_MODE );
mode COMMENT_MODE;
这是我的图像结构ANTLR 4解析树gui:
这是我的侦听器规则声明:
public void enterDeclaration(ADTCParser.DeclarationContext ctx) {
TokenStream tokens = parser.getTokenStream();
String initDeclarationList = tokens.getText(ctx.initDeclarationList());
}
要从initDecl
我正在用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
我的语法有这些规则
expression
: expression EQ conditionalOrExpression #eqExpr
| expression NEQ conditionalOrExpression #neqExpr
| expression LT conditionalOrExpression #ltExpr
| expression GT condit
为了让我的雇主相信ANTLR和StringTemplate的好处,我首先用Java构建了一个小演示。但是Java不是我们喜欢的语言之一,所以我把它翻译成了C。使用VS2015(社区版)和网上的各种说明,我只得到了目前为止。我现在明白了
自版本4.3起,ANTLR无法生成“org.ANTLR.v4.codegen.CSharp\u v4\u 5\u 2Target”代码
不兼容的版本?哪些版本的库与成功构建兼容。我不知道如何使用GitHub。似乎没有可下载的软件包,我也看不到如何下载一组要编译的文
我正在尝试使用ANTLR4获得一个简单的语法。基本上是由分隔的关键字列表可以使用Not进行否定。例如,类似这样的事情:
Not negative keyword;positive
我写了以下语法:
grammar input;
input : clauses;
keyword : NOT? WORD;
clauses : keyword (SEPARATOR clauses)?;
fragment N
我正在解析PDF流。在关于文字字符串对象的第7.3.4.2节中,说明应忽略文字字符串中未后跟行尾字符、一到三个八进制数字或其中一个字符“nrtbf()\”的反斜杠。有没有办法让我的lexer中的recover方法在这种情况下忽略反斜杠
以下是我的简化解析器:
parser grammar PdfStreamParser;
options { tokenVocab=PdfSteamLexer; }
array: LBRACKET object* RBRACKET ;
dictionary:
我有一个查询语法,我正在工作,并发现了一个案件,是证明难以解决。下面提供了复制语法的最低版本
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构建一个语法,它应该能够将中间解析结果存储为变量,以便以后使用。我考虑使用一个关键字,比如as(或者德语als),它将触发此存储功能。除此之外,我还有一个通用令牌ID,它将匹配任何可能的标识符。
存储能力应该是用户的选择。因此,我使用的是?在我的语法定义中
我的语法如下:
grammar TokenTest;
@header {
package some.package.declaration;
}
AS : 'als' ;
VALUE_ASSIGNMENT : A
1 2 3 4 5 6 ...
下一页 最后一页 共 11 页