Он распознает как "a a a"
, так и "b b b"
, как и должно быть.Чтобы проверить себя, добавьте небольшой оператор debug-print к своему правилу statement
:
grammar Test2;
options {
language = Java;
}
statement: ( a|b )* {System.out.println("parsed: " + $text);};
a: 'a';
b: 'b';
WS: ('\n'|' '|'\t'|'r'|'\f')+ {$channel=HIDDEN;};
, а затем протестируйте анализатор со следующим классом:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
Test2Lexer lexer = new Test2Lexer(new ANTLRStringStream(args[0]));
Test2Parser parser = new Test2Parser(new CommonTokenStream(lexer));
parser.statement();
}
}
После генерациилексер и парсер и компилируя все .java
исходные файлы:
java -cp antlr-3.3.jar org.antlr.Tool Test2.g
javac -cp antlr-3.3.jar *.java
вы можете протестировать парсер с "a a a"
в качестве ввода:
java -cp .:antlr-3.3.jar Main "a a a"
parsed: a a a
и с "b b b"
в качестве ввода:
java -cp .:antlr-3.3.jar Main "b b b"
parsed: b b b
Как видите, в обоих случаях не сообщается об ошибке, и ввод выводится обратно на консоль.
Я предполагаю, что вы используете интерпретатор ANTLRWorks.Не.Это общеизвестно глючит.Либо используйте отладчик ANTLRWorks (это здорово!), Либо используйте небольшой тестовый класс, который вы пишете самостоятельно (аналогично моему Main
классу).
EDIT
Обратите внимание, что плагин ANTLR IDE Eclipse использует интерпретатор из ANTLRWorks, AFAIK.