ANTLR匹配输入结束

时间:2010-10-08 03:28:59

标签: regex parsing input antlr

我正在尝试将我的语法与整个字符串匹配,并且如果它不能消耗整个输入则会将其错误输出。基本上,这个伪正则表达式:

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

根据this,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,HELLOEOF,正如预期的那样。但是如果我将输入设置为说"hello#",它会返回相同的树,并且根本不会抱怨哈希。我不确定我做错了什么。

1 个答案:

答案 0 :(得分:2)

我发现了问题,那就是Lexer异常被异常传播而不是传播到我的代码中。所以,加上这个:

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

我现在得到了正确的例外,而不是吞下它们。