xref: /plan9/sys/lib/lex/ncform (revision 68860d28114dc5c35dcd20e24ee253706e6c40fa)
17dd7cddfSDavid du Colombier#pragma lib	"libl.a"
23e12c5d1SDavid du Colombierint yylineno =1;
33e12c5d1SDavid du Colombier# define YYU(x) x
43e12c5d1SDavid du Colombierchar yytext[YYLMAX];
53e12c5d1SDavid du Colombierstruct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
63e12c5d1SDavid du ColombierUchar yysbuf[YYLMAX];
73e12c5d1SDavid du ColombierUchar *yysptr = yysbuf;
83e12c5d1SDavid du Colombierint *yyfnd;
93e12c5d1SDavid du Colombierextern struct yysvf *yyestate;
103e12c5d1SDavid du Colombierint yyprevious = YYNEWLINE;
113e12c5d1SDavid du Colombier# ifdef LEXDEBUG
120b9a5132SDavid du Colombierextern void allprint(int);
133e12c5d1SDavid du Colombier# endif
143e12c5d1SDavid du Colombieryylook(void){
153e12c5d1SDavid du Colombier	struct yysvf *yystate, **lsp;
163e12c5d1SDavid du Colombier	struct yywork *yyt;
173e12c5d1SDavid du Colombier	struct yysvf *yyz;
183e12c5d1SDavid du Colombier	int yych;
193e12c5d1SDavid du Colombier	struct yywork *yyr;
203e12c5d1SDavid du Colombier# ifdef LEXDEBUG
213e12c5d1SDavid du Colombier	int debug;
223e12c5d1SDavid du Colombier# endif
233e12c5d1SDavid du Colombier	Uchar *yylastch;
243e12c5d1SDavid du Colombier	/* start off machines */
253e12c5d1SDavid du Colombier# ifdef LEXDEBUG
263e12c5d1SDavid du Colombier	debug = 0;
273e12c5d1SDavid du Colombier# endif
283e12c5d1SDavid du Colombier	if (!yymorfg)
293e12c5d1SDavid du Colombier		yylastch = (Uchar*)yytext;
303e12c5d1SDavid du Colombier	else {
313e12c5d1SDavid du Colombier		yymorfg=0;
323e12c5d1SDavid du Colombier		yylastch = (Uchar*)yytext+yyleng;
333e12c5d1SDavid du Colombier		}
343e12c5d1SDavid du Colombier	for(;;){
353e12c5d1SDavid du Colombier		lsp = yylstate;
363e12c5d1SDavid du Colombier		yyestate = yystate = yybgin;
373e12c5d1SDavid du Colombier		if (yyprevious==YYNEWLINE) yystate++;
383e12c5d1SDavid du Colombier		for (;;){
393e12c5d1SDavid du Colombier# ifdef LEXDEBUG
403e12c5d1SDavid du Colombier			if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
413e12c5d1SDavid du Colombier# endif
423e12c5d1SDavid du Colombier			yyt = yystate->yystoff;
433e12c5d1SDavid du Colombier			if(yyt == yycrank){		/* may not be any transitions */
443e12c5d1SDavid du Colombier				yyz = yystate->yyother;
453e12c5d1SDavid du Colombier				if(yyz == 0)break;
463e12c5d1SDavid du Colombier				if(yyz->yystoff == yycrank)break;
473e12c5d1SDavid du Colombier				}
483e12c5d1SDavid du Colombier			*yylastch++ = yych = input();
493e12c5d1SDavid du Colombier		tryagain:
503e12c5d1SDavid du Colombier# ifdef LEXDEBUG
513e12c5d1SDavid du Colombier			if(debug){
523e12c5d1SDavid du Colombier				fprintf(yyout,"char ");
533e12c5d1SDavid du Colombier				allprint(yych);
543e12c5d1SDavid du Colombier				putchar('\n');
553e12c5d1SDavid du Colombier				}
563e12c5d1SDavid du Colombier# endif
573e12c5d1SDavid du Colombier			yyr = yyt;
58*68860d28SDavid du Colombier			if (yyt > yycrank){
593e12c5d1SDavid du Colombier				yyt = yyr + yych;
603e12c5d1SDavid du Colombier				if (yyt <= yytop && yyt->verify+yysvec == yystate){
613e12c5d1SDavid du Colombier					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
623e12c5d1SDavid du Colombier						{unput(*--yylastch);break;}
633e12c5d1SDavid du Colombier					*lsp++ = yystate = yyt->advance+yysvec;
643e12c5d1SDavid du Colombier					goto contin;
653e12c5d1SDavid du Colombier					}
663e12c5d1SDavid du Colombier				}
673e12c5d1SDavid du Colombier# ifdef YYOPTIM
68*68860d28SDavid du Colombier			else if(yyt < yycrank) {	/* r < yycrank */
693e12c5d1SDavid du Colombier				yyt = yyr = yycrank+(yycrank-yyt);
703e12c5d1SDavid du Colombier# ifdef LEXDEBUG
713e12c5d1SDavid du Colombier				if(debug)fprintf(yyout,"compressed state\n");
723e12c5d1SDavid du Colombier# endif
733e12c5d1SDavid du Colombier				yyt = yyt + yych;
743e12c5d1SDavid du Colombier				if(yyt <= yytop && yyt->verify+yysvec == yystate){
753e12c5d1SDavid du Colombier					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
763e12c5d1SDavid du Colombier						{unput(*--yylastch);break;}
773e12c5d1SDavid du Colombier					*lsp++ = yystate = yyt->advance+yysvec;
783e12c5d1SDavid du Colombier					goto contin;
793e12c5d1SDavid du Colombier					}
803e12c5d1SDavid du Colombier				yyt = yyr + YYU(yymatch[yych]);
813e12c5d1SDavid du Colombier# ifdef LEXDEBUG
823e12c5d1SDavid du Colombier				if(debug){
833e12c5d1SDavid du Colombier					fprintf(yyout,"try fall back character ");
843e12c5d1SDavid du Colombier					allprint(YYU(yymatch[yych]));
853e12c5d1SDavid du Colombier					putchar('\n');
863e12c5d1SDavid du Colombier					}
873e12c5d1SDavid du Colombier# endif
883e12c5d1SDavid du Colombier				if(yyt <= yytop && yyt->verify+yysvec == yystate){
893e12c5d1SDavid du Colombier					if(yyt->advance+yysvec == YYLERR)	/* error transition */
903e12c5d1SDavid du Colombier						{unput(*--yylastch);break;}
913e12c5d1SDavid du Colombier					*lsp++ = yystate = yyt->advance+yysvec;
923e12c5d1SDavid du Colombier					goto contin;
933e12c5d1SDavid du Colombier					}
943e12c5d1SDavid du Colombier				}
953e12c5d1SDavid du Colombier			if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
963e12c5d1SDavid du Colombier# ifdef LEXDEBUG
973e12c5d1SDavid du Colombier				if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
983e12c5d1SDavid du Colombier# endif
993e12c5d1SDavid du Colombier				goto tryagain;
1003e12c5d1SDavid du Colombier				}
1013e12c5d1SDavid du Colombier# endif
1023e12c5d1SDavid du Colombier			else
1033e12c5d1SDavid du Colombier				{unput(*--yylastch);break;}
1043e12c5d1SDavid du Colombier		contin:
1053e12c5d1SDavid du Colombier# ifdef LEXDEBUG
1063e12c5d1SDavid du Colombier			if(debug){
1073e12c5d1SDavid du Colombier				fprintf(yyout,"state %d char ",yystate-yysvec-1);
1083e12c5d1SDavid du Colombier				allprint(yych);
1093e12c5d1SDavid du Colombier				putchar('\n');
1103e12c5d1SDavid du Colombier				}
1113e12c5d1SDavid du Colombier# endif
1123e12c5d1SDavid du Colombier			;
1133e12c5d1SDavid du Colombier			}
1143e12c5d1SDavid du Colombier# ifdef LEXDEBUG
1153e12c5d1SDavid du Colombier		if(debug){
1160b9a5132SDavid du Colombier			fprintf(yyout,"stopped at %d with ",lsp>yylstate?*(lsp-1)-yysvec-1:0);
1173e12c5d1SDavid du Colombier			allprint(yych);
1183e12c5d1SDavid du Colombier			putchar('\n');
1193e12c5d1SDavid du Colombier			}
1203e12c5d1SDavid du Colombier# endif
1213e12c5d1SDavid du Colombier		while (lsp-- > yylstate){
1223e12c5d1SDavid du Colombier			*yylastch-- = 0;
1233e12c5d1SDavid du Colombier			if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
1243e12c5d1SDavid du Colombier				yyolsp = lsp;
1253e12c5d1SDavid du Colombier				if(yyextra[*yyfnd]){		/* must backup */
1263e12c5d1SDavid du Colombier					while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
1273e12c5d1SDavid du Colombier						lsp--;
1283e12c5d1SDavid du Colombier						unput(*yylastch--);
1293e12c5d1SDavid du Colombier						}
1303e12c5d1SDavid du Colombier					}
1313e12c5d1SDavid du Colombier				yyprevious = YYU(*yylastch);
1323e12c5d1SDavid du Colombier				yylsp = lsp;
1333e12c5d1SDavid du Colombier				yyleng = yylastch-(Uchar*)yytext+1;
1343e12c5d1SDavid du Colombier				yytext[yyleng] = 0;
1353e12c5d1SDavid du Colombier# ifdef LEXDEBUG
1363e12c5d1SDavid du Colombier				if(debug){
1373e12c5d1SDavid du Colombier					fprintf(yyout,"\nmatch '%s'", yytext);
1383e12c5d1SDavid du Colombier					fprintf(yyout," action %d\n",*yyfnd);
1393e12c5d1SDavid du Colombier					}
1403e12c5d1SDavid du Colombier# endif
1413e12c5d1SDavid du Colombier				return(*yyfnd++);
1423e12c5d1SDavid du Colombier				}
1433e12c5d1SDavid du Colombier			unput(*yylastch);
1443e12c5d1SDavid du Colombier			}
1453e12c5d1SDavid du Colombier		if (yytext[0] == 0  /* && feof(yyin) */)
1463e12c5d1SDavid du Colombier			{
1473e12c5d1SDavid du Colombier			yysptr=yysbuf;
1483e12c5d1SDavid du Colombier			return(0);
1493e12c5d1SDavid du Colombier			}
1503e12c5d1SDavid du Colombier		yyprevious = input();
1513e12c5d1SDavid du Colombier		yytext[0] = yyprevious;
1523e12c5d1SDavid du Colombier		if (yyprevious>0)
1533e12c5d1SDavid du Colombier			output(yyprevious);
1543e12c5d1SDavid du Colombier		yylastch = (Uchar*)yytext;
1553e12c5d1SDavid du Colombier# ifdef LEXDEBUG
1563e12c5d1SDavid du Colombier		if(debug)putchar('\n');
1573e12c5d1SDavid du Colombier# endif
1583e12c5d1SDavid du Colombier		}
1593e12c5d1SDavid du Colombier	}
1603e12c5d1SDavid du Colombieryyback(int *p, int m)
1613e12c5d1SDavid du Colombier{
1623e12c5d1SDavid du Colombierif (p==0) return(0);
1633e12c5d1SDavid du Colombierwhile (*p)
1643e12c5d1SDavid du Colombier	{
1653e12c5d1SDavid du Colombier	if (*p++ == m)
1663e12c5d1SDavid du Colombier		return(1);
1673e12c5d1SDavid du Colombier	}
1683e12c5d1SDavid du Colombierreturn(0);
1693e12c5d1SDavid du Colombier}
1703e12c5d1SDavid du Colombier	/* the following are only used in the lex library */
1713e12c5d1SDavid du Colombieryyinput(void){
1723e12c5d1SDavid du Colombier	return(input());
1733e12c5d1SDavid du Colombier}
174219b2ee8SDavid du Colombiervoid
1753e12c5d1SDavid du Colombieryyoutput(int c)
1763e12c5d1SDavid du Colombier{
1773e12c5d1SDavid du Colombier	output(c);
1783e12c5d1SDavid du Colombier}
179219b2ee8SDavid du Colombiervoid
1803e12c5d1SDavid du Colombieryyunput(int c)
1813e12c5d1SDavid du Colombier{
1823e12c5d1SDavid du Colombier	unput(c);
1833e12c5d1SDavid du Colombier}
184