这是我在从antlr3迁移到antlr4时面临的另一个问题。这个问题与处理规则的条件组件的java操作代码有关。下面是一个例子
以下语法+代码在antlr3中起作用。这里,如果一元运算符不存在,则返回值“0”,java代码检查该值并采取适当的操作
exprUnary returns [Expr e]
: (unaryOp)? e1=exprAtom
{if($unaryOp.i==0) $e = $e1.e;
else $e = new Expr
我知道Antlr4有EOF关键字来表示文件的结尾
在哪里可以看到这些关键字的完整列表
我在这里看不到EOF:虽然免费的在线文档可能有点稀疏,但相关部分是
其他资源包括帕尔的《极力推荐》一书、该书本身以及该报告中的其他示例语法。虽然免费在线文档可能有点稀疏,但相关部分是
其他资源包括帕尔的《极力推荐》一书、其本身以及该报告中的其他示例语法。EOF不是一个关键字,而是一个标记值。这样的预定义值很少,发现它们的最佳位置可能是源代码。有:
EOF唯一预定义的令牌值
默认\u令牌\u通道用于放置令牌的主通
标签: Antlr4
associativityleft-recursion
以下语法说明了这个问题:
// test Antlr4 left recursion associativity
grammar LRA;
@parser::members {
public static void main(String[] ignored) throws Exception{
final LRALexer lexer = new LRALexer(new ANTLRInputStream(System.in));
final LRAPa
我正在尝试访问规则的属性。尽管此虚拟规则存根有效:
statement returns [List listOfTerms]
: statement booleanOperator statement {$listOfTerms=new ArrayList();}
| delimited {$listOfTerms=getTerms($delimited.text);}
;
这会引发Arra
我在lexer语法文件中编写选项{filter=true;},并用ANTLR4编译它。
上面说
“过滤器”似乎只适用于ANTLR3
我查了维基,找不到答案。
“筛选器”关键字不在源文件中
要么
我如何解决这个问题?在ANTLR 4 lexer语法中没有过滤器选项。但是,很容易模仿这种行为,如下所示:
lexer grammar L;
RULE
: [a-zA-Z]+
;
FILTER
: . -> skip
;
这相当于ANTLR 3 lexer语法:
lexer gramm
考虑到我的语法/访问者,我想知道为什么lexer(和解析器)乐于接受表达式“setvalue(2@)”。我肯定我做错了什么
下面是一个小样本,可以说明这个问题
非常感谢您的帮助
grammar ExpressionEvaluator;
parse
: block EOF
;
block
: stat*
;
stat
: assignment
;
assignment
: SETVALUE OPAR expr CPAR
;
expr
: atom
我使用的是Visual Studio下的Antlr4,C版本。工作得很好
AFAIK(但我可能错了)听众和访问者也被用于类似的任务
那么,如何在两者之间做出选择呢?或者我可以两者都用?请注意,我找到的所有示例都使用Listener或Visitor,但不是两者都使用…在我看来,Visitor是一个不错的选择,因为您可以完全控制遍历
这里引用的是《权威的ANTLR 4参考》一书
侦听器和访问者机制之间的最大区别在于,侦听器方法由ANTLR提供的walker对象调用,而访问者方法必须通过显式的访问调用
标签: Antlr4
context-free-grammar
我已经尝试过制作一个语法来理解类C语言的表达式优先级:
var a = expression0.expression1(expression2 + expression3() * expression4)
当正确排列优先级时,将变为:
var a = (expression0.expression1)(expression2 + ((expression3()) * expression4))
为了实现这一点,我将表达式按优先级排序为规则。以下是我语法中的相关摘录:
expression:
我正在尝试创建一个语法来帮助我解析如下字符串:
[你好:/c=0.3//a=hi/][what:/c=0.4/][are:/c=0.6//a=is/]
这是我的语法:
grammar MyGrammar;
WS: [ \t\r\n]+ -> skip; // skip spaces, tabs, newlines
sentence: WORD+;
WORD: '[' WORD_DESCRIPTOR ']';
WORD_DESCRIPTOR: WORD_IDENTIFIER ':' W
我在理解“ReportAttentingFullContext”和“reportContextSensitivity”时遇到了一些困难,在语法中避免出现论文时也遇到了一些困难。这里有一个例子:
IF L_COUNT > 0 THEN
LINEFEED;
END IF;
下面是我的语法摘录:
if_statement
:
IF plsql_condition THEN
seq_of_statements? elsif_statement* else_statement? E
我创建了一个类似于VisualBasic的解释器,现在添加了一些变量范围。
我的信息来源是权威Antlr参考的CH8及其附带代码。
基本上,示例使用侦听器,我的代码使用访问者
如果有人能澄清或纠正我对事物的理解,我将不胜感激:
就范围而言,我应该使用侦听器模型(根据Cymbol示例一书)首先遍历一棵树,通过覆盖与我需要捕获范围更改的函数和块相关的适当的输入/输出函数来创建范围/变量信息。其次,创建了作用域之后,我是否要访问树来运行程序?e、 g.如果我有VisitEnterFunction和Vi
我是ANTLR和ANTLRWorks的新手,所以我对这一点很困惑:
我正在使用ANTLRWorks 2.1创建语法,并随后创建lexer和parser(Java目标)。然后,我创建了一个小型Eclipse项目,并从ANTLRWorks导入了ANTLR4 JAR,以手动调用lexer和解析器,如ANTLR书籍示例中所述。运行应用程序时,我会遇到以下异常:
Caused by: java.lang.UnsupportedOperationException: java.io.InvalidClass
我正在使用Antlr4.5为一种具有几种特殊注释格式的语言构建一个解析器,我希望将其流式传输到不同的通道
antlr 4.5似乎已经扩展了一个新的结构,用于声明额外的lexer通道:
从文档中摘录
从4.5开始,您还可以像枚举一样定义通道名称
使用lexer规则之上的以下构造:
通道{WSCHANNEL,MYHIDDEN}
我的词法分析和解析规则位于单个文件中,我的代码如下所示:
channels {
ANNOT_CHANNEL,
FORMAL_SPEC_CH
给定以下示例,我有一个需要匹配的语法:
some-Text->more-Text
从这个例子中,我需要ANTLR4词法规则,将“一些文本”和“更多文本”匹配到一个词法规则中,并将“->”作为另一个规则
我使用如下所示的lexer规则作为起点,但问题是,NAMEDELEMENT规则中允许使用“-”字符,这会导致第一个NAMEDELEMENT匹配变成“some Text-”,然后导致边规则无法捕获“->”
我正在寻找一种方法,以确保在NAMEDELEMENT规则(或产生所需结果的其他替代方法
例如,我在语法中定义了几个lexer规则:
INT: 'int';
FLOAT: 'float';
...
DIGIT : [0-9];
NUMERIC : (DIGIT+ | DIGIT+ '.' DIGIT+ | '.' DIGIT+ | DIGIT+ '.');
...
我需要以某种方式标记关键字('int','float',和其他一些),当我使用TokenStream获得令牌时,我可以通过一些自定义符号过滤它们
有可能吗
现在我只看到一种方法——将必要的词法组合成某种规则
更新
我尝
使用PredictionMode::LL_EXACT_AMBIG_DETECTION时,我会收到以下错误消息:
line 186:7 reportAttemptingFullContext d=30, input='ON REPORT HEAD
我如何解释d属性。它引用了我语法中的一条规则吗?我怎样才能找到它
根据守则:
@Override
public void reportAttemptingFullContext(@NotNull Parser recognizer,
@NotN
我有以下代码:
varDeclaration
: type ID ('=' expression)? ';'
;
因此,并非总是('='表达式)存在。但是,有时候,我想处理这个部分,但不知道它是否存在于这个上下文中。我正在使用Antlr4(并且经常使用Listener),我怎么知道这一点
谢谢:)在您的侦听器(exitVarDeclaration)或访问者(visitVarDeclaration)中检查ctx.expression()==null。如果为null,则('=
几周前,我开始使用ANTLR4。我想知道是否有一种方法可以通过lexer忽略匹配的令牌,并将CharStream的索引位置重置为被忽略令牌的开始位置,以便可以通过其他规则(例如,不同模式中的其他规则)再次匹配它
非常感谢。这听起来有点像lesser命令,它是被提出的,但从未完全定义过:
现在,我将覆盖lexer中的nextToken命令
@Override
public Token nextToken() {
while (true) {
int mark = inpu
我需要处理这个序列:。
在ANTLR v3中,我使用了以下规则:
LPOINTY : ('<' REPEAT (PROBABILITY)? '>') => '<' // will consume only '<'
repeatOperator : LPOINTY_OR_ABNF_URI (XML_NM_TOKEN (weightOrProbability'>')?
在ANTLR v4中,不允许使用此运算符=>,因此我这样写:
LPOINTY_OR_ABNF
关于antlr4的几个问题使用了本书中未提及的词法谓词,例如使用先行(字符串),使用getCharPositionInLine(),使用\u input.LA(1),等等。\u input.LA(1)在本书中也使用过几次(如2014版的第212页和第228页)但对于它的确切作用没有任何解释。有可用的lexer谓词列表及其文档吗?这些不是lexer谓词。相反,它们是运行时对象上的普通方法:Token#getCharPositionInLine()和CharStream#LA(int)。文档在中提供
举一个(几乎)教科书上的例子,我们期望乘法优先于加法,但也包括一个可选的匹配部分
expr : expr '*' expr ('ALSO')?
| expr '+' expr
| INT
;
INT: [0-9]+;
WS : [ \t\r\n]+ -> skip ;
使用3*4+2尝试语法时,我们得到一个意外的树
expr:1
/ | \
expr:1
在ANTLR 4.8或5中,我们可以期望对相互左递归规则的支持吗?如果没有这个功能,编写规则似乎很难。直接左递归规则变得如此庞大,无法将其分解为单独的解析器规则。版本4.8已经不支持该规则,我非常怀疑在任何未来版本的ANTLR中是否会支持间接左递归
mytest.g4
lexer grammar mytest;
fragment HEX: '0' [xX] [0-9a-fA-F]+;
fragment INT: [0-9]+;
fragment WS: [\t ]+;
fragment NL: WS? ('\r'* '\n')+;
INFO: 'InfoFromDb' -> mode(INFO_MODE);
ID: 'ID from database' -> mode(ID_MODE);
mode INFO_MODE;
I
这是一个例子。ANTLR4无法识别此($类型)
Number //options { backtrack=true; }
: IntegerLiteral { $type = IntegerLiteral; }
| FloatLiteral { $type = FloatLiteral; }
| IntegerLiteral { $type = IntegerLiteral; }
;
这可以用什么来代替
谢谢。在ANTLR v4中,请执行以下操作:
Number
: In
我正在ANTLR4中重新实现现有的DSL。现有的源代码主体有一些非常大的表达式。似乎ALL(*)逻辑中的递归意味着我可以解析的表达式的大小有一个限制
示例语法:(刚好可以在此处复制错误错误)
样本输入:
V0 AND 0 OR
V1 AND 1 OR
... (MANY rows elided)
V3999 AND 3999 OR
V4000 AND 4000
堆栈跟踪:
Exception in thread "main" java.lang.reflect.Invoc
我完整的语法结果是可怕的“没有可行的选择”的化身,但无论如何,也许我看到的这个精简版本的问题的解决方案可以帮助我理解发生了什么
grammar NOVIA;
WS : [ \t\r\n]+ -> skip ; // whitespace rule -> toss it out
T_INITIALIZE : 'INITIALIZE' ;
T_REPLACING : 'REPLACING' ;
T_ALPHABETIC : 'ALPHABETIC' ;
T_ALPHANUMERI
我是Antlr4的新手,几天来一直在绞尽脑汁思考一个我根本不理解的行为。我有以下组合语法,希望它失败并报告错误,但它没有:
grammar MWE;
parse: cell EOF;
cell: WORD;
WORD: ('a'..'z')+;
如果我给它输入
a4
我希望它不能解析它,因为我希望它匹配整个输入字符串,而不仅仅是它的一部分,如EOF所示。但是它没有报告错误(我使用实现iantlerrorlistener接口的errorlistener侦听错误),并给出以下解析树:
(pars
我刚刚升级到C++ 4.7.2运行时源,当我在xCu码中构建时,我得到了警告
_startToken(startToken) will be initialized after _deleteConfigs(deleteConfigs)
这是NoViableAltException的第二个构造函数
显然,我可以在本地修复此问题。在我的环境中,警告被视为错误,但这可能应该传播回源树。我不知道是谁做的。您通常会使用fork,进行更改并从中创建pull请求。你需要有一个Github帐户
然而,在这
我用antlr创建了一种语言,但我对注释正则表达式有问题。在我的语言中,一行的注释以“$$”开头,多行的注释以“$$”开头,以“$$”结尾。我曾经
低于正则表达式
COMMENT : '$$'.*?'$$' -> skip;
LINE_COMMENT : '$$'.*?'\n' -> skip;
但有时无法正常工作。假设输入包含两行注释(在单独的行上)。第一条规则匹配从第一行的第一个“$$”到下一行的第二个“$$”的字符范围,因此lexer错误地返回一个块注释。我建议您像其他语言一
在Antlrv4中,我们如何像在VBA中一样使用双引号转义的双引号来解析这种字符串
正文:
"some string with ""john doe"" in it"
目标是识别字符串:某个字符串中包含“johndoe”
有没有可能重写它,把双引号变成单双引号“”->“?如下所示:
STRING
: '"' (~[\r\n"] | '""')* '"'
;
其中,~[\r\n“]|”“”表示:
~[\r\n"] # any char other than '\r', '\n' an
编辑:我已将此作为问题添加到ANTLR的github:
我正在使用取自的ANTLR版本4.3和C.g4解析以下代码:
语法将foo(a)解释为声明,但它应该是后缀表达式。我在这里粘贴了错误的解析树
在blockItem规则中,可以通过更改声明和语句的顺序来正确解释它。这样做会破坏其他东西吗
foo(a);是有效的声明,foo a;,还有表情。C11规范显示:
区块项目
:声明
|声明
;
ANTLR将其解释为解决声明中的任何歧义。没有符号表信息,无法解决此问题:(对我来说似乎也是一个bug。
如何处理antlr4 lexer中的嵌套注释?ie我需要计算此令牌中“/*”的数量,并仅在收到相同数量的“*/”后关闭。例如,D语言具有“/+…++/”等嵌套注释
例如,以下行应视为一组注释:
/* comment 1
comment 2
/* comment 3
comment 4
*/
// comment 5
comment 6
*/
COMMENT : '/*' (COMMENT|.)*? '*/' -> channel(HIDDEN)
我有一个lexer为传递给lexer的宏字符串的动态列表创建宏标记。我在顶级词法规则中使用了语义谓词来实现此功能:
MACRO: { macros != null && tryMacro() }? .;
其中tryMacro()只检查是否有宏字符串与输入序列匹配
这种方法的性能非常差,经过一些研究后,我尝试将lexer规则更改为以下内容:
MACRO: . { macros != null && tryMacro() }?;
这大大提高了性能,但我真的不明白为
我尝试在verilog解析器中获取编译器指令,它为我提供了真实的文件名/路径以及未预处理文件中的真实当前行
Verilog语言需要一个预处理过程,但在访问过程中,我必须知道当前文件名(不能通过include指令更改)以及非预处理文件中的真实当前行
预处理部分添加verilog指令'line,该指令指示当前文件和行。
然后,我将预处理的缓冲区发送到antlr Lexer,用访问者解析并提取所有verilog信息。我必须在verilog语法描述中保留verilog编译器的'line指令:
Prepr
我有以下代码片段(尝试粘贴整个语法,但由于某些原因无法让submit接受它):
fragment Y : 'y' | 'Y';
fragment Z : 'z' | 'Z';
fragment ATSIGN : '@' ;
这会产生以下错误:
error(50): Sql.g4:101:21: syntax
error: unterminated rule (missing ';') detected at '';
[ This is the line fragment Z : 'z' |
我已经看过了,但它只支持ANTLRv3.3。可以调整它以使用v4吗?我尝试用antlr4 js替换antlr-all.min.js,但没有成功。为了能够将DSL Forge与antlr v4一起使用,您需要一个可工作的JavaScript目标,这在AIK是不公开的。到目前为止,ANTLR最稳定的JavaScript目标是ANTLR v3.3附带的目标。为了能够将DSL Forge与ANTLR v4一起使用,您需要一个工作的JavaScript目标,它在afaik上是不公开的。到目前为止,ANTL
我有一条规则:
element
: first
| second
| first second
;
我可以稍微缩小它:
element
: first
| first? second
;
有没有更好的方法写这个?像first second我需要的魔法在哪里
lexer规则的相同问题:
FP
: [0-9]+ '.' [0-9]*
| [0-9]* '.' [0-9]+
没有办法让这更简单。我建议的唯一改变是将第二部分设
我试图在一个数学表达式中匹配一个变量arity的操作符(例如,“1
我有一个语法(antlr4)文件,其中包含lexer和parser规则。我已经扩展了生成的*BaseListener类并重写了
public void visitErrorNode(@NotNull ErrorNode node) {}
方法。在方法体中,我试图获取下一个可能的解析器规则(在本例中,我需要知道'op'是预期作为给定输入的下一个规则的规则)visitErrorNode是获取此信息或任何其他方式以获取所需信息的正确方法
组合语法:-
ratingCriteria :
为了在antlr4 java目标中以不同的方式报告错误,我们执行以下操作:
(1) 定义新的侦听器:
class DescriptiveErrorListener extends BaseErrorListener {
public static DescriptiveErrorListener INSTANCE =
new DescriptiveErrorListener();
@Override
public void syntaxError(Reco
我在看Java的语法分析器和词法分析器,可以在中找到。Lexer语法定义分号等标记和其他东西。然后,在解析器语法中,文本';'代替编写SEMI。使用位置的示例。为什么呢?这背后有什么原因吗?如果lexer规则是使用单个字符串文字定义的(并且没有其他lexer规则是使用相同文字定义的),例如SEMI:';',字符串文字可用于引用规则而不是其名称
允许这样做的原因是类似于语句';'比类似于语句的东西更具可读性
如何吞下任何东西直到字符串遇到分号;但它应该忽略引号中的分号
这是一个很好的例子性格它应该忽略这一部分
它应该给我一个吞咽的例子性格 您可以使用反向查找来检查是否有报价:
^(?<!['"]).*;
>代码> ^(?)请考虑使用正确的标签
我不确定这是缺陷、限制还是我做错了……如果讨论这个问题的地点不对,我提前道歉
我试图更改解析“oil 0w prod或e12b/cpc”时使用的语法中的优先级,以便将其处理为“(oil 0w prod)或e12b/cpc”的等效项,而不是“oil 0w(prod或e12b/cpc)”
我的语法如下:
parse : statement EOF ;
statement : statement proximityOp statement # Proxi
到目前为止,我使用antlr 3.4创建特定于语言的语法,并使用ST-3为该语言制作一个翻译器,但在出现antlr v4和ST-4之后,我无法使用我之前编写的代码。在antlr v4中是否有使用ST-4的示例。谢谢,
我尝试运行JSON2XML,如下所示:
bab@maz:~/tpantlr2-code/code/listeners$ antlr4 JSON.g4
bab@maz:~/tpantlr2-code/code/listeners$ javac JSON2XML_ST.java
bab@maz:~/tpantlr2-code/code/listeners$ java JSON2XML_ST t.json
但是我得到了一个答案:
(json (object { (pair "descripti
我试图通过Antlr4.Runtime.net40客户端和Antlr4BuildTasks.net40项目了解VS 2010上的Antlr CS代码
后者的构建很好,但对于第一个,我得到的类型或命名空间名称“XPathLexer”找不到。我相信这是因为XPathLexer.g4不工作,因此没有创建lexer和解析器
我认为Antlr4BuildTasks的任务是构建另一个任务,这也是错误的吗
我对XPathlexer.g4语法做了不必要的小改动,以查看是否显示了一些文件生成,但没有
有人可以指导
我知道这看起来像是复制品。不是。我搜索了一个小时,尝试了我所看到的一切,但什么都没有成功
我有一个名为MathLang.g4的antlr4语法文件。我把它放进了自己的名为Grammartest的文件夹中antlr-4.7.1-complete.jar与antlr4.bat和grun.bat一起位于C:\Program Files\Java\libs中。文件夹在路径中,jar在类路径中。bat文件的读取方式如下:
// antlr4.bat
java org.antlr.v4.Tool %*
/
我已经将一个相当大的迁移到,并且达到了一个步骤,除了一些边缘情况外,两个语法中的输出几乎相同。然而,有些文件非常长,无法解析(即使使用SLL预测模式和策略),所以我想知道如何找到应该首先修复哪些规则
我已经用Parser#setProfile()收集了一些统计数据,但我不知道如何解释每个DecisionInfo对象中的结果。关于如何开始优化大型ANTLR4语法,并找到首先要追踪的兔子,有没有好的文档?由于我不知道在DecisionInfo对象中寻找什么,下面是我的发现,并帮助我将解析时间至少提高
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' ->
于20年10月25日更新
我有一种面向记录的文件格式,其中('\r'?'\n'|'\r')[即换行符]可以是字符序列的终止,也可以是两个记录之间的分隔符。每个记录中都有自由文本
我面临的两个问题是:
如果我在文本定义中包含数字和标点符号,则时间戳将停止识别
我想处理分隔两条记录的换行符,它与换行符终止换行符不同
我想分析这个简单的文件格式:
1
00:00:01,123 --> 00:00:10,000
First caption is here
Second caption is here
上一页 1 2 ...
4 5 6 7 8 9 10 ...
下一页 最后一页 共 15 页