version 1.17, 2020/06/10 21:04:40 |
version 1.18, 2020/06/10 21:05:02 |
|
|
int type; |
int type; |
} Keyword; |
} Keyword; |
|
|
Keyword keywords[] ={ /* keep sorted: binary searched */ |
const Keyword keywords[] = { /* keep sorted: binary searched */ |
{ "BEGIN", XBEGIN, XBEGIN }, |
{ "BEGIN", XBEGIN, XBEGIN }, |
{ "END", XEND, XEND }, |
{ "END", XEND, XEND }, |
{ "NF", VARNF, VARNF }, |
{ "NF", VARNF, VARNF }, |
|
|
int gettok(char **, int *); |
int gettok(char **, int *); |
int binsearch(char *, Keyword *, int); |
int binsearch(char *, Keyword *, int); |
|
|
int peek(void) |
static int peek(void) |
{ |
{ |
int c = input(); |
int c = input(); |
unput(c); |
unput(c); |
return c; |
return c; |
} |
} |
|
|
int gettok(char **pbuf, int *psz) /* get next input token */ |
static int gettok(char **pbuf, int *psz) /* get next input token */ |
{ |
{ |
int c, retc; |
int c, retc; |
char *buf = *pbuf; |
char *buf = *pbuf; |
|
|
case 'r': *bp++ = '\r'; break; |
case 'r': *bp++ = '\r'; break; |
case 'b': *bp++ = '\b'; break; |
case 'b': *bp++ = '\b'; break; |
case 'v': *bp++ = '\v'; break; |
case 'v': *bp++ = '\v'; break; |
case 'a': *bp++ = '\007'; break; |
case 'a': *bp++ = '\a'; break; |
case '\\': *bp++ = '\\'; break; |
case '\\': *bp++ = '\\'; break; |
|
|
case '0': case '1': case '2': /* octal: \d \dd \ddd */ |
case '0': case '1': case '2': /* octal: \d \dd \ddd */ |
|
|
} |
} |
|
|
|
|
int binsearch(char *w, Keyword *kp, int n) |
static int binsearch(char *w, const Keyword *kp, int n) |
{ |
{ |
int cond, low, mid, high; |
int cond, low, mid, high; |
|
|
|
|
|
|
int word(char *w) |
int word(char *w) |
{ |
{ |
Keyword *kp; |
const Keyword *kp; |
int c, n; |
int c, n; |
|
|
n = binsearch(w, keywords, sizeof(keywords)/sizeof(keywords[0])); |
n = binsearch(w, keywords, sizeof(keywords)/sizeof(keywords[0])); |
|
|
|
|
void unput(int c) /* put lexical character back on input */ |
void unput(int c) /* put lexical character back on input */ |
{ |
{ |
|
if (c == '\n') |
|
lineno--; |
if (yysptr >= yysbuf + sizeof(yysbuf)) |
if (yysptr >= yysbuf + sizeof(yysbuf)) |
FATAL("pushed back too much: %.20s...", yysbuf); |
FATAL("pushed back too much: %.20s...", yysbuf); |
*yysptr++ = c; |
*yysptr++ = c; |