2011-07-15 24 views
2

我正在用ANTLR構建一個MySQL語法驗證器。我從MySQL源代碼中的sql_yacc.yy開始,但在轉換以下語法時遇到了一些困難。我嘗試了很多次,但不起作用。誰能幫我?如何將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

爲什麼你想把它作爲LL(1)而不是ANTLR的全功率LL(*)? – kay

回答