2011-07-15 12 views
2

私はANTLRでMySQL文法バリデーターを構築しています。私はsql_yacc.yyをMySQLソースコードから始めましたが、私は次の文法を変換するのが難しいです。私は何度も試みましたが、うまくいきません。誰でも助けてくれますか?MySQLのyacc文法をantlr LL(1)に変換するには?

expr 
    : expr or expr 
    | expr XOR expr 
    | expr and expr 
    | NOT_SYM expr 
    | bool_pri IS TRUE_SYM 
    | bool_pri IS not TRUE_SYM 
    | bool_pri IS FALSE_SYM 
    | bool_pri IS not FALSE_SYM 
    | bool_pri IS UNKNOWN_SYM 
    | bool_pri IS not UNKNOWN_SYM 
    | bool_pri 
    ; 

bool_pri 
    : bool_pri IS NULL_SYM 
    | bool_pri IS not NULL_SYM 
    | bool_pri EQUAL_SYM predicate 
    | bool_pri comp_op predicate 
    | bool_pri comp_op all_or_any '(' subselect ')' 
    | predicate 
    ; 

predicate 
    : bit_expr IN_SYM '(' subselect ')' 
    | bit_expr not IN_SYM '(' subselect ')' 
    | bit_expr IN_SYM '(' expr ')' 
    | bit_expr IN_SYM '(' expr ',' expr_list ')' 
    | bit_expr not IN_SYM '(' expr ')' 
    | bit_expr not IN_SYM '(' expr ',' expr_list ')' 
    | bit_expr BETWEEN_SYM bit_expr AND_SYM predicate 
    | bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate 
    | bit_expr SOUNDS_SYM LIKE bit_expr 
    | bit_expr LIKE simple_expr opt_escape 
    | bit_expr not LIKE simple_expr opt_escape 
    | bit_expr REGEXP bit_expr 
    | bit_expr not REGEXP bit_expr 
    | bit_expr 
    ; 

bit_expr 
    : bit_expr '|' bit_expr 
    | bit_expr '&' bit_expr 
    | bit_expr SHIFT_LEFT bit_expr 
    | bit_expr SHIFT_RIGHT bit_expr 
    | bit_expr '+' bit_expr 
    | bit_expr '-' bit_expr 
    | bit_expr '+' INTERVAL_SYM expr interval 
    | bit_expr '-' INTERVAL_SYM expr interval 
    | bit_expr '*' bit_expr 
    | bit_expr '/' bit_expr 
    | bit_expr '%' bit_expr 
    | bit_expr DIV_SYM bit_expr 
    | bit_expr MOD_SYM bit_expr 
    | bit_expr '^' bit_expr 
    | simple_expr 
    ; 
+0

この場合、問題の内容を確認するのは簡単ですが、次回は_「動作しません」という意味を実際には説明してください(エラーメッセージが表示されます)。 –

+0

なぜANTLRのフルパワーLL(*)ではなくLL(1)として使用したいのですか? – kay

答えて

3

ANTLRはleft-recursionに対処することができないので、ANTLR相当にsql_yacc.yyを変換する自明な方法はありません。あなたはANTLRのWikiから次のリソースを見てすることがあります:

注MySQLの文法は不完全ですが、あなたの出発点を与えるかもしれないということ。

関連する問題