Я работаю с antlr 3.2. У меня есть простая грамматика, состоящая из атомов (которые являются символами «0» или «1»), и правило, которое накапливает их список, разделенный запятыми, в список.
Когда я передаю «00» в качестве ввода, я не получаю ошибку, что меня удивляет, потому что это не должно быть допустимым вводом:
C:\Users\dan\workspace\antlrtest\test>java -cp antlr-3.2.jar org.antlr.Tool Test.g
C:\Users\dan\workspace\antlrtest\test>javac -cp antlr-3.2.jar *.java
C:\Users\dan\workspace\antlrtest\test>java -cp .;antlr-3.2.jar TestParser
[0]
Как я могу заставить ошибку генерироваться в этом случае? Это особенно озадачивает, потому что когда я использую интерпретатор в ANTLRWorks для этого ввода, он действительно показывает исключение NoViableAltException.
Я обнаружил, что если я изменяю грамматику, требуя, скажем, точку с запятой в конце, генерируется ошибка , но это решение недоступно для меня в реальной грамматике, над которой я работаю.
Вот грамматика, которая самодостаточна и работоспособна:
grammar Test;
@parser::members {
public static void main(String[] args) throws Exception {
String text = "00";
ANTLRStringStream in = new ANTLRStringStream(text);
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
System.out.println(new TestParser(tokens).mainRule());
}
}
mainRule returns [List<String> words]
@init{$words = new ArrayList<String>();}
: w=atom {$words.add($w.text);} (',' w=atom {$words.add($w.text);} )*
;
atom: '0' | '1';
WS
: ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; }
;