2010-07-09 9 views
3

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,: -"

Répondre

5

...
Donc, fondamentalement, je suis à la recherche d'une sorte de syntaxe qui dit: correspondre tout MAIS "0..9,:-"

La règle suivante correspond à un seul caractère, à l'exception d'un chiffre, ,, : et -:

Foo 
    : ~('0'..'9' | ',' | ':' | '-') 
    ; 

(le ~ nie les caractères individuels à l'intérieur Lexer règles)

Mais vous pouvez poster votre grammaire entière: J'ai l'impression qu'il ya d'autres choses que vous ne faites pas comme ils le devraient ont été fait. Ton appel.

2

vous pouvez définir un littéral, qui correspond à tous les caractères, que vous ne voulez pas. Si ce littéral n'est contenu dans aucune de vos règles, antlr lancera une exception NonViableException.

Pour unicode cela pourrait ressembler à ceci:

UTF8 : ('\u0000'..'\u002A'  // ! to * 
    | '\u002E'..'\u002F'   // ./
    | '\u003B'..'\u00FF'   // ; <=> ? @ as well as letters brackets and stuff 
    ) 
    ; 
Questions connexes