antlr,如何修复语法(varname)?解析是否存在但是错误

时间:2012-08-20 23:35:13

标签: antlr

我正在改写这篇文章(但同样的问题,更少的话)。

我把我的语法改写成了最高级别的

statement: SELECT EOF!;
#removed all other rules and tokens and still not working
SELECT  :   ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');

然后我有以下java代码(在我的Parser上没有解析方法,就像我在其他人的帖子上看到的那样:( :()......

@Test
public void testGrammar() throws RecognitionException {
    String sql = "select p FROM TABLE p left join p.security s where p.numShares = :shares and s.securityType = :type";

    ANTLRStringStream stream = new ANTLRStringStream(sql);
    NoSqlLexer lexer = new NoSqlLexer(stream);
    CommonTokenStream tokenStream = new CommonTokenStream(lexer);
    NoSqlParser parser = new NoSqlParser(tokenStream);

    try {
        CommonTree tree = (CommonTree) parser.statement().getTree();
        Assert.fail("should fail parsing");
    } catch(Exception e) {
        log.info("Exception", e);
    }
}

我应该得到一个关于解析的异常,但我没有:( :(。这是一个非常简单的语法,带有EOF,但它只是不起作用。任何想法为什么?我是否调用了错误的解析语句?

注意:我试图通过将问题简化为一个看起来不起作用的简单问题来使问题变得更简单。

完整(非常小)的语法文件在这里

grammar NoSql;


options { 
    output = AST; 
    language = Java;
}

tokens {


}

@header {
package com.alvazan.orm.parser.antlr;
}

@lexer::header {
package com.alvazan.orm.parser.antlr;
}


@rulecatch {
    catch (RecognitionException e)
    {
        throw e;
    }
}

statement: SELECT EOF!;

SELECT  :   ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');

WS  :
    (   ' '
        |   '\t'
        |   '\r'
        |   '\n'
        )+
        { $channel=HIDDEN; }
        ;  

ESC :
    '\\' ('"'|'\''|'\\')
    ;

感谢, 迪安

1 个答案:

答案 0 :(得分:2)

  

我应该在解析时遇到异常,但我不会:( :(。这是一个非常简单的语法,带有EOF,但它只是不起作用。

如果你没有“告诉”ANTLR抛出异常,那么在输入无效的情况下,ANTLR可能不会抛出异常/错误。在许多情况下,ANTLR尝试从不匹配/无效输入中恢复并尝试继续解析。您看到您的案例中stderr上写的输出,但您可能不会得到例外。

如果你想要例外,请参阅:ANTLR not throwing errors on invalid input