我正在查看 Antlr v4 语法。具体来说就是 Java 的例子。
https://github.com/antlr/grammars-v4/blob/master/java/Java.g4
我注意到使用提供的语法,以下输入是有效的。
public class HelloWorld {
public static void main(String[] args) {
Float f = "hello world!";
}
}
显然我们都知道这在 Java 中不是一个有效的语句。在 Antlr4 中如何使这个无效并抛出错误?我怀疑您在 BaseVisitor 生成的函数中执行此操作,但我很难在 Antlr4 书籍或在线中找到示例。
最佳答案
根据特定的编译器,这是在上下文分析/类型检查中完成的 - 在解析树的演练中。这是通过用类型“装饰”树来完成的。这会将“string”作为“hello world!”的类型。节点,并在声明节点上“ float ”。然后编译器就能够发现错误并给出错误消息。
是的,这是通过 ANTLR 提供的访问者完成的。您可以扩展 BaseVisitor 类来创建您自己的访问者方法,在其中进行装饰和类型检查。下面是我自己的项目之一的示例:
@Override
public Node visitEqCond(EqCondNode node){
CondNode left = (CondNode) visit(node.left);
CondNode right = (CondNode) visit(node.right);
if(left.type.equals("num") && right.type.equals("num") && left.typeCorrect && right.typeCorrect){
node.type = "bool";
}
else{
node.typeCorrect = false;
if(!left.type.equals("num")){
err.TypeNotApplicableInOperationError(left.type, node.operator, node.lineNumber);
}
if(!right.type.equals("num")){
err.TypeNotApplicableInOperationError(right.type, node.operator, node.lineNumber);
}
}
return node;
}
显然,这要求您使用“type”和“typeCorrect”属性创建自己的节点。具体来说,这个方法非常简单。当您访问特定表达式时,您可以根据那里的类型来设置类型。例如,表达式将是示例中赋值的 "hello world"
部分。当我访问特定节点(假设它名为 StringExpr
)时,我将“type”属性设置为 String,并对赋值节点执行相同的操作,将其设置为“Float”。然后我可以看到,赋值和表达式不对应,并且可能会引发错误。
关于java - ANTLR4 验证用户定义类型匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272952/