14

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

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

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

4

1 回答 1

17

在 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 中没有对应的谓词。

于 2012-12-01T18:18:18.080 回答