lin
2025-08-14 dae8bad597b6607a449b32bf76c523423f7720ed
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];
}