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>