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 に答える