ANTLR を使用して、さまざまな時間形式 (12:30、0945、1:30-2:45、...) の文法を作成しようとしています。これまでのところ、文法ファイルで定義されていない文字を入力しない限り、魅力的に機能します。
たとえば、次の 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:23a") を試してみると、例外はスローされず、ANTLR はそれを有効な入力として扱います。
文法で文字を定義すると、ANTLR はそれらに気付くようで、必要な例外が再び発生します。
CHAR: ('a'..'z')|('A'..'Z');
しかし、ユーザーが入力できるウムラウト、記号、およびその他のものを除外するにはどうすればよいですか (äöü{%&<>!)。したがって、基本的には、次のような構文を探しています。すべてに一致しますが、「0..9、:-」