diff --git a/WEGA/contrib/ingres/dbs/src/parser/s_name.c b/WEGA/contrib/ingres/dbs/src/parser/s_name.c new file mode 100644 index 0000000..777c510 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/parser/s_name.c @@ -0,0 +1,78 @@ +# include "gen.h" +# include "../h/dbs.h" +# include "../h/scanner.h" +# include "parser.h" + +/* +** NAME +** A name is defined to be a sequence of MAXNAME or fewer alphanumeric +** characters, starting with an alphabetic (underscore "_" is considered +** an alphabetic). If it is not a keyword, each name is entered into +** the symbol table, indexed by 'yylval'. A token is then returned for +** that name. +*/ +name(chr) +char chr; +{ + extern char *yylval; + char namebuf[MAXNAME + 1]; + register int hi; + register int lo; + register int curr; + extern char *syment(); + + /* fill in the name */ + yylval = namebuf; + *yylval = chr; + do + { + *++yylval = curr = gtchar(); + if ((yylval - namebuf) > MAXNAME) + { + /* name too long */ + *yylval = '\0'; + yyerror(NAMELONG, namebuf, (char *) 0); + } + + } while (CMAP(curr) == ALPHA || CMAP(curr) == NUMBR); + backup(curr); + *yylval = '\0'; + + /* is it a keyword ? */ + lo = 0; + hi = Keyent - 1; + while (lo <= hi) + { + curr = (lo + hi) / 2; + switch (AAscompare(Keyword[curr].term, MAXNAME, namebuf, MAXNAME)) + { + case 1: + hi = curr - 1; + continue; + + case -1: + lo = curr + 1; + continue; + + case 0: + Lastok.toktyp = Tokens.sconst; + Lastok.tok = Keyword[curr].term; + Lastok.tokop = Keyword[curr].opcode; + yylval = CAST(Keyword[curr].opcode); +# ifdef xPTR2 + AAtTfp(71, 0, "keyword: %s\n", namebuf); +# endif + return (Keyword[curr].token); + } + } + + /* else, USER DEFINED NAME */ +# ifdef xPTR2 + AAtTfp(71, 0, "name: %s\n", namebuf); +# endif + yylval = syment(namebuf, AAlength(namebuf) + 1); + Lastok.tok = yylval; + Lastok.toktyp = Tokens.sconst; + Lastok.tokop = 0; + return (Tokens.name); +} diff --git a/WEGA/contrib/ingres/dbs/src/parser/s_string.c b/WEGA/contrib/ingres/dbs/src/parser/s_string.c new file mode 100644 index 0000000..f6bf6ec --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/parser/s_string.c @@ -0,0 +1,88 @@ +# include "gen.h" +# include "../h/dbs.h" +# include "../h/scanner.h" +# include "parser.h" + +/* +** STRING +** A string is defined as any sequence of MAXSTRING or fewer characters, +** surrounded by string delimiters. New-line ;characters are purged +** from strings unless preceeded by a '\'; QUOTE's must be similarly +** prefixed in order to be correctly inserted within a string. Each +** string is entered in the symbol table, indexed by 'yylval'. A +** token or the error condition -1 is returned. +*/ +string(op) +struct optab *op; +{ + extern char *yylval; + extern char *syment(); + register int esc; + register int chr; + register char *ptr; + register int save; + char buf[MAXSTRING + 1]; + + /* disable case conversion and fill in string */ + ptr = buf; + save = Lcase; + Lcase = 0; + do + { + /* get next character */ + if ((*ptr = gtchar()) <= 0) + { + Lcase = save; + /* non term string */ + yyerror(STRTERM, (char *) 0); + } + + /* handle escape characters */ + esc = (*ptr == '\\'); + if (*ptr == '\n') + { + if ((*ptr = gtchar()) <= 0) + { + Lcase = save; + *ptr = 0; + /* non term string */ + yyerror(STRTERM, (char *) 0); + } + } + if (esc == 1) + { + if ((*++ptr = gtchar()) <= 0) + { + Lcase = save; + *ptr = 0; + /* non term string */ + yyerror(STRTERM, (char *) 0); + } + if (*ptr == *(op->term)) + *--ptr = *(op->term); + } + + /* check length */ + if ((ptr - buf) > MAXSTRING - 1) + { + Lcase = save; + /* string too long */ + yyerror(STRLONG, (char *) 0); + } + chr = *ptr; + if (CMAP(chr) == CNTRL) + /* cntrl in string from EQL */ + yyerror(CNTRLCHR, (char *) 0); + } while (*ptr++ != *(op->term) || esc == 1); + + /* restore case conversion and return */ + *--ptr = '\0'; + Lcase = save; +# ifdef xPTR2 + AAtTfp(71, 8, "STRING: %s\n", buf); +# endif + yylval = syment(buf, (ptr - buf) + 1); + Lastok.tok = yylval; + Lastok.toktyp = Tokens.sconst; + return (Tokens.sconst); +} diff --git a/WEGA/contrib/ingres/dbs/src/parser/s_yylex.c b/WEGA/contrib/ingres/dbs/src/parser/s_yylex.c new file mode 100644 index 0000000..17f83a0 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/parser/s_yylex.c @@ -0,0 +1,137 @@ +# include "gen.h" +# include "../h/dbs.h" +# include "../h/scanner.h" +# include "parser.h" + +struct lastok Lastok; +int Pars; /* flag for call getcvar or not */ + +/* +** YYLEX +** This is the control program for the scanner (lexical analyzer). +** Each call to yylex() returns a token for the next syntactic unit. +** If the object is of type I2CONST, I4CONST, F8CONST, SCONST or NAME, that +** object will also be entered in the symbol table, indexed by 'yylval'. +** If the object is not one of these types, yylval is the opcode field of +** the operator or keyword tables. +** The end-of-file token is zero. +*/ +yylex() +{ + register int chr; + register int rtval; + + rtval = -1; + Lastok.tokop = 0; + /* GET NEXT TOKEN */ + do + { + if((chr = gtchar()) <= 0) + { +# ifdef xPTR2 + AAtTfp(72, 8, "end-of-file\n"); +# endif + rtval = 0; + break; + } + switch (CMAP(chr)) + { + case ALPHA: + rtval = name(chr); + break; + + case NUMBR: + rtval = number(chr); + break; + + case OPATR: + if ((rtval = operator(chr)) == 0) + rtval = -1; + break; + + case PUNCT: + continue; + + case CNTRL: + /* already converted number ? */ + if (Pars) + switch (chr) + { + case CVAR_I2: + rtval = getcvar(Tokens.i2const, sizeof (short)); + break; + + case CVAR_I4: + rtval = getcvar(Tokens.i4const, sizeof (long)); + break; + + case CVAR_F8: + rtval = getcvar(Tokens.f8const, sizeof (double)); + break; + + case CVAR_S: + rtval = getcvar(Tokens.sconst, 0); + break; + + default: + printf("Zeichen 0%o ignoriert\n", chr); + continue; + } + break; + default: + AAsyserr(20003); + } + } while (rtval == -1); + if (rtval == 0) + { + Lastok.tokop = GOVAL; + Lastok.tok = 0; + Lastok.toktyp = 0; + } + return (rtval); +} + + +getcvar(type, len) +register int type; +register int len; +{ + register int chr; + register int save; + char buf[MAXSTRING + 1]; + extern char *yylval; + extern char *syment(); + + save = Lcase; + Lcase = 0; + yylval = buf; + if (len) + { + while ((yylval - buf) < len) + *yylval++ = chr = gtchar(); + } + else + { + do + { + *yylval = chr = gtchar(); + if ((yylval - buf) > MAXSTRING) + { + Lcase = save; + yyerror(STRLONG, (char *) 0); + } + if (CMAP(chr) == CNTRL && chr != '\0') + { + Lcase = save; + /* control char in string from EQL */ + yyerror(CNTRLCHR, (char *) 0); + } + } while (*yylval++); + len = yylval - buf; + } + Lcase = save; + yylval = syment(buf, len); + Lastok.tok = yylval; + Lastok.toktyp = type; + return (type); +}