J'essaie d'écrire une grammaire pour différents formats de temps (12:30, 0945, 1: 30-2: 45, ...) en utilisant ANTLR. Jusqu'à présent cela fonctionne comme un charme tant que je ne tape pas de caractères qui n'ont pas été définis dans le fichier de grammaire.Comment exclure des caractères/symboles en utilisant la grammaire ANTLR?
J'utilise le test JUnit suivant par exemple:
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);
}
Une exception est jeté (comme prévu) parce que "15: 123" est pas valide. Si j'essaie ("15: 23a"), aucune exception n'est levée et ANTLR la traite comme une entrée valide.
Maintenant, si je définis les caractères dans ma grammaire, ANTLR semble les remarquer et je reçois encore une fois l'exception que je veux:
CHAR: ('a'..'z')|('A'..'Z');
Mais comment puis-je exclure trémas, des symboles et d'autres choses un utilisateur est en mesure pour taper (äöü {% & <>!). Donc, fondamentalement, je cherche une sorte de syntaxe qui dit: correspondre à tout MAIS "0..9,: -"