由于Antlr4不再支持门控语义谓词,我想出了一个解决方法。但是,如果有人碰到这个问题,我想知道做这样的事情是否有任何警告,我也遵循最佳做法。
我遵循以下形式的标准“C”if语句: if(评估){ ...代码块 }
以下是代码块中的代码:
if ($result == false) { // If the statement evealuates to false
// Consume tokens until the end of block marker
while (getCurrentToken().getText().compareTo("}") != 0){
consume();
}
// Set the parser state as if it had executed the tokens
_localctx.start = getCurrentToken();
_ctx.start = getCurrentToken();
setState(220);
_errHandler.sync(this);
consume(); // Consume the end of block marker
return _localctx; // Exit the rule
}
我认为Terrance Parr必须有充分的理由去支持门控语义谓词,这似乎是一个简单的解决方法。我只是想知道我是否遗漏了什么。
我测试了它,即使使用'else'也可以。我没有尝试过复合评估报表(即用'&&'或'||'分隔的条件。我很有信心它会起作用。