end_of_statement
: ';'
| EOF
| {input.LT(1).getType() == RBRACE}? =>
;
RBRACE
: '}'
;
现在只有一种类型的语义谓词,如下所示:
{ <<boolean-epxression>> }?
抽象类parser
中的input
属性(生成的解析器扩展自该属性)前面有一个下划线。
因此,在您的例子中,以下ANTLR v3语法:
{input.LT(1).getType() == RBRACE}? =>
{_input.LT(1).getType() == RBRACE}?
是如下所示吗。
我有一个非常简单的语法,如下所示: (我需要使用语义谓词,因为我需要解析关键字可以用作标识符的语言)。 参考:https://github.com/antlr/antlr4/blob/master/doc/predicates.md
关于antlr4的几个问题使用了书中没有提到的lexer谓词,例如28730446使用了head(String),42058127使用了getCharPositionInLine(),23465358使用了_input.la(1)等。是否有可用的lexer谓词列表及其文档?
我正在用这个缩放的语法解析一个类似C++的声明(删除了许多细节,使其成为一个完全可用的示例)。它不能神秘地工作(至少对我来说)。它是否与上下文相关谓词的使用有关?如果是,如何实现“计算子节点数逻辑”? 我需要实现标准的C++规则,即在下不允许超过1个。 在之前使用语义谓词似乎是解决方案。由于嵌套的是可能的,因此计数自然被声明为中的局部变量。 但是,一个不带'=0'的输入来帮助解析 分析失败,出现“
在ANTLR v3中,句法谓词可以用来解决例如悬空的else问题。ANTLR4似乎接受具有类似歧义的语法,但在解析过程中它会报告这些歧义(例如,“line 2:29 reportAmbiguity d=0(e):ambigalts={1,2},input=...”)。它生成一个解析树,尽管存在这些歧义(根据文档,通过选择第一个备选方案)。但如果我想让它选择其他选择,我能做什么呢?换句话说,我如何显