2010-10-08 12 views
2

J'essaie de faire correspondre ma grammaire à une chaîne entière, et d'avoir une erreur si elle ne peut pas consommer toute l'entrée. Au fond, cette pseudo regex:ANTLR match à la fin de l'entrée

\whitespace* [a-zA-Z]+ [-]? [a-zA-Z]+ \whitespace* $ 

Selon this, EOF devrait fonctionner. Alors, pensez à cette grammaire:

start : CHARS EOF 
     ; 

CHARS : ('a'..'z')+ 
     ; 

Si je mets à l'entrée "hello" dans ce code:

 var ss = new Antlr.Runtime.ANTLRStringStream(input); 
     var lex = new autocompleteLexer(ss); 
     var tokens = new CommonTokenStream(lex); 
     var parser = new autocompleteParser(tokens); 
     return (BaseTree)(parser.start().Tree); 

je reçois un AST avec deux enfants, HELLO et EOF, comme prévu. Mais si je mets l'entrée à "hello#", elle restitue le même arbre et ne se plaint pas du hash. Je ne suis pas sûr de ce que je fais mal.

Répondre

2

J'ai trouvé le problème, c'était que les exceptions étaient piégées par le Lexer au lieu de se propager dans mon code. Donc, en ajoutant ceci:

class ThrowAllLexer: queryLexer 
{ 
    public ThrowAllLexer(ICharStream input): base(input) { } 
    public override void ReportError(RecognitionException e) { 
     throw e; 
} 

Je reçois maintenant les exceptions appropriées, au lieu de les faire avaler.