59 lines
1000 B
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;
|
|
}
|