www.pudn.com > progs.zip > scn2.l


%{
#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);
}

main(int ac, char **av)
{
	if(ac > 1 && (yyin = fopen(av[1], "r")) == NULL) {
		perror(av[1]);
		exit(1);
	}

	if(!yyparse())
		fprintf(stderr, "Embedded SQL parse worked\n");
	else
		fprintf(stderr, "Embedded SQL parse failed\n");
} /* main */

/* leave SQL lexing mode */
un_sql()
{
	BEGIN INITIAL;
} /* un_sql */