ANTLR соответствует концу ввода - PullRequest
2 голосов
/ 08 октября 2010

Я пытаюсь сопоставить мою грамматику со всей строкой, и выдает ошибку, если не может использовать весь ввод В основном это псевдо-регулярное выражение:

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

Согласно это , EOF должен работать. Итак, рассмотрим эту грамматику:

start : CHARS EOF
      ;

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

Если я установлю значение ввода "hello" в этом коде:

        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);

Я получаю AST с двумя детьми, HELLO и EOF, как и ожидалось. Но если я задаю для ввода "hello#", оно возвращает то же самое дерево и вообще не жалуется на хеш. Я не уверен, что я делаю неправильно.

1 Ответ

2 голосов
/ 09 октября 2010

Я обнаружил, что проблема заключается в том, что исключения попадают в ловушку, а не распространяются в мой код. Итак, добавив это:

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

Теперь я получаю правильные исключения вместо того, чтобы их проглотить.

...