231 lines
4.9 KiB
Plaintext
231 lines
4.9 KiB
Plaintext
#ident "$Revision: 1.9 $"
|
|
|
|
int yylineno =1;
|
|
# define YYU(x) x
|
|
# define NLSTATE yyprevious=YYNEWLINE
|
|
char yytext[YYLMAX];
|
|
struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
|
|
char yysbuf[YYLMAX];
|
|
char *yysptr = yysbuf;
|
|
int *yyfnd;
|
|
extern struct yysvf *yyestate;
|
|
int yyprevious = YYNEWLINE;
|
|
#if defined(__cplusplus) || defined(__STDC__)
|
|
int yylook(void)
|
|
#else
|
|
yylook()
|
|
#endif
|
|
{
|
|
register struct yysvf *yystate, **lsp;
|
|
register struct yywork *yyt;
|
|
struct yysvf *yyz;
|
|
int yych, yyfirst;
|
|
struct yywork *yyr;
|
|
# ifdef LEXDEBUG
|
|
int debug;
|
|
# endif
|
|
char *yylastch;
|
|
/* start off machines */
|
|
# ifdef LEXDEBUG
|
|
debug = 0;
|
|
# endif
|
|
yyfirst=1;
|
|
if (!yymorfg)
|
|
yylastch = yytext;
|
|
else {
|
|
yymorfg=0;
|
|
yylastch = yytext+yyleng;
|
|
}
|
|
for(;;){
|
|
lsp = yylstate;
|
|
yyestate = yystate = yybgin;
|
|
if (yyprevious==YYNEWLINE) yystate++;
|
|
for (;;){
|
|
# ifdef LEXDEBUG
|
|
if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
|
|
# endif
|
|
yyt = yystate->yystoff;
|
|
if(yyt == yycrank && !yyfirst){ /* may not be any transitions */
|
|
yyz = yystate->yyother;
|
|
if(yyz == 0)break;
|
|
if(yyz->yystoff == yycrank)break;
|
|
}
|
|
*yylastch++ = yych = input();
|
|
#ifndef LONGLINES
|
|
if(yylastch > &yytext[YYLMAX]) {
|
|
fprintf(yyout,"Input string too long, limit %d\n",YYLMAX);
|
|
exit(1);
|
|
}
|
|
#endif
|
|
yyfirst=0;
|
|
tryagain:
|
|
# ifdef LEXDEBUG
|
|
if(debug){
|
|
fprintf(yyout,"char ");
|
|
allprint(yych);
|
|
putchar('\n');
|
|
}
|
|
# endif
|
|
yyr = yyt;
|
|
if ( (void *)yyt > (void *)yycrank){
|
|
yyt = yyr + yych;
|
|
if (yyt <= yytop && yyt->verify+yysvec == yystate){
|
|
if(yyt->advance+yysvec == YYLERR) /* error transitions */
|
|
{unput(*--yylastch);break;}
|
|
*lsp++ = yystate = yyt->advance+yysvec;
|
|
#ifndef LONGLINES
|
|
if(lsp > &yylstate[YYLMAX]) {
|
|
fprintf(yyout,"Input string too long, limit %d\n",YYLMAX);
|
|
exit(1);
|
|
}
|
|
#endif
|
|
goto contin;
|
|
}
|
|
}
|
|
# ifdef YYOPTIM
|
|
else if((void *)yyt < (void *)yycrank) { /* r < yycrank */
|
|
yyt = yyr = yycrank+(yycrank-yyt);
|
|
# ifdef LEXDEBUG
|
|
if(debug)fprintf(yyout,"compressed state\n");
|
|
# endif
|
|
yyt = yyt + yych;
|
|
if(yyt <= yytop && yyt->verify+yysvec == yystate){
|
|
if(yyt->advance+yysvec == YYLERR) /* error transitions */
|
|
{unput(*--yylastch);break;}
|
|
*lsp++ = yystate = yyt->advance+yysvec;
|
|
#ifndef LONGLINES
|
|
if(lsp > &yylstate[YYLMAX]) {
|
|
fprintf(yyout,"Input string too long, limit %d\n",YYLMAX);
|
|
exit(1);
|
|
}
|
|
#endif
|
|
goto contin;
|
|
}
|
|
yyt = yyr + YYU(yymatch[yych]);
|
|
# ifdef LEXDEBUG
|
|
if(debug){
|
|
fprintf(yyout,"try fall back character ");
|
|
allprint(YYU(yymatch[yych]));
|
|
putchar('\n');
|
|
}
|
|
# endif
|
|
if(yyt <= yytop && yyt->verify+yysvec == yystate){
|
|
if(yyt->advance+yysvec == YYLERR) /* error transition */
|
|
{unput(*--yylastch);break;}
|
|
*lsp++ = yystate = yyt->advance+yysvec;
|
|
#ifndef LONGLINES
|
|
if(lsp > &yylstate[YYLMAX]) {
|
|
fprintf(yyout,"Input string too long, limit %d\n",YYLMAX);
|
|
exit(1);
|
|
}
|
|
#endif
|
|
goto contin;
|
|
}
|
|
}
|
|
if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
|
|
# ifdef LEXDEBUG
|
|
if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
|
|
# endif
|
|
goto tryagain;
|
|
}
|
|
# endif
|
|
else
|
|
{unput(*--yylastch);break;}
|
|
contin:
|
|
# ifdef LEXDEBUG
|
|
if(debug){
|
|
fprintf(yyout,"state %d char ",yystate-yysvec-1);
|
|
allprint(yych);
|
|
putchar('\n');
|
|
}
|
|
# endif
|
|
;
|
|
}
|
|
# ifdef LEXDEBUG
|
|
if(debug){
|
|
fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
|
|
allprint(yych);
|
|
putchar('\n');
|
|
}
|
|
# endif
|
|
while (lsp-- > yylstate){
|
|
*yylastch-- = 0;
|
|
if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
|
|
yyolsp = lsp;
|
|
if(yyextra[*yyfnd]){ /* must backup */
|
|
while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
|
|
lsp--;
|
|
unput(*yylastch--);
|
|
}
|
|
}
|
|
yyprevious = YYU(*yylastch);
|
|
yylsp = lsp;
|
|
yyleng = (int)(yylastch-yytext+1);
|
|
yytext[yyleng] = 0;
|
|
# ifdef LEXDEBUG
|
|
if(debug){
|
|
fprintf(yyout,"\nmatch ");
|
|
sprint(yytext);
|
|
fprintf(yyout," action %d\n",*yyfnd);
|
|
}
|
|
# endif
|
|
return(*yyfnd++);
|
|
}
|
|
unput(*yylastch);
|
|
}
|
|
if (yytext[0] == 0 /* && feof(yyin) */)
|
|
{
|
|
yysptr=yysbuf;
|
|
return(0);
|
|
}
|
|
yyprevious = yytext[0] = input();
|
|
if (yyprevious>0)
|
|
output(yyprevious);
|
|
yylastch=yytext;
|
|
# ifdef LEXDEBUG
|
|
if(debug)putchar('\n');
|
|
# endif
|
|
}
|
|
}
|
|
#if defined(__cplusplus) || defined(__STDC__)
|
|
int yyback(int *p, int m)
|
|
#else
|
|
yyback(p, m)
|
|
int *p;
|
|
#endif
|
|
{
|
|
if (p==0) return(0);
|
|
while (*p) {
|
|
if (*p++ == m)
|
|
return(1);
|
|
}
|
|
return(0);
|
|
}
|
|
/* the following are only used in the lex library */
|
|
#if defined(__cplusplus) || defined(__STDC__)
|
|
int yyinput(void)
|
|
#else
|
|
yyinput()
|
|
#endif
|
|
{
|
|
return(input());
|
|
}
|
|
#if defined(__cplusplus) || defined(__STDC__)
|
|
void yyoutput(int c)
|
|
#else
|
|
yyoutput(c)
|
|
int c;
|
|
#endif
|
|
{
|
|
output(c);
|
|
}
|
|
#if defined(__cplusplus) || defined(__STDC__)
|
|
void yyunput(int c)
|
|
#else
|
|
yyunput(c)
|
|
int c;
|
|
#endif
|
|
{
|
|
unput(c);
|
|
}
|