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; |