plan9front/sys/src/liblex/reject.c

59 lines
1000 B
C

#include <u.h>
#include <libc.h>
#include <stdio.h>
extern FILE* yyout;
extern FILE* yyin;
extern int yyprevious, *yyfnd;
extern char yyextra[];
extern char yytext[];
extern int yyleng;
extern
struct
{
int *yyaa, *yybb;
int *yystops;
} *yylstate [], **yylsp, **yyolsp;
int yyback(int *p, int m);
int yyinput(void);
void yyoutput(int c);
void yyunput(int c);
int
yyracc(int m)
{
yyolsp = yylsp;
if(yyextra[m]) {
while(yyback((*yylsp)->yystops, -m) != 1 && yylsp > yylstate) {
yylsp--;
yyunput(yytext[--yyleng]);
}
}
yyprevious = yytext[yyleng-1];
yytext[yyleng] = 0;
return m;
}
int
yyreject(void)
{
for(; yylsp < yyolsp; yylsp++)
yytext[yyleng++] = yyinput();
if(*yyfnd > 0)
return yyracc(*yyfnd++);
while(yylsp-- > yylstate) {
yyunput(yytext[yyleng-1]);
yytext[--yyleng] = 0;
if(*yylsp != 0 && (yyfnd = (*yylsp)->yystops) && *yyfnd > 0)
return yyracc(*yyfnd++);
}
if(yytext[0] == 0)
return 0;
yyoutput(yyprevious = yyinput());
yyleng = 0;
return -1;
}