ANTLR,异构AST问题

时间:2011-04-11 21:24:41

标签: antlr antlr3

我在ANTLR中检查异构树(使用ANTLRWorks 1.4.2)。

以下是我在ANTLR中已经完成的示例。

grammar test;

options {
    language = java;
    output = AST;
}

tokens {
    PROGRAM;
    VAR;
}

@members {
    class Program extends CommonTree {
        public Program(int ttype) {
            token = new CommonToken(ttype, "<start>");
        }
    }
}

start
    :    program var function
        // Works fine:
        //->    ^(PROGRAM program var function)

        // Does not work (described below):
        ->    ^(PROGRAM<Program> program var function)
    ;

program
    :    'program'! ID ';'!
    ;

var
    :    TYPE^ ID ';'!
    ;

function
    :    ID '('! ')'! ';'!
    ;

TYPE
    :    'int'
    |    'string'
    ;

ID
    :    ('a'..'z' | 'A'..'Z')+
    ;

WHITESPACE
    :    (' ' | '\t' '\n'| '\r' | '\f')+ {$channel = HIDDEN;}
    ;

示例输入:

program foobar;
int foo;
bar();

当我使用重写规则^(PROGRAM<Program> program var function)时,ANTLR绊倒了,我得到了这样的AST:

AntLR

然而,当我使用此重写规则^(PROGRAM program var function)时,它可以工作:

enter image description here

  1. 有人能解释我错在哪里吗?坦率地说,我真的不了解异构树,我如何在ANTLR中使用<…>语法。

  2. r0r1的含义(第一张图片)?

1 个答案:

答案 0 :(得分:3)

我不知道这些r0r1是什么意思:我没有使用ANTLRWorks进行调试,因此无法对此发表评论。

此外,language = java;会导致ANTLR 3.2产生错误:

  

错误(10):内部错误:没有这样的组文件java.stg

     

错误(20):找不到代码生成模板java.stg
  error(10):内部错误:没有这样的组文件java.stg

     

错误(20):找不到代码生成模板java.stg

ANTLR 3.2预计它为language = Java;(大写“J”)。但是,默认情况下,目标是Java,因此,请注意完全删除language = ...

现在,关于你的问题:我无法重现它。正如我所提到的,我使用ANTLR 3.2对其进行了测试,并从语法中删除了language = java;部分,之后一切都按照(I)的预期进行。

启用重写规则-> ^(PROGRAM<Program> program var function)会产生以下ATS:

enter image description here

并且在启用重写规则-> ^(PROGRAM program var function)时,会创建以下AST:

enter image description here

我使用以下类测试了两个重写规则:

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

public class Main {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("program foobar; int foo; bar();");
        testLexer lexer = new testLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        testParser parser = new testParser(tokens);
        testParser.start_return returnValue = parser.start();
        CommonTree tree = (CommonTree)returnValue.getTree();
        DOTTreeGenerator gen = new DOTTreeGenerator();
        StringTemplate st = gen.toDOT(tree);
        System.out.println(st);
    }
}

图像是使用graph.gafol.net生成的(当然还有Main类的输出。)