java - ANTLR4 验证用户定义类型匹配

标签 java antlr antlr4 dsl

我正在查看 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/

相关文章:

java - ANTLR4 是否可以确定适用于某些位置的代币类型?

java - 使用 Spring 问题制作带有菜单栏的 Swing 框架

ANTLR 和文学编程

ANTLR语法错误

android - ANTLR 和 Android

antlr - “a-zA-Z”给我一个完全的惊喜,同时匹配了替代项

java - RMI 负载测试工具?

java - 指定 Java 通信库的位置

java - 如何在不同的区域设置中显示消息

conditional - ANTLR 将 1 对 1 语法规则链接在一起以解决条件