当前位置: 首页 > 知识库问答 >
问题:

ANTLR4中的语义谓词?

姚信鸥
2023-03-14
expr: (Identifier '.')=> (refIdentifier)
  | (Identifier '!')=> (refIdentifier)
  | (Identifier '=>')=> (lambdaExpression);

共有1个答案

别旻
2023-03-14

在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即是匹配任何单个字符不在描述的集合中,但如何解释当