1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
| #include <stdio.h>
| #include "awk.h"
| #include "ytab.h"
|
| static char *printname[94] = {
| (char *) "FIRSTTOKEN", /* 258 */
| (char *) "PROGRAM", /* 259 */
| (char *) "PASTAT", /* 260 */
| (char *) "PASTAT2", /* 261 */
| (char *) "XBEGIN", /* 262 */
| (char *) "XEND", /* 263 */
| (char *) "NL", /* 264 */
| (char *) "ARRAY", /* 265 */
| (char *) "MATCH", /* 266 */
| (char *) "NOTMATCH", /* 267 */
| (char *) "MATCHOP", /* 268 */
| (char *) "FINAL", /* 269 */
| (char *) "DOT", /* 270 */
| (char *) "ALL", /* 271 */
| (char *) "CCL", /* 272 */
| (char *) "NCCL", /* 273 */
| (char *) "CHAR", /* 274 */
| (char *) "OR", /* 275 */
| (char *) "STAR", /* 276 */
| (char *) "QUEST", /* 277 */
| (char *) "PLUS", /* 278 */
| (char *) "EMPTYRE", /* 279 */
| (char *) "AND", /* 280 */
| (char *) "BOR", /* 281 */
| (char *) "APPEND", /* 282 */
| (char *) "EQ", /* 283 */
| (char *) "GE", /* 284 */
| (char *) "GT", /* 285 */
| (char *) "LE", /* 286 */
| (char *) "LT", /* 287 */
| (char *) "NE", /* 288 */
| (char *) "IN", /* 289 */
| (char *) "ARG", /* 290 */
| (char *) "BLTIN", /* 291 */
| (char *) "BREAK", /* 292 */
| (char *) "CLOSE", /* 293 */
| (char *) "CONTINUE", /* 294 */
| (char *) "DELETE", /* 295 */
| (char *) "DO", /* 296 */
| (char *) "EXIT", /* 297 */
| (char *) "FOR", /* 298 */
| (char *) "FUNC", /* 299 */
| (char *) "SUB", /* 300 */
| (char *) "GSUB", /* 301 */
| (char *) "IF", /* 302 */
| (char *) "INDEX", /* 303 */
| (char *) "LSUBSTR", /* 304 */
| (char *) "MATCHFCN", /* 305 */
| (char *) "NEXT", /* 306 */
| (char *) "NEXTFILE", /* 307 */
| (char *) "ADD", /* 308 */
| (char *) "MINUS", /* 309 */
| (char *) "MULT", /* 310 */
| (char *) "DIVIDE", /* 311 */
| (char *) "MOD", /* 312 */
| (char *) "ASSIGN", /* 313 */
| (char *) "ASGNOP", /* 314 */
| (char *) "ADDEQ", /* 315 */
| (char *) "SUBEQ", /* 316 */
| (char *) "MULTEQ", /* 317 */
| (char *) "DIVEQ", /* 318 */
| (char *) "MODEQ", /* 319 */
| (char *) "POWEQ", /* 320 */
| (char *) "PRINT", /* 321 */
| (char *) "PRINTF", /* 322 */
| (char *) "SPRINTF", /* 323 */
| (char *) "ELSE", /* 324 */
| (char *) "INTEST", /* 325 */
| (char *) "CONDEXPR", /* 326 */
| (char *) "POSTINCR", /* 327 */
| (char *) "PREINCR", /* 328 */
| (char *) "POSTDECR", /* 329 */
| (char *) "PREDECR", /* 330 */
| (char *) "VAR", /* 331 */
| (char *) "IVAR", /* 332 */
| (char *) "VARNF", /* 333 */
| (char *) "CALL", /* 334 */
| (char *) "NUMBER", /* 335 */
| (char *) "STRING", /* 336 */
| (char *) "REGEXPR", /* 337 */
| (char *) "GETLINE", /* 338 */
| (char *) "RETURN", /* 339 */
| (char *) "SPLIT", /* 340 */
| (char *) "SUBSTR", /* 341 */
| (char *) "WHILE", /* 342 */
| (char *) "CAT", /* 343 */
| (char *) "NOT", /* 344 */
| (char *) "UMINUS", /* 345 */
| (char *) "UPLUS", /* 346 */
| (char *) "POWER", /* 347 */
| (char *) "DECR", /* 348 */
| (char *) "INCR", /* 349 */
| (char *) "INDIRECT", /* 350 */
| (char *) "LASTTOKEN", /* 351 */
| };
|
|
| Cell *(*proctab[94])(Node **, int) = {
| nullproc, /* FIRSTTOKEN */
| program, /* PROGRAM */
| pastat, /* PASTAT */
| dopa2, /* PASTAT2 */
| nullproc, /* XBEGIN */
| nullproc, /* XEND */
| nullproc, /* NL */
| array, /* ARRAY */
| matchop, /* MATCH */
| matchop, /* NOTMATCH */
| nullproc, /* MATCHOP */
| nullproc, /* FINAL */
| nullproc, /* DOT */
| nullproc, /* ALL */
| nullproc, /* CCL */
| nullproc, /* NCCL */
| nullproc, /* CHAR */
| nullproc, /* OR */
| nullproc, /* STAR */
| nullproc, /* QUEST */
| nullproc, /* PLUS */
| nullproc, /* EMPTYRE */
| boolop, /* AND */
| boolop, /* BOR */
| nullproc, /* APPEND */
| relop, /* EQ */
| relop, /* GE */
| relop, /* GT */
| relop, /* LE */
| relop, /* LT */
| relop, /* NE */
| instat, /* IN */
| arg, /* ARG */
| bltin, /* BLTIN */
| jump, /* BREAK */
| closefile, /* CLOSE */
| jump, /* CONTINUE */
| awkdelete, /* DELETE */
| dostat, /* DO */
| jump, /* EXIT */
| forstat, /* FOR */
| nullproc, /* FUNC */
| sub, /* SUB */
| gsub, /* GSUB */
| ifstat, /* IF */
| sindex, /* INDEX */
| nullproc, /* LSUBSTR */
| matchop, /* MATCHFCN */
| jump, /* NEXT */
| jump, /* NEXTFILE */
| arith, /* ADD */
| arith, /* MINUS */
| arith, /* MULT */
| arith, /* DIVIDE */
| arith, /* MOD */
| assign, /* ASSIGN */
| nullproc, /* ASGNOP */
| assign, /* ADDEQ */
| assign, /* SUBEQ */
| assign, /* MULTEQ */
| assign, /* DIVEQ */
| assign, /* MODEQ */
| assign, /* POWEQ */
| printstat, /* PRINT */
| awkprintf, /* PRINTF */
| awksprintf, /* SPRINTF */
| nullproc, /* ELSE */
| intest, /* INTEST */
| condexpr, /* CONDEXPR */
| incrdecr, /* POSTINCR */
| incrdecr, /* PREINCR */
| incrdecr, /* POSTDECR */
| incrdecr, /* PREDECR */
| nullproc, /* VAR */
| nullproc, /* IVAR */
| getnf, /* VARNF */
| call, /* CALL */
| nullproc, /* NUMBER */
| nullproc, /* STRING */
| nullproc, /* REGEXPR */
| awkgetline, /* GETLINE */
| jump, /* RETURN */
| split, /* SPLIT */
| substr, /* SUBSTR */
| whilestat, /* WHILE */
| cat, /* CAT */
| boolop, /* NOT */
| arith, /* UMINUS */
| arith, /* UPLUS */
| arith, /* POWER */
| nullproc, /* DECR */
| nullproc, /* INCR */
| indirect, /* INDIRECT */
| nullproc, /* LASTTOKEN */
| };
|
| char *tokname(int n)
| {
| static char buf[100];
|
| if (n < FIRSTTOKEN || n > LASTTOKEN) {
| sprintf(buf, "token %d", n);
| return buf;
| }
| return printname[n-FIRSTTOKEN];
| }
|
|