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
;
この場合、問題の内容を確認するのは簡単ですが、次回は_「動作しません」という意味を実際には説明してください(エラーメッセージが表示されます)。 –
なぜANTLRのフルパワーLL(*)ではなくLL(1)として使用したいのですか? – kay