Annotation of capa/capa51/pProj/capaFormulaLexer.c, revision 1.1.1.1

1.1       albertel    1: 
                      2: /* =========================================================== */
                      3: /*      capaFormulaLexer.c  created by Isaac Tsai @ Feb 1999   */
                      4: /*      copyrighted by Isaac Tsai    1999                      */
                      5: /* =========================================================== */
                      6: 
                      7: #include <ctype.h>    /* isspace() */
                      8: #include <stdio.h>    /* sscanf()  */
                      9: #include "capaParser.h"
                     10: #include "capaFormula.h"
                     11: #include "capaToken.h"
                     12: 
                     13: /* ---------------  Global variables ------------------------- */
                     14: extern      int         Func_idx;
                     15: extern      Symbol      FuncStack[MAX_FUNC_NEST];
                     16: 
                     17: 
                     18: extern      char        Fbuf[ONE_K];          /* lexer input buffer */
                     19: extern      int         Fidx;                 /* lexer input char index */
                     20: 
                     21: extern      Symbol_p    fml_lval;  /* lexical variable used in parser */
                     22: 
                     23: /* ---- Token value returned from this lexer ---------------- */
                     24: 
                     25: /* ---------------  Global variables ------------------------ */
                     26: 
                     27: 
                     28: /* scan a F_NUMBER token */
                     29: double
                     30: f_get_float()
                     31: {
                     32:   double   num; 
                     33:   int      ii=0, len;
                     34:   char     num_str[QUARTER_K];
                     35:   
                     36:   num_str[ii]=0;
                     37:   while( isspace(Fbuf[Fidx]) ) { Fidx++; }
                     38:   if( Fbuf[Fidx] == '+' || Fbuf[Fidx] == '-' ) {
                     39:     num_str[ii++] = Fbuf[Fidx++];
                     40:   }
                     41:   while( isdigit(Fbuf[Fidx]) || Fbuf[Fidx] == '.' ) {
                     42:       num_str[ii++] = Fbuf[Fidx++];
                     43:   }
                     44:   if( Fbuf[Fidx] == 'E' || Fbuf[Fidx] == 'e' ) {  /* a number followed immediately by e or E */
                     45:     if( Fbuf[Fidx+1] == '+' || Fbuf[Fidx+1] == '-' || isdigit(Fbuf[Fidx+1]) ) {  
                     46:     /* e or E followed immediately by a digit */
                     47:       num_str[ii++] = Fbuf[Fidx++];
                     48:       num_str[ii++] = Fbuf[Fidx++];
                     49:       while( isdigit(Fbuf[Fidx]) ) {
                     50:         num_str[ii++] = Fbuf[Fidx++];
                     51:       }
                     52:     }
                     53:   }
                     54:   num_str[ii] = 0; /* terminate the str */
                     55:   len = strlen(num_str);
                     56:   if(len > 0 ) {
                     57:     sscanf(num_str,"%lg", &num);
                     58:   } else {
                     59:     num = 1.0;
                     60:   }
                     61:   return (num);
                     62: }
                     63: 
                     64: char *
                     65: f_get_id()
                     66: {
                     67:   char    *var_p; 
                     68:   int      ii=0, len;
                     69:   char     id_str[QUARTER_K];
                     70:   
                     71:   id_str[ii]=0;
                     72:   while( isspace(Fbuf[Fidx]) ) { Fidx++; }
                     73:   if( isalpha( Fbuf[Fidx] ) ) {
                     74:     id_str[ii++] = Fbuf[Fidx++];
                     75:   }
                     76:   while( isalnum(Fbuf[Fidx]) || Fbuf[Fidx] == '_' ) {
                     77:       id_str[ii++] = Fbuf[Fidx++];
                     78:   }
                     79:   id_str[ii] = 0; /* terminate the str */
                     80:   len = strlen(id_str);
                     81:   var_p = (char *)capa_malloc( (len+1), sizeof(char));
                     82:   strcpy(var_p,id_str);
                     83:   return (var_p);
                     84: }
                     85: 
                     86: int
                     87: f_peek_next_token()
                     88: {
                     89:   int   idx;
                     90:   
                     91:   idx = Fidx;
                     92:   while( isspace(Fbuf[idx]) ) { idx++; }
                     93:   return (Fbuf[idx]); 
                     94: }
                     95: 
                     96: 
                     97: /* ======================================================= */
                     98: 
                     99: int
                    100: fml_lex()
                    101: {
                    102:   char    *id_p;
                    103:   int      c;
                    104:   
                    105:   if( Fbuf[Fidx] == 0 )  { /* printf("EoI\n"); */ return (EOF); }
                    106:   while( isspace(Fbuf[Fidx]) ) { Fidx++; }
                    107:   if( isalpha(Fbuf[Fidx]) ) {
                    108:     id_p = f_get_id();
                    109:     c = f_peek_next_token();
                    110:     if( c == '(' ) {
                    111:       (FuncStack[Func_idx]).s_type = FUNCTION_ID;
                    112:       (FuncStack[Func_idx]).s_name = id_p;
                    113:        Func_idx++;
                    114:        
                    115:        return (F_ID);
                    116:     } else {
                    117:       fml_lval = find_formula_id(id_p); capa_mfree((char *)id_p);
                    118:       if( fml_lval == NULL) {
                    119:         return (F_ERROR);
                    120:       } else {
                    121:         return (V_ID);
                    122:       }
                    123:     } 
                    124:   }
                    125:   if( isdigit(Fbuf[Fidx]) || Fbuf[Fidx] == '.' ) {
                    126:     
                    127:     fml_lval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */
                    128:     fml_lval->s_real = f_get_float();
                    129:     fml_lval->s_type = R_CONSTANT;
                    130:     
                    131:     return (F_NUMBER);
                    132:   }
                    133:   if( Fbuf[Fidx] == '(' ) {
                    134:     Fidx++;
                    135:     return (F_LPAR);
                    136:   }
                    137:   if( Fbuf[Fidx] == ')' ) {
                    138:     Fidx++;
                    139:     return (F_RPAR);
                    140:   }
                    141:   if( Fbuf[Fidx] == '+' ) {
                    142:     Fidx++;
                    143:     return (F_PLUS);
                    144:   }
                    145:   if( Fbuf[Fidx] == '-' ) {
                    146:     Fidx++;
                    147:     return (F_MINUS);
                    148:   }
                    149:   if( Fbuf[Fidx] == '*' ) {
                    150:     Fidx++;
                    151:     return (F_MULT);
                    152:   }
                    153:   if( Fbuf[Fidx] == '/' ) {
                    154:     Fidx++;
                    155:     return (F_DIV);
                    156:   }
                    157:   if( Fbuf[Fidx] == '%' ) {
                    158:     Fidx++;
                    159:     return (F_MOD);
                    160:   }
                    161:   if( Fbuf[Fidx] == '^' ) {
                    162:     Fidx++;
                    163:     return (F_POW);
                    164:   }
                    165:   if( Fbuf[Fidx] == ',' ) {
                    166:     Fidx++;
                    167:     return (F_COMMA);
                    168:   }
                    169:   return (F_ERROR);
                    170:   
                    171: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>