Понятия не имею, что означают эти r0
и r1
: я не использую ANTLRWorks для отладки, поэтому не могу комментировать это.
Кроме того, language = java;
заставляет ANTLR 3.2 выдавать ошибку:
ошибка (10): внутренняя ошибка: нет такого группового файла java.stg
ошибка (20): не удается найти шаблоны генерации кода java.stg
ошибка (10): внутренняя ошибка: нет такого группового файла java.stg
ошибка (20): не удается найти шаблоны генерации кода java.stg
ANTLR 3.2 ожидает, что он будет language = Java;
(заглавная "J"). Но по умолчанию целью является Java, так что не забывайте полностью удалить language = ...
.
Теперь, что касается вашей проблемы: я не могу ее воспроизвести. Как я уже упоминал, я протестировал его с ANTLR 3.2 и удалил часть language = java;
из вашей грамматики, после чего все прошло так, как (я) ожидал.
Включение правила перезаписи -> ^(PROGRAM<Program> program var function)
создает следующие ATS:
![enter image description here](https://i.stack.imgur.com/UiSlq.png)
и при включении правила перезаписи -> ^(PROGRAM program var function)
вместо этого создается следующий AST:
![enter image description here](https://i.stack.imgur.com/ooHGH.png)
Я проверил оба правила переписывания в следующем классе:
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
).