version 1.5, 2001/09/08 00:12:40 |
version 1.6, 2002/12/19 21:24:28 |
|
|
int parencnt = 0; |
int parencnt = 0; |
|
|
typedef struct Keyword { |
typedef struct Keyword { |
char *word; |
const char *word; |
int sub; |
int sub; |
int type; |
int type; |
} Keyword; |
} Keyword; |
|
|
|
|
int gettok(char **pbuf, int *psz) /* get next input token */ |
int gettok(char **pbuf, int *psz) /* get next input token */ |
{ |
{ |
int c; |
int c, retc; |
char *buf = *pbuf; |
char *buf = *pbuf; |
int sz = *psz; |
int sz = *psz; |
char *bp = buf; |
char *bp = buf; |
|
|
} |
} |
} |
} |
*bp = 0; |
*bp = 0; |
|
retc = 'a'; /* alphanumeric */ |
} else { /* it's a number */ |
} else { /* it's a number */ |
char *rem; |
char *rem; |
/* read input until can't be a number */ |
/* read input until can't be a number */ |
|
|
*bp = 0; |
*bp = 0; |
strtod(buf, &rem); /* parse the number */ |
strtod(buf, &rem); /* parse the number */ |
unputstr(rem); /* put rest back for later */ |
unputstr(rem); /* put rest back for later */ |
rem[0] = 0; |
if (rem == buf) { /* it wasn't a valid number at all */ |
|
buf[1] = 0; /* so return one character as token */ |
|
retc = buf[0]; /* character is its own type */ |
|
} else { /* some prefix was a number */ |
|
rem[0] = 0; /* so truncate where failure started */ |
|
retc = '0'; /* number */ |
|
} |
} |
} |
*pbuf = buf; |
*pbuf = buf; |
*psz = sz; |
*psz = sz; |
return buf[0]; |
return retc; |
} |
} |
|
|
int word(char *); |
int word(char *); |
|
|
return 0; |
return 0; |
if (isalpha(c) || c == '_') |
if (isalpha(c) || c == '_') |
return word(buf); |
return word(buf); |
if (isdigit(c) || c == '.') { |
if (isdigit(c)) { |
yylval.cp = setsymtab(buf, tostring(buf), atof(buf), CON|NUM, symtab); |
yylval.cp = setsymtab(buf, tostring(buf), atof(buf), CON|NUM, symtab); |
/* should this also have STR set? */ |
/* should this also have STR set? */ |
RET(NUMBER); |
RET(NUMBER); |
|
|
} |
} |
yylval.cp = setsymtab(buf, "", 0.0, STR|NUM, symtab); |
yylval.cp = setsymtab(buf, "", 0.0, STR|NUM, symtab); |
RET(IVAR); |
RET(IVAR); |
|
} else if (c == 0) { /* */ |
|
SYNTAX( "unexpected end of input after $" ); |
|
RET(';'); |
} else { |
} else { |
unputstr(buf); |
unputstr(buf); |
RET(INDIRECT); |
RET(INDIRECT); |
|
|
case 0: |
case 0: |
SYNTAX( "non-terminated string %.10s...", buf ); |
SYNTAX( "non-terminated string %.10s...", buf ); |
lineno++; |
lineno++; |
|
if (c == 0) /* hopeless */ |
|
FATAL( "giving up" ); |
break; |
break; |
case '\\': |
case '\\': |
c = input(); |
c = input(); |
|
|
} |
} |
} |
} |
|
|
void startreg(void) /* next call to yyles will return a regular expression */ |
void startreg(void) /* next call to yylex will return a regular expression */ |
{ |
{ |
reg = 1; |
reg = 1; |
} |
} |
|
|
ep = ebuf + sizeof(ebuf) - 1; |
ep = ebuf + sizeof(ebuf) - 1; |
} |
} |
|
|
void unputstr(char *s) /* put a string back on input */ |
void unputstr(const char *s) /* put a string back on input */ |
{ |
{ |
int i; |
int i; |
|
|