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