| version 1.1, 1999/12/03 07:39:12 |
version 1.3, 2000/07/25 01:15:07 |
|
|
| /* $OpenXM: OpenXM/src/asir99/parse/lex.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/parse/lex.c,v 1.2 2000/02/07 03:14:40 noro Exp $ */ |
| #include <ctype.h> |
#include <ctype.h> |
| #include "ca.h" |
#include "ca.h" |
| #include "al.h" |
#include "al.h" |
| Line 25 static int Getc(); |
|
| Line 25 static int Getc(); |
|
| static void Ungetc(); |
static void Ungetc(); |
| static void Gets(); |
static void Gets(); |
| |
|
| |
#define NBUFSIZ (BUFSIZ*10) |
| |
#define TBUFSIZ (BUFSIZ) |
| |
|
| |
#define REALLOC_NBUF \ |
| |
if ( i >= nbufsize ) {\ |
| |
nbufsize += NBUFSIZ;\ |
| |
if ( nbuf == nbuf0 ) {\ |
| |
nbuf = (char *)MALLOC_ATOMIC(nbufsize);\ |
| |
bcopy(nbuf0,nbuf,nbufsize-NBUFSIZ);\ |
| |
} else\ |
| |
nbuf = REALLOC(nbuf,nbufsize);\ |
| |
} |
| |
|
| |
#define REALLOC_TBUF \ |
| |
if ( i >= tbufsize ) {\ |
| |
tbufsize += TBUFSIZ;\ |
| |
if ( tbuf == tbuf0 ) {\ |
| |
tbuf = (char *)MALLOC_ATOMIC(tbufsize);\ |
| |
bcopy(tbuf0,tbuf,tbufsize-TBUFSIZ);\ |
| |
} else\ |
| |
tbuf = REALLOC(tbuf,tbufsize);\ |
| |
} |
| |
|
| |
#define READ_ALNUM_NBUF \ |
| |
while ( 1 ) {\ |
| |
c = Getc();\ |
| |
if ( isalnum(c) ) {\ |
| |
REALLOC_NBUF nbuf[i++] = c;\ |
| |
} else\ |
| |
break;\ |
| |
} |
| |
|
| |
#define READ_DIGIT_NBUF \ |
| |
while ( 1 ) {\ |
| |
c = Getc();\ |
| |
if ( isdigit(c) ) {\ |
| |
REALLOC_NBUF nbuf[i++] = c;\ |
| |
} else\ |
| |
break;\ |
| |
} |
| |
|
| yylex() |
yylex() |
| { |
{ |
| #define yylvalp (&yylval) |
#define yylvalp (&yylval) |
|
|
| register int *ptr; |
register int *ptr; |
| char *cptr; |
char *cptr; |
| int d,i,j; |
int d,i,j; |
| #if defined(__MWERKS__) |
char nbuf0[NBUFSIZ],tbuf0[TBUFSIZ]; |
| char nbuf[BUFSIZ],tbuf[BUFSIZ]; |
char *nbuf, *tbuf; |
| #else |
int nbufsize, tbufsize; |
| char nbuf[BUFSIZ*10],tbuf[BUFSIZ]; |
|
| #endif |
|
| N n,n1; |
N n,n1; |
| Q q; |
Q q; |
| Obj r; |
Obj r; |
| |
|
| |
/* initialize buffer pointers */ |
| |
nbuf = nbuf0; tbuf = tbuf0; |
| |
nbufsize = NBUFSIZ; tbufsize = TBUFSIZ; |
| |
|
| switch ( c = skipspace() ) { |
switch ( c = skipspace() ) { |
| case EOF : |
case EOF : |
| asir_terminate(2); break; |
asir_terminate(2); break; |
|
|
| } else if ( c == 'x' ) { |
} else if ( c == 'x' ) { |
| for ( i = 0; i < 8; i++ ) |
for ( i = 0; i < 8; i++ ) |
| nbuf[i] = '0'; |
nbuf[i] = '0'; |
| for ( ; isalnum(c = Getc()); nbuf[i++] = c ); |
READ_ALNUM_NBUF |
| Ungetc(c); nbuf[i] = 0; |
Ungetc(c); REALLOC_NBUF nbuf[i] = 0; |
| hexton(nbuf,&n1); |
hexton(nbuf,&n1); |
| NTOQ(n1,1,q); r = (Obj)q; |
NTOQ(n1,1,q); r = (Obj)q; |
| yylvalp->p = (pointer)r; |
yylvalp->p = (pointer)r; |
|
|
| } else if ( c == 'b' ) { |
} else if ( c == 'b' ) { |
| for ( i = 0; i < 32; i++ ) |
for ( i = 0; i < 32; i++ ) |
| nbuf[i] = '0'; |
nbuf[i] = '0'; |
| for ( ; isalnum(c = Getc()); nbuf[i++] = c ); |
READ_ALNUM_NBUF |
| Ungetc(c); nbuf[i] = 0; |
Ungetc(c); REALLOC_NBUF nbuf[i] = 0; |
| binaryton(nbuf,&n1); |
binaryton(nbuf,&n1); |
| NTOQ(n1,1,q); r = (Obj)q; |
NTOQ(n1,1,q); r = (Obj)q; |
| yylvalp->p = (pointer)r; |
yylvalp->p = (pointer)r; |
|
|
| break; |
break; |
| if ( c == '\\' ) |
if ( c == '\\' ) |
| c = Getc(); |
c = Getc(); |
| tbuf[i] = c; |
REALLOC_TBUF tbuf[i] = c; |
| } |
} |
| tbuf[i] = 0; |
REALLOC_TBUF tbuf[i] = 0; |
| cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf); |
cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf); |
| yylvalp->p = (pointer)cptr; |
yylvalp->p = (pointer)cptr; |
| return LCASE; break; |
return LCASE; break; |
| case '"' : |
case '"' : |
| #if 0 |
|
| for ( i = 0; (nbuf[i] = Getc()) != '"'; i++ ); |
|
| #endif |
|
| i = 0; |
i = 0; |
| do { |
do { |
| c = Getc(); |
c = Getc(); |
|
|
| c1 = Getc(); |
c1 = Getc(); |
| if ( c1 == 'n' ) |
if ( c1 == 'n' ) |
| c1 = '\n'; |
c1 = '\n'; |
| nbuf[i++] = c1; |
REALLOC_NBUF nbuf[i++] = c1; |
| } else |
} else { |
| nbuf[i++] = c; |
REALLOC_NBUF nbuf[i++] = c; |
| |
} |
| } while ( c != '"' ); |
} while ( c != '"' ); |
| nbuf[i-1] = 0; |
nbuf[i-1] = 0; /* REALLOC_NBUF is not necessary */ |
| cptr = (char *)MALLOC(strlen(nbuf)+1); |
cptr = (char *)MALLOC(strlen(nbuf)+1); |
| strcpy(cptr,nbuf); yylvalp->p = (pointer) cptr; |
strcpy(cptr,nbuf); yylvalp->p = (pointer) cptr; |
| return ( STR ); break; |
return ( STR ); break; |
|
|
| if ( isdigit(c) ) { |
if ( isdigit(c) ) { |
| for ( i = 0; i < DLENGTH; i++ ) |
for ( i = 0; i < DLENGTH; i++ ) |
| nbuf[i] = '0'; |
nbuf[i] = '0'; |
| for ( nbuf[i++] = c; isdigit(c = Getc()); nbuf[i++] = c); |
REALLOC_NBUF nbuf[i++] = c; |
| |
READ_DIGIT_NBUF |
| if ( c == '.' ) { |
if ( c == '.' ) { |
| double dbl; |
double dbl; |
| Real real; |
Real real; |
| double atof(); |
double atof(); |
| extern int bigfloat; |
extern int bigfloat; |
| |
|
| for ( nbuf[i++] = c; isdigit(c = Getc()); nbuf[i++] = c); |
REALLOC_NBUF nbuf[i++] = c; |
| |
READ_DIGIT_NBUF |
| if ( c == 'e' ) { |
if ( c == 'e' ) { |
| nbuf[i++] = c; |
REALLOC_NBUF nbuf[i++] = c; |
| if ( ((c = Getc()) == '+') || (c == '-') ) { |
c = Getc(); |
| nbuf[i++] = c; c = Getc(); |
if ( (c == '+') || (c == '-') ) { |
| } |
REALLOC_NBUF nbuf[i++] = c; |
| for ( ; isdigit(c); nbuf[i++] = c, c = Getc()); |
} else |
| |
Ungetc(c); |
| |
READ_DIGIT_NBUF |
| } |
} |
| Ungetc(c); nbuf[i] = 0; |
Ungetc(c); REALLOC_NBUF nbuf[i] = 0; |
| #if PARI |
#if PARI |
| if ( !bigfloat ) { |
if ( !bigfloat ) { |
| dbl = (double)atof(nbuf+DLENGTH); |
dbl = (double)atof(nbuf+DLENGTH); |
|
|
| yylvalp->p = (pointer)r; |
yylvalp->p = (pointer)r; |
| return ( FORMULA ); |
return ( FORMULA ); |
| } else if ( isalpha(c) ) { |
} else if ( isalpha(c) ) { |
| for ( i = 1, tbuf[0] = c; isalpha(c = Getc())||isdigit(c)||(c=='_'); i++ ) |
i = 0; |
| tbuf[i] = c; |
tbuf[i++] = c; |
| tbuf[i] = 0; Ungetc(c); |
while ( 1 ) { |
| |
c = Getc(); |
| |
if ( isalpha(c)||isdigit(c)||(c=='_') ) { |
| |
REALLOC_TBUF tbuf[i++] = c; |
| |
} else |
| |
break; |
| |
} |
| |
REALLOC_TBUF tbuf[i] = 0; Ungetc(c); |
| if ( isupper(tbuf[0]) ) { |
if ( isupper(tbuf[0]) ) { |
| cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf); |
cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf); |
| yylvalp->p = (pointer)cptr; |
yylvalp->p = (pointer)cptr; |
|
|
| } |
} |
| } else if ( c == '@' ) { |
} else if ( c == '@' ) { |
| if ( isdigit(c = Getc()) ) { |
if ( isdigit(c = Getc()) ) { |
| for ( i = 1, nbuf[0] = c; isdigit(c = Getc()); nbuf[i++] = c); |
i = 0; |
| Ungetc(c); nbuf[i] = 0; yylvalp->i = atoi(nbuf); |
nbuf[i++] = c; |
| |
READ_DIGIT_NBUF |
| |
Ungetc(c); REALLOC_NBUF nbuf[i] = 0; |
| |
yylvalp->i = atoi(nbuf); |
| return ANS; |
return ANS; |
| } else if ( c == '@' ) { |
} else if ( c == '@' ) { |
| yylvalp->i = MAX(0,APVS->n-1); |
yylvalp->i = MAX(0,APVS->n-1); |
|
|
| return FOP_AND; break; |
return FOP_AND; break; |
| } |
} |
| } else if ( isalpha(c) ) { |
} else if ( isalpha(c) ) { |
| for ( i = 2, tbuf[0] = '@', tbuf[1] = c; |
i = 0; |
| isalpha(c = Getc()); tbuf[i++] = c); |
tbuf[i++] = '@'; |
| Ungetc(c); tbuf[i] = 0; |
tbuf[i++] = c; |
| |
while ( 1 ) { |
| |
c = Getc(); |
| |
if ( isalpha(c) ) { |
| |
REALLOC_TBUF tbuf[i++] = c; |
| |
} else |
| |
break; |
| |
} |
| |
Ungetc(c); REALLOC_TBUF tbuf[i] = 0; |
| if ( !strcmp(tbuf,"@p") ) |
if ( !strcmp(tbuf,"@p") ) |
| return GFPNGEN; |
return GFPNGEN; |
| else if ( !strcmp(tbuf,"@i") ) { |
else if ( !strcmp(tbuf,"@i") ) { |
|
|
| if ( asir_infile->encoded ) |
if ( asir_infile->encoded ) |
| c = decrypt_char((unsigned char)c); |
c = decrypt_char((unsigned char)c); |
| return c; |
return c; |
| } else { |
} else if ( read_exec_file ) |
| |
return EOF; |
| |
else { |
| c = *parse_strp++; |
c = *parse_strp++; |
| if ( !c ) |
if ( !c ) |
| return EOF; |
return EOF; |