免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: towerjt
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2008-03-04 17:44 |只看该作者
Reading a token: Next token is token COMPARISON ()
1: syntax error at =

这里读到1, 看起来就是NAME里面不支持定义数字的形式, 下一个TOKEN应该才是'='

论坛徽章:
0
12 [报告]
发表于 2008-03-04 18:56 |只看该作者
原帖由 Edengundam 于 2008-3-4 17:36 发表
UPDATE T1 SET C=1
看看会不会出错.

依然出错,能带数字的

论坛徽章:
0
13 [报告]
发表于 2008-03-04 19:05 |只看该作者
原帖由 towerjt 于 2008-3-4 18:56 发表

依然出错,能带数字的


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 () <== 读取一个token, 下一个token是COMPARISON
1: syntax error at =  <== 注意冒号前面


你可以看看我给你语句是不是在table名称那里出错的.

论坛徽章:
0
14 [报告]
发表于 2008-03-04 19:06 |只看该作者
原帖由 Edengundam 于 2008-3-4 17:44 发表
Reading a token: Next token is token COMPARISON ()
1: syntax error at =

这里读到1, 看起来就是NAME里面不支持定义数字的形式, 下一个TOKEN应该才是'='


我试了一下,把1去掉也是这个错误,看来1不是这个意思

论坛徽章:
0
15 [报告]
发表于 2008-03-04 19:09 |只看该作者
你那个语句中字段名不能用C,因为这个是一个保留字,我换成了FF,下面是错误信息,好像是一样的

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

论坛徽章:
0
16 [报告]
发表于 2008-03-04 19:19 |只看该作者
原帖由 towerjt 于 2008-3-4 19:09 发表
你那个语句中字段名不能用C,因为这个是一个保留字,我换成了FF,下面是错误信息,好像是一样的

Starting parse
Entering state 0
Reading a token: Next token is token UPDATE ()
Shifting token UPDAT ...


你把语法分析和词法分析代码压缩吧, 传上来吧....

论坛徽章:
0
17 [报告]
发表于 2008-03-04 19:22 |只看该作者
把整本书的代码都传上来得了。

单独运行sql1:

make sql1

代码是sql1.y  scn1.l

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

progs.zip

32.63 KB, 下载次数: 45

论坛徽章:
0
18 [报告]
发表于 2008-03-04 21:13 |只看该作者
日, 这个里面错误一堆堆的....

其实就是不能规约:
'='被识别成了COMPARISON
而assignment里面根本没有产生式, 自然语法错误.

而且这里的语义根本没有办法区分究竟是比较还是赋值. 是不是有其他的赋值操作??反正不符合SQL标准.....

论坛徽章:
0
19 [报告]
发表于 2008-03-04 23:06 |只看该作者
原帖由 Edengundam 于 2008-3-4 21:13 发表
日, 这个里面错误一堆堆的....

其实就是不能规约:
'='被识别成了COMPARISON
而assignment里面根本没有产生式, 自然语法错误.

而且这里的语义根本没有办法区分究竟是比较还是赋值. 是不是有其他的赋值操 ...



对了,那个Makefile需要修改一下,在链接程序的时候,加上  -ly -lfl,应该就不会出错了。
还是谢谢你的关注,我再仔细看看。

论坛徽章:
0
20 [报告]
发表于 2008-03-04 23:11 |只看该作者
原帖由 towerjt 于 2008-3-4 23:06 发表



对了,那个Makefile需要修改一下,在链接程序的时候,加上  -ly -lfl,应该就不会出错了。
还是谢谢你的关注,我再仔细看看。



yacc & lex这书的官方网站有人说了. 其实很多问题

SELECT语句有问题, 那个人加了sql: query_exp...

反正简单了解下吧...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP