ANTLR4中的语义谓词?

时间:2012-12-01 17:22:53

标签: antlr antlr4

您如何将ANTLR 3中编写的这部分代码翻译成ANTLR 4?

expr: (Identifier '.')=> (refIdentifier)
  | (Identifier '!')=> (refIdentifier)
  | (Identifier '=>')=> (lambdaExpression);

我的意思是这种语义谓词现在似乎不存在。我可以用什么呢?

1 个答案:

答案 0 :(得分:14)

在ANTLR v4中,不再有门控语义谓词{ ... }?=>,也不再有句法谓词( ... )=>,因为v4中使用的解析算法可以解决歧义(不再需要这样的谓词)。所以,这应该适合你:

expr
 : refIdentifier
 | refIdentifier
 | lambdaExpression
 ;

请注意,v4中只有一种类型的谓词:语义谓词{ ... }?。例如,如果需要检查令牌的内容,可以这样做:

id_capitals_only
 : {_input.LT(1).getText().matches("[A-Z]+")}? ID
 ;

ID
 : [a-zA-Z]+
 ;

修改

正如Sam Harwell在评论中提到的那样:

  

语义谓词{...}?在V4中的工作就像V3中的门控语义谓词一样。来自V3的非门控谓词在ANTLR 4中没有对应的。