yyparse.c
来自「早期freebsd实现」· C语言 代码 · 共 240 行
C
240 行
/*- * Copyright (c) 1980, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)yyparse.c 8.1 (Berkeley) 6/6/93";#endif /* not lint */#include "whoami.h"#include "0.h"#include "tree_ty.h" /* must be included for yy.h */#include "yy.h"/* * Parser for 'yacc' output. * Specifially Modified for Berkeley Pascal */int yystate; /* Current parser state */union semstack *yypv;unsigned yytshifts = 1; /* Number of "true" shifts *//* * Parse Tables */int yygo[];int yypgo[];int yyr1[];int yyr2[];int yyact[];int yypact[];/* * Parse and parallel semantic stack */union semstack yyv[MAXDEPTH];int yys[MAXDEPTH];/* * This routine parses the input stream, and * returns if it accepts, or if an unrecoverable syntax * error is encountered. */yyparse(){ register int *ps, n, *p; int paniced, *panicps, idfail;#ifdef lint panicps = (int *) 0;#endif yystate = 0; yychar = yylex(); OY.Yychar = -1; yyshifts = 3; paniced = 0; ps = &yys[0]-1; yypv = &yyv[0]-1;#ifdef PXP yypw = &yyw[0]-1;#endifstack: /* * Push new state and value. */ if (yypv >= &yyv[MAXDEPTH-1]) { yerror("Parse stack overflow"); pexit(DIED); } *++ps = yystate; *++yypv = yyval;#ifdef PXP yypw++;#endifnewstate: /* * Locate parsing actions for the * new parser state. */ p = &yyact[ yypact[yystate+1] ]; /* * Search the parse actions table * for something useful to do. * While n is non-positive, it is the negation * of the token we are testing for. */#ifdef PI if ((n = *p++) <= 0) { if (yychar < 0) yychar = yylex(); do if ((n += yychar) != 0) p++; while ((n = *p++) <= 0); }#else while ((n = *p++) <= 0) if ((n += yychar) != 0) p++;#endif switch (n >> 12) { /* * Shift. */ case 2:#ifdef PXP yypw[1].Wseqid = yyseqid; yypw[1].Wcol = yycol;#endif OYcopy(); yystate = n & 07777; yyval.i_entry = yylval;#ifdef PI yychar = -1;#else yychar = yylex();#endif yyshifts++; yytshifts++; goto stack; /* * Reduce. */ case 3: n &= 07777; N = yyr2[n]; if (N == 1 && OY.Yychar == YID && !yyEactr(n, yypv[0].cptr)) { idfail = 1; goto errin; } OY.Yychar = -1; ps -= N; yypv -= N;#ifdef PXP yypw -= N;#endif yyval = yypv[1]; yyactr(n); /* * Use goto table to find next state. */ p = &yygo[yypgo[yyr1[n]]]; while (*p != *ps && *p >= 0) p += 2; yystate = p[1]; goto stack; /* * Accept. */ case 4: return; /* * Error. */ case 1: idfail = 0;errin: if ((paniced || yyshifts != 0) && yyrecover(ps, idfail)) { paniced = 0; ps = Ps; yystate = *ps; goto newstate; } /* * Find a state where 'error' is a * legal shift action. */ if (paniced && yyshifts <= 0 && ps >= panicps) { yypv -= (ps - panicps) + 1;#ifdef PXP yypw -= (ps - panicps) + 1;#endif ps = panicps - 1; } while (ps >= yys) { for (p = &yyact[ yypact[*ps+1] ] ; *p <= 0; p += 2) if (*p == -256) { panicps = ps; yystate= p[1] & 07777; yyOshifts = yyshifts; yyshifts = 0; paniced = 1; goto stack; } --ps; --yypv;#ifdef PXP --yypw;#endif#ifdef PI if (OY.Yychar != YID) syneflg = TRUE;#endif OY.Yychar = -1; } if (yychar == YEOF) yyunexeof(); if (yystate == 1) yyexeof(); yerror("Unrecoverable syntax error - QUIT"); return; } panic("yyparse");}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?