00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "def.h"
00010
00011
00012 double token_val;
00013 char token_prval[MAXTOKEN + 1];
00014 OP *token_op;
00015
00016
00017 int lineno = 1;
00018 int charno = 0;
00019
00020
00021 FILE *infile;
00022 char *infilename;
00023
00024
00025 int filespushed = 0;
00026 FILE *infiles[MAXFILES];
00027 char *infilenames[MAXFILES];
00028 int inlinenos[MAXFILES];
00029 int verboses[MAXFILES];
00030
00031
00032 extern OP *single_op;
00033 extern OP *double_op;
00034 extern OP *name_op;
00035 extern OP *type_op;
00036
00037
00038 extern void preprocess();
00039 extern void char_free();
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 static char transtab[] =
00058
00059 {C_EOF, C_EOF, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL,
00060 C_CTRL, C_WS, C_NL, C_CTRL, C_NL, C_NL, C_CTRL, C_CTRL,
00061 C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL,
00062 C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL, C_CTRL,
00063 C_WS, C_SPC, C_DQ, C_LB, C_SPC, C_SPC, C_SPC, C_SQ,
00064 C_SPC, C_SPC, C_SPC, C_SPC, C_SPC, C_SPC, C_PER, C_SPC,
00065 C_NUM, C_NUM, C_NUM, C_NUM, C_NUM, C_NUM, C_NUM, C_NUM,
00066 C_NUM, C_NUM, C_SPC, C_SPC, C_SPC, C_SPC, C_SPC, C_SPC,
00067 C_SPC, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH,
00068 C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH,
00069 C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH,
00070 C_ALPH, C_ALPH, C_ALPH, C_SPC, C_SPC, C_SPC, C_SPC, C_ALPH,
00071 C_BQ, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH,
00072 C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH,
00073 C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH, C_ALPH,
00074 C_ALPH, C_ALPH, C_ALPH, C_BRC, C_SPC, C_BRC, C_SPC, C_CTRL};
00075
00076 char *trans = transtab + 1;
00077
00078
00079 #define ST 0
00080 #define SP 1
00081 #define S2 2
00082 #define SL 3
00083 #define SN 4
00084 #define SF 5
00085 #define SI 6
00086 #define SS 7
00087 #define SE 8
00088 #define SC 9
00089 #define SX 10
00090
00091 #define TERM_STATE 50
00092
00093 #define XR 51
00094
00095 #define EC 55
00096 #define EN 56
00097 #define ES 57
00098
00099 #define TI 61
00100 #define TN 62
00101 #define TO 63
00102 #define T2 64
00103 #define TS 65
00104 static char stab[11][13] = {
00105
00106
00107
00108 {ST, EC, ST, ST, SP, SN, SI, SL, SS, SI, SI, XR, SX},
00109 {TO, TO, TO, TO, S2, TO, TO, TO, TO, TO, TO, TO, TO},
00110 {T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2},
00111 {XR, XR, XR, XR, XR, SF, XR, SC, XR, XR, XR, XR, XR},
00112 {TN, TN, TN, TN, TN, SN, EN, SF, TN, TN, TN, TN, TN},
00113 {TN, TN, TN, TN, TN, SF, EN, EN, TN, TN, TN, TN, TN},
00114 {TI, TI, TI, TI, TI, SI, SI, TI, TI, TI, TI, TI, TI},
00115 {ES, SS, ES, SS, SS, SS, SS, SS, TS, SE, SS, SS, SS},
00116 {ES, SS, SS, SS, SS, SS, SS, SS, SS, SS, SS, SS, SS},
00117 {ST, SC, ST, SC, SC, SC, SC, SC, SC, SC, SC, SC, SC},
00118 {ST, ST, ST, SX, SX, SX, SX, SX, SX, SX, SX, SX, SX}};
00119
00120
00121 #define AU 0
00122 #define AE 1
00123 #define AA 2
00124 #define AN 3
00125 #define AF 4
00126 #define AX 5
00127 #define AS 6
00128 #define AR 7
00129 #define AP 8
00130 #define AC 9
00131 static char atab[11][13] = {
00132
00133
00134
00135 {AC, AA, AE, AE, AA, AN, AA, AA, AE, AA, AA, AA, AE},
00136 {AU, AU, AE, AE, AS, AU, AU, AU, AU, AU, AU, AU, AU},
00137 {AU, AU, AE, AE, AU, AU, AU, AU, AU, AU, AU, AU, AU},
00138 {AU, AU, AE, AE, AU, AF, AU, AE, AU, AU, AU, AU, AU},
00139 {AU, AU, AE, AE, AU, AN, AA, AA, AU, AU, AU, AU, AU},
00140 {AU, AU, AE, AE, AU, AF, AA, AA, AU, AU, AU, AU, AU},
00141 {AU, AU, AE, AE, AU, AA, AA, AU, AU, AU, AU, AU, AU},
00142 {AU, AA, AU, AA, AA, AA, AA, AA, AE, AE, AA, AA, AA},
00143 {AU, AX, AE, AX, AX, AX, AX, AX, AA, AA, AX, AX, AX},
00144 {AR, AE, AR, AE, AE, AE, AE, AE, AE, AE, AE, AE, AE},
00145 {AP, AP, AP, AA, AA, AA, AA, AA, AA, AA, AA, AA, AA}};
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 int
00158 scan()
00159 {
00160
00161
00162 static int class = C_NL;
00163 static int c = '\n';
00164
00165
00166 register int state = ST;
00167 register int tlength = 0;
00168 register double fvalue = 0.0;
00169 register double place = 0.1;
00170
00171 #ifdef DEBUG
00172 printf("enter scanner: state %d, class %d, char '%c'\n", state, class, c);
00173 fflush(stdout);
00174 #endif
00175
00176
00177 while (state < TERM_STATE) {
00178 #ifdef DEBUG
00179 printf("scanner: action %d,", atab[state][class]);
00180 fflush(stdout);
00181 #endif
00182
00183 switch(atab[state][class]) {
00184 case AA: L1: token_prval[tlength++] = c;
00185 if (tlength>MAXTOKEN) tlength = MAXTOKEN;
00186
00187 case AE: c = getc(infile);
00188 if (C_NL==trans[c]) { lineno++; charno = 0; }
00189 else charno++;
00190
00191 case AU: break;
00192 case AN: fvalue = (fvalue * 10) + (c-'0');
00193 goto L1;
00194 case AF: fvalue += (c-'0') * place;
00195 place /= 10;
00196 goto L1;
00197 case AX: switch(c) {
00198 case 'n': c = '\n'; break;
00199 case 't': c = '\t'; break;
00200 case 'b': c = '\b'; break;
00201 case 'r': c = '\r'; break;
00202 case 'f': c = '\f'; break;
00203 default:
00204 fprintf(stderr, "character '%c':\n", c);
00205 error("illegal string escape");
00206 }
00207 goto L1;
00208 case AS:
00209
00210 for (token_op = double_op; token_op; token_op = token_op->next) {
00211 if (*token_prval == token_op->pname[0] &&
00212 c == token_op->pname[1])
00213 goto L1;
00214 }
00215
00216 token_prval[1] = '\0';
00217 # ifdef DEBUG
00218 printf("\tchange state to %d\n", TO);
00219 fflush(stdout);
00220 # endif
00221 goto L2;
00222 case AP:
00223 token_prval[tlength++] = '\n';
00224 token_prval[tlength] = '\0';
00225 preprocess();
00226
00227 case AR:
00228 tlength = 0;
00229 break;
00230 case AC:
00231 if (filespushed) {
00232 fclose(infile);
00233 filespushed--;
00234 char_free(infilename);
00235 infile = infiles[filespushed];
00236 infilename = infilenames[filespushed];
00237 lineno = inlinenos[filespushed];
00238 verbose = verboses[filespushed];
00239 c = '\n';
00240 charno = 0;
00241 # ifdef DEBUG
00242 printf("back to file %s, line %d\n", infilename, lineno);
00243 # endif
00244 }
00245 else {
00246 class = C_NL;
00247 c = '\n';
00248 return EOF;
00249 }
00250
00251 }
00252
00253 state = stab[state][class];
00254 class = trans[c];
00255 #ifdef DEBUG
00256 printf(" new state %d,", state);
00257 if (c != EOF) printf(" next char '%c',", c);
00258 else printf(" next char 'EOF',");
00259 printf(" next class %d\n", class);
00260 fflush(stdout);
00261 #endif
00262 }
00263
00264 token_prval[tlength] = '\0';
00265
00266 #ifdef DEBUG
00267 printf("terminal state %d, token is '%s'\n", state, token_prval);
00268 fflush(stdout);
00269 #endif
00270
00271 if (tlength > MAXTOKEN) switch(state) {
00272 case TS: error("string too long");
00273 case TI: error("name too long");
00274 case TN: error("number too big");
00275 default: error("object too long");
00276 }
00277
00278 switch(state) {
00279 case TI:
00280 if (*token_prval == '\'') {
00281 for (token_op = type_op; token_op; token_op = token_op->next) {
00282 if (strcmp(token_prval+1, token_op->pname) == 0) return TYPE;
00283 }
00284 fprintf(stderr, "type name %s not declared\n", token_prval);
00285 error("invalid type");
00286 }
00287 for (token_op = name_op; token_op; token_op = token_op->next) {
00288 if (strcmp(token_prval, token_op->pname) == 0) return OPER;
00289 }
00290 return IDENT;
00291
00292 case TO:
00293 L2:
00294 for (token_op = single_op; token_op; token_op = token_op->next) {
00295 if (*token_prval == token_op->pname[0]) return OPER;
00296 }
00297
00298 fprintf(stderr, "character is: '%c'\n", *token_prval);
00299 error("invalid character");
00300 case T2:
00301
00302 return OPER;
00303 case TN:
00304 token_val = fvalue;
00305 return NUMBER;
00306 case TS:
00307 return STRING;
00308 case XR:
00309 return (int) *token_prval;
00310 case EC:
00311 error("illegal character");
00312 case EN:
00313 error("mis-formed number (or possibly name)");
00314 case ES:
00315 error("unterminated string");
00316 }
00317 }