2014-01-27 37 views
0

在旧的postI中找到了一个SQL解析器的推荐我搜索Lex和Yacc。链接在这里。SQL解析器语法错误

SQL lex yacc grammar

后来我才发现,它是一款在O'Reilly出版的解释“法& YACC的代码。

我试图把它的工作,我已经成功地集成在我aplication,但每当我发送一个UPDATE命令我得到一个语法错误,即使是最简单的:

更新用户设置的名字=“johnfoo”

我坐上=符号的错误。我试图追踪一切,但我无法找到它为什么给出这条消息。我试图分析lex和yacc代码,因为代码看起来正确,所以对我来说没有任何意义。

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

1: syntax error at = 
Embedded SQL parse failed 

INSERT完美的作品。

+0

好的......错误是什么?很高兴知道你有一个,但知道错误说什么会有所帮助。 – Hogan

+0

1:语法错误= 嵌入式SQL解析失败。 – jordi

回答

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和=所有引用其他符号和与对比比较:

%左比较/ * = <> <> < => = */

通过

%左EQ NE LT GT LE GE/* = <> <> < => = */

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 
    ; 

和它的作品!