您如何将ANTLR 3中编写的这部分代码翻译成ANTLR 4?
expr: (Identifier '.')=> (refIdentifier)
| (Identifier '!')=> (refIdentifier)
| (Identifier '=>')=> (lambdaExpression);
我的意思是这种语义谓词现在似乎不存在。我可以用什么呢?
答案 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中没有对应的。