我在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:
然而,当我使用此重写规则^(PROGRAM program var function)
时,它可以工作:
有人能解释我错在哪里吗?坦率地说,我真的不了解异构树,我如何在ANTLR中使用<…>
语法。
r0
和r1
的含义(第一张图片)?
答案 0 :(得分:3)
我不知道这些r0
和r1
是什么意思:我没有使用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:
并且在启用重写规则-> ^(PROGRAM program var function)
时,会创建以下AST:
我使用以下类测试了两个重写规则:
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
类的输出。)