Я не уверен, является ли это ошибкой или нет. Но со следующей простой грамматикой ANTLR, которая распознает маркер «программа»,
grammar w;
options{
language = Java;
ASTLabelType=CommonTree;
}
root : 'program' ;
Следующая тестовая установка, которая пытается пройти грамматику ДВАЖДЫ, выдает сообщение об ошибке, хотя она компилирует
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import antlr.CommonAST;
public class wT{
public static void main(String[] args) throws Exception {
wLexer lexer = new wLexer(new ANTLRStringStream ("program"));
wParser parser = new wParser(new CommonTokenStream(lexer));
System.out.println("###Test1");
parser.root();
parser.root();
System.out.println("ok for w.g gramma");
}
}
Сообщение об ошибке, вызываемое ANT:
bash-3.2$ ant testrig
Buildfile: /Users/fuzl/while-comp/trunk/_test/build.xml
antlr:
compile:
[javac] Compiling 1 source file to /Users/fuzl/while-comp/trunk/_test
testrig:
[java] ###Test1
[java] ok for w.g gramma
[java] line 1:7 missing 'program' at '<EOF>'
Очень интересно, последняя строка
[java] line 1:7 missing 'program' at '<EOF>'
происходит из-за двойного «parser.root ()» testrig, и это сообщение об ошибке исчезает, когда используется только один parser.root ().
Я полагаю, что parser.root () изменяет объект "parser". Если так, то это должно быть ошибкой, верно?