在一篇旧帖子中,我找到了一个SQL解析器的推荐,我正在搜索Lex和Yacc。这是链接。
我后来发现,这是O' reilly书中解释的代码" lex& YACC。
我试图让它工作,并且我已成功地集成到我的应用程序中,但每当我发送UPDATE命令时,我都会收到语法错误,即使是最简单的错误:
更新用户SET名称=' johnfoo'
我在=符号上得到错误。我试图追踪一切,但我找不到为什么它会给出这个消息。我试图分析lex和yacc代码,这对我来说没有意义,因为代码看起来是正确的。
[更新]我得到的错误只是:
1: syntax error at =
Embedded SQL parse failed
INSERT完美无缺。
答案 0 :(得分:0)
经过一些不同的尝试方式后,这种消费的解决方案(现已被作者删除)以某种方式起作用。
他建议更新比较的lex和yacc定义。
在lex文件中更改
<SQL>"=" |
<SQL>"<>" |
<SQL>"<" |
<SQL>">" |
<SQL>"<=" |
<SQL>">=" TOK(COMPARISON)
通过
<SQL>"=" TOK(EQ)
<SQL>"<>" TOK(NE)
<SQL>"<" TOK(LT)
<SQL>">" TOK(GT)
<SQL>"<=" TOK(LE)
<SQL>">=" TOK(GE)
在yacc文件中添加:
comparison:
EQ
| NE
| LT
| GT
| LE
| GE
;
并使用EQ和其他符号更改所有对=的引用,并将比较更改为COMPARISON:
%左比较COMPARISON / * =&lt;&gt; &LT; &GT; &lt; =&gt; = * /
通过
%左EQ NE LT GT LE GE / * =&lt;&gt; &LT; &GT; &lt; =&gt; = * /
assignment:
column = scalar_exp
| column = NULLX
;
通过
assignment:
column EQ scalar_exp
| column EQ NULLX
;
并且
comparison_predicate:
scalar_exp COMPARISON scalar_exp
| scalar_exp COMPARISON subquery
;
通过
comparison_predicate:
scalar_exp comparison scalar_exp
| scalar_exp comparison subquery
;
它有效!