%{ #include "sql2.h" #include int lineno = 1; void yyerror(char *s); /* macro to save the text of a SQL token */ #define SV save_str(yytext) /* macro to save the text and return a token */ #define TOK(name) { SV;return name; } %} %s SQL %% EXEC[ \t]+SQL { BEGIN SQL; start_save(); } /* literal keyword tokens */ ALL TOK(ALL) AND TOK(AND) AVG TOK(AMMSC) MIN TOK(AMMSC) MAX TOK(AMMSC) SUM TOK(AMMSC) COUNT TOK(AMMSC) ANY TOK(ANY) AS TOK(AS) ASC TOK(ASC) AUTHORIZATION TOK(AUTHORIZATION) BETWEEN TOK(BETWEEN) BY TOK(BY) CHAR(ACTER)? TOK(CHARACTER) CHECK TOK(CHECK) CLOSE TOK(CLOSE) COMMIT TOK(COMMIT) CONTINUE TOK(CONTINUE) CREATE TOK(CREATE) CURRENT TOK(CURRENT) CURSOR TOK(CURSOR) DECIMAL TOK(DECIMAL) DECLARE TOK(DECLARE) DEFAULT TOK(DEFAULT) DELETE TOK(DELETE) DESC TOK(DESC) DISTINCT TOK(DISTINCT) DOUBLE TOK(DOUBLE) ESCAPE TOK(ESCAPE) EXISTS TOK(EXISTS) FETCH TOK(FETCH) FLOAT TOK(FLOAT) FOR TOK(FOR) FOREIGN TOK(FOREIGN) FOUND TOK(FOUND) FROM TOK(FROM) GO[ \t]*TO TOK(GOTO) GRANT TOK(GRANT) GROUP TOK(GROUP) HAVING TOK(HAVING) IN TOK(IN) INDICATOR TOK(INDICATOR) INSERT TOK(INSERT) INT(EGER)? TOK(INTEGER) INTO TOK(INTO) IS TOK(IS) KEY TOK(KEY) LANGUAGE TOK(LANGUAGE) LIKE TOK(LIKE) NOT TOK(NOT) NULL TOK(NULLX) NUMERIC TOK(NUMERIC) OF TOK(OF) ON TOK(ON) OPEN TOK(OPEN) OPTION TOK(OPTION) OR TOK(OR) ORDER TOK(ORDER) PRECISION TOK(PRECISION) PRIMARY TOK(PRIMARY) PRIVILEGES TOK(PRIVILEGES) PROCEDURE TOK(PROCEDURE) PUBLIC TOK(PUBLIC) REAL TOK(REAL) REFERENCES TOK(REFERENCES) ROLLBACK TOK(ROLLBACK) SCHEMA TOK(SCHEMA) SELECT TOK(SELECT) SET TOK(SET) SMALLINT TOK(SMALLINT) SOME TOK(SOME) SQLCODE TOK(SQLCODE) TABLE TOK(TABLE) TO TOK(TO) UNION TOK(UNION) UNIQUE TOK(UNIQUE) UPDATE TOK(UPDATE) USER TOK(USER) VALUES TOK(VALUES) VIEW TOK(VIEW) WHENEVER TOK(WHENEVER) WHERE TOK(WHERE) WITH TOK(WITH) WORK TOK(WORK) /* punctuation */ "=" | "<>" | "<" | ">" | "<=" | ">=" TOK(COMPARISON) [-+*/(),.;] TOK(yytext[0]) /* names */ [A-Za-z][A-Za-z0-9_]* TOK(NAME) /* parameters */ ":"[A-Za-z][A-Za-z0-9_]* { save_param(yytext+1); return PARAMETER; } /* numbers */ [0-9]+ | [0-9]+"."[0-9]* | "."[0-9]* TOK(INTNUM) [0-9]+[eE][+-]?[0-9]+ | [0-9]+"."[0-9]*[eE][+-]?[0-9]+ | "."[0-9]*[eE][+-]?[0-9]+ TOK(APPROXNUM) /* strings */ '[^'\n]*' { int c = input(); unput(c); /* just peeking */ if(c != '\'') { SV;return STRING; } else yymore(); } '[^'\n]*$ { yyerror("Unterminated string"); } \n { save_str(" ");lineno++; } \n { lineno++; ECHO; } [ \t\r]+ save_str(" "); /* white space */ "--".* ; /* comment */ . ECHO; /* random non-SQL text */ %% void yyerror(char *s) { printf("%d: %s at %s\n", lineno, s, yytext); } int main() { if(!yyparse()) fprintf(stderr, "Embedded SQL parse worked\n"); else fprintf(stderr, "Embedded SQL parse failed\n"); return 0; } /* main */ /* leave SQL lexing mode */ un_sql() { BEGIN INITIAL; } /* un_sql */