yacc 语法 mysql_如何将MySQL yacc语法转换为antlr LL(1)?

在构建一个使用ANTLR的MySQL语法规则验证器时,遇到了将sql_yacc.yy文件中的YACC语法转换为ANTLR LL(1)格式的问题。遇到的主要挑战是ANTLR不支持左递归,需要寻找解决方法。ANTLR Wiki上的一些资源可以作为转换的起点,但需要注意MySQL的语法是不完整的。
摘要由CSDN通过智能技术生成

bd96500e110b49cbb3cd949968f18be7.png

I am constructing a MySQL grammar validator with ANTLR. I started with the sql_yacc.yy from the MySQL source code, but I have some difficulties converting the following grammar. I tried many times, but it doesn't work. Can anyone help me?

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 cannot cope with left-recursion, so there's no trivial way to convert sql_yacc.yy into the ANTLR equivalent. You might want to have a look at the following resources from the ANTLR Wiki:

Note that the MySQL grammar is incomplete, but might give you a starting point.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值