2

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

我重写了我的语法,只在顶层有这个

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代码(我的解析器上没有解析方法,就像我在其他人的帖子上看到的那样:(:()...

@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 :
    '\\' ('"'|'\''|'\\')
    ;

谢谢,院长

4

1 回答 1

2

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

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

如果您确实需要异常,请参阅:ANTLR not throwing errors on invalid input

于 2012-08-21T07:30:31.017 回答