免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4478 | 回复: 19
打印 上一主题 下一主题

lex&yacc中SQL解释器的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-04 14:54 |只看该作者 |倒序浏览
在lex&yacc随书代码中,有一个SQL解释器,但是我无法解释一个普通的update语句,

UPDATE TAB SET F1=1 WHERE 1=1;


打开调试,输出如下

Starting parse
Entering state 0
Reading a token: Next token is token UPDATE ()
Shifting token UPDATE ()
Entering state 11
Reading a token: Next token is token NAME ()
Shifting token NAME ()
Entering state 44
Reading a token: Next token is token SET ()
Reducing stack by rule 214 (line 55:
   $1 = token NAME ()
-> $$ = nterm table ()
Stack now 0 11
Entering state 45
Next token is token SET ()
Shifting token SET ()
Entering state 77
Reading a token: Next token is token NAME ()
Shifting token NAME ()
Entering state 115
Reducing stack by rule 233 (line 589):
   $1 = token NAME ()
-> $$ = nterm column ()
Stack now 0 11 45 77
Entering state 118
Reading a token: Next token is token COMPARISON ()
1: syntax error at =
Error: popping nterm column ()
Stack now 0 11 45 77
Error: popping token SET ()
Stack now 0 11 45
Error: popping nterm table ()
Stack now 0 11
Error: popping token UPDATE ()
Stack now 0
Cleanup: discarding lookahead token COMPARISON ()
Stack now 0
SQL parse failed

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-03-04 15:40 |只看该作者
用的lex&yacc还是flex&bison?
如果是前者,试试后者。

论坛徽章:
0
3 [报告]
发表于 2008-03-04 16:50 |只看该作者
谢谢,我用的是flex&bison,在cygwin和linux都没有成功。本想把代码发上来,但是总是报超长

[ 本帖最后由 towerjt 于 2008-3-4 16:54 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-03-04 17:07 |只看该作者
这个例句是书上的么?
把lex中关于column名称的正则贴出来看看.
还有关于UPDATE语句的语法定义.

把列名F1改成F可以用么??

论坛徽章:
0
5 [报告]
发表于 2008-03-04 17:11 |只看该作者
贴一下UPDATE中关于SET后面的产生式把...处理了column以后到COMPARISON时候产生语法错误了...

论坛徽章:
0
6 [报告]
发表于 2008-03-04 17:20 |只看该作者
assignment_commalist:
        |        assignment
        |        assignment_commalist ',' assignment
        ;

assignment:
                column '=' scalar_exp
        |        column '=' NULLX
        ;

update_statement_searched:
                UPDATE table SET assignment_commalist opt_where_clause


......


scalar_exp:
                scalar_exp '+' scalar_exp
        |        scalar_exp '-' scalar_exp
        |        scalar_exp '*' scalar_exp
        |        scalar_exp '/' scalar_exp
        |        '+' scalar_exp %prec UMINUS
        |        '-' scalar_exp %prec UMINUS
        |        atom
        |        column_ref
        |        function_ref
        |        '(' scalar_exp ')'
        ;

论坛徽章:
0
7 [报告]
发表于 2008-03-04 17:22 |只看该作者
column:                NAME
        ;


词法解释中:

"="        |
"<>"         |
"<"        |
">"        |
"<="        |
">="                { return COMPARISON; }

论坛徽章:
0
8 [报告]
发表于 2008-03-04 17:32 |只看该作者
从报错的分析来看应该是在分析“COMPARISON”的时候出的错,一个“=”

论坛徽章:
0
9 [报告]
发表于 2008-03-04 17:34 |只看该作者
1: syntax error at =

你看下syntax error at 是 产生式对应assignment中column '=' 中代码提示的么??

还有NAME在词法分析中会对应到一个正则表达式...里面能直接用数字么?

产生式肯定没问题的.

论坛徽章:
0
10 [报告]
发表于 2008-03-04 17:36 |只看该作者
UPDATE T1 SET C=1
看看会不会出错.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP