Select Statement
Using lex-yacc check select statement in a SQL statement YACC FILE Source Code: %{ #includevoid yyerror(char *); int yylex(); %} %token SELECT STAR FROM WHERE HAVING GROUP_BY ORDER_BY ASC DESC NUMBER AND OR GREATER SMALLER EQUAL GEQUAL LEQUAL NEQUAL ID %start program %% program : SELECT name FROM tab clause where ';' { printf("Successful parsing "); } ; where : WHERE id '=' id clause | ; name :id |STAR ; tab :ID |ID ',' tab ; clause :GROUP_BY id |GROUP_BY id HAVING cond |ORDER_BY id asc | ; asc :ASC |DESC ; id :id_dot |id_dot ',' id ; id_dot :ID |ID '.' ID ; cond :scond |scond lop cond ; scond :nid |nid relop nid ; nid :ID |NUMBER ; lop :AND |OR ; relop :GREATER |SMALLER |EQUAL |GEQUAL |LEQUAL |NEQUAL ; %% void yyerror(char *s) { printf("\n %s ERROR",s); } int main() { yyparse(); return 0; } Lex FILE Source Code: %{ int yywrap(); void yyerror(char *); #include "y.tab.h" %} %% "group by" {return GROUP_BY;} "having" {return HAVING;} "order by" {return ORDER_BY;} "select" {return SELECT;} "from" {return FROM;} "where" {return WHERE;} "*" {return STAR;} "asc" {return ASC;} "desc" {return DESC;} ">" {return GREATER;} "<" {return SMALLER;} "==" {return EQUAL;} ">=" {return GEQUAL;} "<=" {return LEQUAL;} "!=" {return NEQUAL;} "||" {return OR;} "&&" {return AND;} [.{};,=] {return *yytext;} [0-9]+ {return NUMBER;} [a-zA-Z][a-zA-Z0-9]* {return ID;} [ \t\n]+ ; . {printf("\n\n Error");} %% int yywrap() { return 1; }
Tags:
Lex & Yacc
0 comments