[英]How do I write a grammar for a select sql statement?
我正在为 SQL 解析器编写语法,但我已经坚持了一段时间了-
F: FETCH fields FROM tables Conditions
;
fields: ALL
| ids
;
ids: ID ids_
;
ids_: ',' ID ids_
| { /*empty*/ }
;
tables: ID
;
Conditions: WHERE ConditionList
| { /*empty*/ }
;
ConditionList: Condition ConditionList_
;
ConditionList_: BoolOp Condition ConditionList_
| { /*empty*/ }
;
Condition: Operand RELOP Operand
| NOT Operand RELOP Operand
;
Operand: ID
| NUM
;
BoolOp: AND
| OR
;
由于某种原因,当词法分析器读取 FROM 令牌时,解析器会因错误而终止。 这是 lex 代码-
FETCH{ printf("fetch "); return FETCH;}
FROM { printf("from "); return UNIQUE; }
ALL { printf("all "); return ALL; }
WHERE { printf("where "); return WHERE; }
AND { printf("and "); return AND; }
OR { printf("or "); return OR; }
NOT { printf("not "); return NOT; }
RelOp { printf("%s", yytext); yylval.string = strdup(yytext); return RELOP; }
[0-9]* {printf("num "); return NUM; }
[_a-zA-Z][_a-zA-Z0-9]* { printf("id "); return ID; }
{symbol} { printf("%c ", yytext[0]); return yytext[0]; }
. { }
RelOp 是一个模式RelOp ("<"|"<="|">"|">="|"=")
和 symbol 是一个模式- symbol ("("|")"|",")
你的语法从
F: FETCH fields FROM tables Conditions
但是,您的词法分析器规则包括
FROM { printf("from "); return UNIQUE; }
由于UNIQUE
与FROM
不同,语法规则将不适用。
如果您的词法分析器中的那些printf
调用是某种调试尝试,那么它们并不是很有用,因为它们不会告诉您是否实际上返回了正确的令牌类型(和值,在必要的情况下)。 我强烈建议使用bison 的跟踪功能来准确了解正在发生的事情。 (例如,Bison 的跟踪将告诉您解析器正在接收哪种令牌类型。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.