SQL分析器语法错误

时间:2014-01-27 16:12:15

标签: sql yacc lex

在一篇旧帖子中,我找到了一个SQL解析器的推荐,我正在搜索Lex和Yacc。这是链接。

SQL lex yacc grammar

我后来发现,这是O' reilly书中解释的代码" lex& YACC。

我试图让它工作,并且我已成功地集成到我的应用程序中,但每当我发送UPDATE命令时,我都会收到语法错误,即使是最简单的错误:

更新用户SET名称=' johnfoo'

我在=符号上得到错误。我试图追踪一切,但我找不到为什么它会给出这个消息。我试图分析lex和yacc代码,这对我来说没有意义,因为代码看起来是正确的。

[更新]我得到的错误只是:

1: syntax error at =
Embedded SQL parse failed

INSERT完美无缺。

1 个答案:

答案 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
    ;

它有效!