From c2a6413e112d4ebe8c1e27a85c3119f14cee34be Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Mon, 3 Apr 1989 20:58:27 +0000 Subject: [PATCH] ING_DB --- WEGA/contrib/ingres/dbs/src/eql/parser.c | 164 +++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 WEGA/contrib/ingres/dbs/src/eql/parser.c diff --git a/WEGA/contrib/ingres/dbs/src/eql/parser.c b/WEGA/contrib/ingres/dbs/src/eql/parser.c new file mode 100644 index 0000000..69be1b8 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/eql/parser.c @@ -0,0 +1,164 @@ +/* +** PARSER FOR YACC OUTPUT +** +** This is the same as the yacc parser found in the BS system +** library "/lib/liby.a". There have been two kinds of +** modifications. 1) The coding style has been altered to conform +** to the DBS standard. 2) The changes marked by comments. +*/ + +# define MAXDEPTH 150 + +extern char *yyval; /* defined in the table file */ +extern char *yylval; /* defined in the table file */ +extern char **yypv; /* defined in the table file */ + + +/* -------- the next line is an DBS customization -------- */ +int yypflag = 1; /* zero for no actions performed */ +int yydebug = 0; /* 1 for debugging */ +char *yyv[MAXDEPTH]; /* where the values are stored */ +int yystate = 0; /* current parser state */ +int yychar = -1; /* current input token number */ +int yynerrs = 0; /* number of errors */ +int yyerrflag = 0; /* error recovery flag */ + + +yyparse() +{ + extern short yygo[]; + extern short yypgo[]; + extern short yyr1[]; + extern short yyr2[]; + extern short yyact[]; + extern short yypact[]; + /* DBS customization to make 'ps', 'p', and 'n' register variables */ + short s[MAXDEPTH]; + register short *ps; + register short *p; + register int n; + register short ac; + register int i; + + yystate = 0; + yychar = -1; + yynerrs = 0; + yyerrflag = 0; + ps = &s[0] - 1; + yypv = &yyv[0] - 1; + +stack: /* put a state and value onto the stack */ + if (yydebug) + printf("state %d value %d char %d\n", yystate, yyval, yychar); + *++ps = yystate; + *++yypv = yyval; + +newstate: /* set ap to point to the parsing actions for the new state */ + + i = yypact[yystate + 1]; + p = &yyact[i]; + +actn: /* get the next action, and perform it */ + n = (ac = *p++) & 07777; /* n is the "address" of the action */ + + switch (ac >> 12) /* switch on operation */ + { + + case 1: /* skip on test */ + if (yychar < 0) + { + yychar = yylex(); + if (yydebug) + printf( "character %d read\n", yychar ); + } + /* ---------- the next 2 lines are an DBS customization ---------- */ + if (yychar < 0) + return (1); + if (n != yychar) + p++; + goto actn; /* get next action */ + + case 2: /* shift */ + yystate = n; + yyval = yylval; + yychar = -1; + if (yyerrflag) + yyerrflag--; + goto stack; /* stack new state */ + + case 3: /* reduce */ + if (yydebug) + printf("reduce %d\n", n); + ps -= yyr2[n]; + yypv -= yyr2[n]; + yyval = yypv[1]; + /* -------- the next 2 lines are an DBS customization -------- */ + if (yypflag && yyactr(n)) + goto abort; + /* consult goto table to find next state */ + i = yyr1[n]; + i = yypgo[i]; + p = &yygo[i]; + for ( ; *p != *ps && *p >= 0; p += 2) + continue; + yystate = p[1]; + goto stack; /* stack new state and value */ + + case 4: /* accept */ + return (0); + + case 0: /* error ... attempt to resume parsing */ + switch (yyerrflag) + { + + case 0: /* brand new error */ + /* ----------the next 2 lines are an DBS customization ---------- */ + /* syntax error */ + yyerror("syntax error"); + yynerrs++; + + case 1: + case 2: /* incompletely recovered error ... try again */ + yyerrflag = 3; + + /* find a state where "error" is a legal shift action */ + while (ps >= s) + { + /* search ps actions */ + i = *ps; + i = yypact[i + 1]; + p = &yyact[i]; + for ( ; (*p >> 12) == 1; p += 2) + if (*p == 4352) + goto found; + + /* the current ps has no shift onn "error", pop stack */ + + if (yydebug) + printf("err recov pops state %d, uncovers %d\n", ps[0], ps[-1]); + ps--; + yypv--; + } + + /* there is no state on the stack with an error shift ... abort */ + + abort: + return (1); + + found: /* we have a state with a shift on "error", resume parsing */ + yystate = p[1] & 07777; + goto stack; + + case 3: /* no shift yet; clobber input char */ + if (yydebug) + printf("err recov discards char %d\n", yychar); + + /* don't discard EOF; quit */ + if (!yychar) + goto abort; + yychar = -1; + goto newstate; /* try again in the same state */ + + } + } +}