2

我正在使用 ANTLR 3.2 为这个 java 代码制作一个 AST:

测试.java

public class Test {

    public static void main(String args[]) {

        int x = 10;

        switch(x){
            case 1:{
                break;
            }
            case 2:{
                break;
            } 
            default:
                return;          
        }  
    }
}

使用来自 ANTLR wiki的 Java 1.5语法。

但是生成的 AST 有一个重复的switch节点。

我想解析输入文件并找到生成的 ASTcase块内的 s 和复合块的数量。switch

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main1 {

    public static void main(String[] args) throws Exception {

        JavaLexer lexer = new JavaLexer(new ANTLRFileStream("Test.java"));
        JavaParser parser = new JavaParser(new CommonTokenStream(lexer));
        CommonTree tree = (CommonTree)parser.javaSource().getTree();
        DOTTreeGenerator gen = new DOTTreeGenerator();
        StringTemplate st = gen.toDOT(tree);
        System.out.println(st);
    }
}

AST:

在此处输入图像描述

(点击图片放大)

ANTLR 语法中是否存在错误,或者我做错了什么?

4

1 回答 1

1

编辑:这个答案不正确。我误读了重写规则并更新了我的答案以解决它。

这是该答案先前提到的该语法的片段。

switchBlockLabels
    :   switchCaseLabels switchDefaultLabel? switchCaseLabels
        ->  ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabels switchDefaultLabel? switchCaseLabels)
    ;

在此重写规则中,由于对 to 的引用switchCaseLabels不是用+or编写的*,因此每个将仅引用规则中的一个元素。由于switchCaseLabels在此规则中引用了两次,因此重写规则将需要包含以下内容之一以将所有结果包含在 AST 中:

  • switchCaseLabels switchCaseLabels(这是它现在使用的形式)
  • switchCaseLabels*
  • switchCaseLabels+

我不确定为什么您的 AST 包含重复节点。

于 2013-06-12T13:08:20.963 回答