%{ //int yylineno = 0; #include #include #include "Python.h" #define YYSTYPE void * #include "tokens.h" extern void *py_parser; extern void (*py_input)(PyObject *parser, char *buf, int *result, int max_size); #define returntoken(tok) yylval = PyString_FromString(strdup(yytext)); return (tok); #define YY_INPUT(buf,result,max_size) { (*py_input)(py_parser, buf, &result, max_size); } %} %% "ADA" { returntoken(ADA); } "ALL" { returntoken(ALL); } "AND" { returntoken(AND); } "AVG" { returntoken(AMMSC); } "MIN" { returntoken(AMMSC); } "MAX" { returntoken(AMMSC); } "SUM" { returntoken(AMMSC); } "COUNT" { returntoken(AMMSC); } "ANY" { returntoken(ANY); } "AS" { returntoken(AS); } "ASC" { returntoken(ASC); } "AUTHORIZATION" { returntoken(AUTHORIZATION); } "BETWEEN" { returntoken(BETWEEN); } "BY" { returntoken(BY); } "C" { returntoken(C); } "CHAR" { returntoken(CHARACTER); } "CHARACTER" { returntoken(CHARACTER); } "CHECK" { returntoken(CHECK); } "CLOSE" { returntoken(CLOSE); } "COBOL" { returntoken(COBOL); } "COMMIT" { returntoken(COMMIT); } "CONTINUE" { returntoken(CONTINUE); } "CREATE" { returntoken(CREATE); } "CURRENT" { returntoken(CURRENT); } "CURSOR" { returntoken(CURSOR); } "DECIMAL" { returntoken(DECIMAL); } "DECLARE" { returntoken(DECLARE); } "DEFAULT" { returntoken(DEFAULT); } "DELETE" { returntoken(DELETE); } "DESC" { returntoken(DESC); } "DISTINCT" { returntoken(DISTINCT); } "DOUBLE" { returntoken(DOUBLE); } "ESCAPE" { returntoken(ESCAPE); } "EXISTS" { returntoken(EXISTS); } "FETCH" { returntoken(FETCH); } "FLOAT" { returntoken(FLOAT); } "FOR" { returntoken(FOR); } "FOREIGN" { returntoken(FOREIGN); } "FORTRAN" { returntoken(FORTRAN); } "FOUND" { returntoken(FOUND); } "FROM" { returntoken(FROM); } "GOTO" { returntoken(GOTO); } "GO TO" { returntoken(GOTO); } "GRANT" { returntoken(GRANT); } "GROUP" { returntoken(GROUP); } "HAVING" { returntoken(HAVING); } "IN" { returntoken(IN); } "INDICATOR" { returntoken(INDICATOR); } "INSERT" { returntoken(INSERT); } "INT" { returntoken(INTEGER); } "INTEGER" { returntoken(INTEGER); } "INTO" { returntoken(INTO); } "IS" { returntoken(IS); } "KEY" { returntoken(KEY); } "LANGUAGE" { returntoken(LANGUAGE); } "LIKE" { returntoken(LIKE); } "MODULE" { returntoken(MODULE); } "NOT" { returntoken(NOT); } "NULL" { returntoken(NULLX); } "NUMERIC" { returntoken(NUMERIC); } "OF" { returntoken(OF); } "ON" { returntoken(ON); } "OPEN" { returntoken(OPEN); } "OPTION" { returntoken(OPTION); } "OR" { returntoken(OR); } "ORDER" { returntoken(ORDER); } "PASCAL" { returntoken(PASCAL); } "PLI" { returntoken(PLI); } "PRECISION" { returntoken(PRECISION); } "PRIMARY" { returntoken(PRIMARY); } "PRIVILEGES" { returntoken(PRIVILEGES); } "PROCEDURE" { returntoken(PROCEDURE); } "PUBLIC" { returntoken(PUBLIC); } "REAL" { returntoken(REAL); } "REFERENCES" { returntoken(REFERENCES); } "ROLLBACK" { returntoken(ROLLBACK); } "SCHEMA" { returntoken(SCHEMA); } "SELECT" { returntoken(SELECT); } "SET" { returntoken(SET); } "SMALLINT" { returntoken(SMALLINT); } "SOME" { returntoken(SOME); } "SQLCODE" { returntoken(SQLCODE); } "TABLE" { returntoken(TABLE); } "TO" { returntoken(TO); } "UNION" { returntoken(UNION); } "UNIQUE" { returntoken(UNIQUE); } "UPDATE" { returntoken(UPDATE); } "USER" { returntoken(USER); } "VALUES" { returntoken(VALUES); } "VIEW" { returntoken(VIEW); } "WHENEVER" { returntoken(WHENEVER); } "WHERE" { returntoken(WHERE); } "WITH" { returntoken(WITH); } "WORK" { returntoken(WORK); } ("=="|"<>"|"<"|">"|"<="|">=") { returntoken(COMPARISON); } "-" { returntoken(MINUS); } "+" { returntoken(PLUS); } "*" { returntoken(TIMES); } "/" { returntoken(DIV); } ":" { returntoken(COLON); } "(" { returntoken(LPAREN); } ")" { returntoken(RPAREN); } "," { returntoken(COMMA); } "." { returntoken(PERIOD); } ";" { returntoken(SEMICOLON); } "=" { returntoken(ASSIGN_OP); } [A-Za-z][A-Za-z0-9_]* { returntoken(NAME); } [0-9]+ | [0-9]+"."[0-9]* | "."[0-9]* { returntoken(INTNUM); } [0-9]+[eE][+-]?[0-9]+ | [0-9]+"."[0-9]*[eE][+-]?[0-9]+ | "."[0-9]*[eE][+-]?[0-9]+ { returntoken(APPROXNUM); } "'"[^'\n]*"'" { int c = input(); unput(c); /* just peeking */ if(c != '\'') { returntoken(STRING); } else yymore(); } "'"[^'\n]*$ { yyerror("Unterminated string"); } \n { yylineno++; } [ \t\r]+ { } "--".*$ { } %% int yywrap() { return(1); } main(int ac, char **av) { if(ac > 1 && (yyin = fopen(av[1], "4")) == NULL) { perror(av[1]); exit(1); } if(!yyparse()) printf("SQL parse worked\n"); else printf("SQL parse failed\n"); }