ANTLR4中的语义谓词?

Aft*_*ock 12 antlr antlr4

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

expr: (Identifier '.')=> (refIdentifier)
  | (Identifier '!')=> (refIdentifier)
  | (Identifier '=>')=> (lambdaExpression);
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*ers 14

在ANTLR V4,不再有门语义断言,{ ... }?=>以及也有不再句法断言的,( ... )=>因为在V4使用的解析算法可以解决模糊性(需要这样的断言不再需要).所以,这应该适合你:

expr
 : refIdentifier
 | refIdentifier
 | lambdaExpression
 ;
Run Code Online (Sandbox Code Playgroud)

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

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

ID
 : [a-zA-Z]+
 ;
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

  • V4中的语义谓词"{...}?"就像V3中的门控语义谓词一样.来自V3的非门控谓词在ANTLR 4中没有对应的谓词. (4认同)