Я пытаюсь написать грамматику для различных форматов времени (12:30, 0945, 1: 30-2: 45, ...), используя ANTLR. Пока это работает как шарм, пока я не набираю символы, которые не были определены в файле грамматики.
Я использую следующий тест JUnit, например:
final CharStream stream = new ANTLRStringStream("12:40-1300,15:123-18:59");
final TimeGrammarLexer lexer = new TimeGrammarLexer(stream);
final CommonTokenStream tokenStream = new CommonTokenStream(lexer);
final TimeGrammarParser parser = new TimeGrammarParser(tokenStream);
try {
final timeGrammar_return tree = parser.timeGrammar();
fail();
} catch (final Exception e) {
assertNotNull(e);
}
Исключение выдается (как и ожидалось), потому что "15: 123" недопустимо.
Однако если я попытаюсь («15: 23а»), не будет сгенерировано исключение, и ANTLR будет рассматривать его как допустимый ввод.
Теперь, если я определяю символы в моей грамматике, ANTLR, кажется, замечает их, и я снова получаю желаемое исключение:
CHAR: ('a'..'z')|('A'..'Z');
Но как исключить умлауты, символы и другие вещи, которые пользователь может набирать (äöü {% & <>!). Так что в основном я ищу какой-то синтаксис, который говорит: сопоставить все, но "0..9,: -"