expr: (Identifier '.')=> (refIdentifier)
| (Identifier '!')=> (refIdentifier)
| (Identifier '=>')=> (lambdaExpression);
在ANTLR v4中,不再有门控语义谓词{...}?=>
,也不再有句法谓词(...)=>
,因为v4中使用的解析算法可以解决歧义(不再需要此类谓词)。所以,这应该对你有用:
expr
: refIdentifier
| refIdentifier
| lambdaExpression
;
请注意,在V4中只有一种类型的谓词:语义谓词,{...}?
。例如,如果需要检查令牌的内容,可以这样做:
id_capitals_only
: {_input.LT(1).getText().matches("[A-Z]+")}? ID
;
ID
: [a-zA-Z]+
;
正如萨姆·哈维尔在评论中提到的那样:
我有一个非常简单的语法,如下所示: (我需要使用语义谓词,因为我需要解析关键字可以用作标识符的语言)。 参考:https://github.com/antlr/antlr4/blob/master/doc/predicates.md
我正在用这个缩放的语法解析一个类似C++的声明(删除了许多细节,使其成为一个完全可用的示例)。它不能神秘地工作(至少对我来说)。它是否与上下文相关谓词的使用有关?如果是,如何实现“计算子节点数逻辑”? 我需要实现标准的C++规则,即在下不允许超过1个。 在之前使用语义谓词似乎是解决方案。由于嵌套的是可能的,因此计数自然被声明为中的局部变量。 但是,一个不带'=0'的输入来帮助解析 分析失败,出现“
关于antlr4的几个问题使用了书中没有提到的lexer谓词,例如28730446使用了head(String),42058127使用了getCharPositionInLine(),23465358使用了_input.la(1)等。是否有可用的lexer谓词列表及其文档?
在使用语义谓词时,我在错误恢复中面临着一个有点奇怪的行为。 我需要错误恢复(特别是单标记插入),因为我将解析的文本有许多“单标记缺失”错误。 让语法(非常简单,它匹配任意数量的“a”,用空格分隔,以分号结尾): 运行以下输入,得到的解析树为: “A A A A;”:; “A A A”:(此命令在stderr上发出警告:line 1:5 missing’;'at')。 现在对语法做了一个简单的更改,
我正在努力理解语法文件:https://github.com/antlr/grammars-v4/blob/master/url/url.g4 我无法理解运算符在最后的Character集合中:我知道代表不在集合运算符中,如:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md即是匹配任何单个字符不在描述的集合中,但如何解释当