|
|
1.1 root 1: %token FIRSTTOKEN /* must be first */
2: %token FATAL
3: %token PROGRAM PASTAT PASTAT2 XBEGIN XEND
4: %token NL
5: %token LT LE GT GE EQ NE APPEND
6: %token MATCH NOTMATCH
7: %token FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS
8: %token ADD MINUS MULT DIVIDE MOD
9: %token ASSIGN ADDEQ SUBEQ MULTEQ DIVEQ MODEQ POWEQ
10: %token PRINT PRINTF
11: %token DELETE
12: %token IF ELSE WHILE FOR IN INTEST NEXT EXIT BREAK CONTINUE
13:
14: %right ASGNOP
15: %left BOR
16: %left AND
17: %nonassoc RELOP MATCHOP
18: %left CAT
19: %left '+' '-'
20: %left '*' '/' '%'
21: %left NOT UMINUS
22: %right POWER
23: %left POSTINCR PREINCR POSTDECR PREDECR INCR DECR
24: %left FIELD INDIRECT SUB GSUB SUBSTR LSUBSTR INDEX CALL RETURN FUNC BLTIN
25: %left SPRINTF GETLINE CLOSE
26: %token STRING NUMBER REGEXPR VAR ARG VARNF ARRAY SPLIT
27:
28: %token LASTTOKEN /* must be last */
29:
30: %{
31: #include "awk.h"
32: yywrap() { return(1); }
33: #ifndef DEBUG
34: # define PUTS(x)
35: #endif
36: Node *beginloc = 0, *endloc = 0;
37: int infunc = 0; /* = 1 if in arglist or body of func */
38: char *curfname = 0;
39: Node *arglist = 0; /* list of args for current function */
40: %}
41: %%
42:
43: program:
44: pa_stats { if (errorflag==0)
45: winner = (Node *)stat3(PROGRAM, beginloc, $1, endloc); }
46: | error { yyclearin; bracecheck(); yyerror("bailing out"); }
47: ;
48:
49: andNL:
50: AND | andNL NL
51: ;
52:
53: begin:
54: XBEGIN '{' stmtlist '}' { beginloc = (Node*) linkum(beginloc,(Node *) $3); }
55: ;
56:
57: borNL:
58: BOR | borNL NL
59: ;
60:
61: commaNL:
62: ',' | commaNL NL
63: ;
64:
65: compound_conditional:
66: conditional borNL conditional { $$ = op2(BOR, $1, $3); }
67: | conditional andNL conditional { $$ = op2(AND, $1, $3); }
68: | NOT conditional { $$ = op1(NOT, $2); }
69: | '(' compound_conditional ')' { $$ = $2; }
70: ;
71:
72: compound_pattern:
73: pattern borNL pattern { $$ = op2(BOR, $1, $3); }
74: | pattern andNL pattern { $$ = op2(AND, $1, $3); }
75: | NOT pattern { $$ = op1(NOT, $2); }
76: | '(' compound_pattern ')' { $$ = $2; }
77: ;
78:
79: conditional:
80: expr { $$ = op2(NE,$1,valtonode(lookup("$zero&null",symtab),CCON)); }
81: | compound_conditional
82: ;
83:
84: cond_expr:
85: rel_expr
86: | lex_expr
87: | in_expr
88: ;
89:
90: easy_expr:
91: term
92: | easy_expr term %prec CAT { $$ = op2(CAT, $1, $2); }
93: | var ASGNOP easy_expr { $$ = op2($2, $1, $3); }
94: ;
95:
96: elseNL:
97: ELSE | elseNL NL
98: ;
99:
100: end:
101: XEND '{' stmtlist '}' { endloc = (Node*) linkum(endloc,(Node *) $3); }
102: ;
103:
104: expr:
105: easy_expr
106: | getpipe
107: | cond_expr
108: ;
109:
110: exprlist:
111: expr
112: | exprlist commaNL expr { $$ = linkum($1, $3); }
113: ;
114:
115: field:
116: FIELD { $$ = valtonode($1, CFLD); }
117: | INDIRECT term { $$ = op1(INDIRECT, $2); }
118: ;
119:
120: for:
121: FOR '(' simple_stmt ';' conditional ';' simple_stmt rparenNL stmt
122: { $$ = stat4(FOR, $3, $5, $7, $9); }
123: | FOR '(' simple_stmt ';' ';' simple_stmt rparenNL stmt
124: { $$ = stat4(FOR, $3, 0, $6, $8); }
125: | FOR '(' varname IN varname rparenNL stmt
126: { $$ = stat3(IN, $3, makearr($5), $7); }
127: ;
128:
129: func:
130: FUNC funcname '(' varlist rparenNL {infunc++;} '{' stmtlist '}'
131: { infunc--; curfname=0; defn($2, $4, $8); }
132: ;
133:
134: funcname:
135: VAR { setfname($1); }
136: | CALL { setfname($1); }
137: ;
138:
139: getpipe:
140: easy_expr '|' GETLINE var { $$ = op3(GETLINE, $4, $2, $1); }
141: | easy_expr '|' GETLINE { $$ = op3(GETLINE, 0, $2, $1); }
142: ;
143:
144: if:
145: IF '(' conditional rparenNL { $$ = $3; }
146: ;
147:
148: in_expr:
149: expr IN varname { $$ = op2(INTEST, $1, makearr($3)); }
150: | '(' in_expr ')' { $$ = $2; }
151: ;
152:
153: lex_expr:
154: expr MATCHOP reg_expr { $$ = op3($2, 0, $1, makedfa(reparse($3), 0)); }
155: | expr MATCHOP expr
156: { if (((Node*)$3)->ntype == NVALUE && ((Cell*)((Node*)$3)->narg[0])->csub == CCON)
157: $$ = op3($2, 0, $1, makedfa(reparse( ((Cell*)((Node*)$3)->narg[0])->sval)), 0);
158: else
159: $$ = op3($2, 1, $1, $3); }
160: | '(' lex_expr ')' { $$ = $2; }
161: ;
162:
163: opt_plist:
164: /* nothing */ { $$ = rectonode(); }
165: | plist
166: ;
167:
168: pa_stat:
169: pattern { $$ = stat2(PASTAT, $1, stat2(PRINT, rectonode(), 0)); }
170: | pattern '{' stmtlist '}' { $$ = stat2(PASTAT, $1, $3); }
171: | pattern ',' pattern { $$ = pa2stat($1, $3, stat2(PRINT, rectonode(), 0)); }
172: | pattern ',' pattern '{' stmtlist '}' { $$ = pa2stat($1, $3, $5); }
173: | '{' stmtlist '}' { $$ = stat2(PASTAT, 0, $2); }
174: ;
175:
176: pa_stats:
177: /* nothing */ { $$ = (int)0; }
178: | pa_stats NL
179: | pa_stats pa_stat { $$ = linkum($1, $2); }
180: | pa_stats begin
181: | pa_stats end
182: | pa_stats func
183: ;
184:
185:
186: pattern:
187: reg_expr { $$ = op3(MATCH, 0, rectonode(), makedfa(reparse($1), 0)); }
188: | rel_expr
189: | lex_expr
190: | in_expr
191: | compound_pattern
192: ;
193:
194: plist:
195: easy_expr
196: | plist commaNL easy_expr { $$ = linkum($1, $3); }
197: | '(' plist ')' { $$ = $2; }
198: ;
199:
200: redir:
201: GT | APPEND | LT | '|'
202: ;
203:
204: reg_expr:
205: '/' {startreg();} REGEXPR '/' { $$ = $3; }
206: ;
207:
208: rel_expr:
209: expr relop expr { $$ = op2($2, $1, $3); }
210: | '(' rel_expr ')' { $$ = $2; }
211: ;
212:
213: relop:
214: EQ | NE | LT | LE | GT | GE
215: ;
216:
217: rparenNL:
218: ')' | rparenNL NL
219: ;
220:
221: simple_stmt:
222: PRINT opt_plist redir expr { $$ = stat3($1, $2, $3, $4); }
223: | PRINT opt_plist { $$ = stat3($1, $2, 0, 0); }
224: | PRINTF plist redir expr { $$ = stat3($1, $2, $3, $4); }
225: | PRINTF plist { $$ = stat3($1, $2, 0, 0); }
226: | DELETE varname '[' expr ']' { $$ = stat2(DELETE, makearr($2), $4); }
227: | expr { $$ = exptostat($1); }
228: | /* nothing */ { $$ = (int)0; }
229: | error { yyclearin; yyerror("illegal statement"); }
230: ;
231:
232: st:
233: NL | ';'
234: ;
235:
236: stmt:
237: simple_stmt st
238: | RETURN st { $$ = stat1(RETURN, 0); }
239: | RETURN expr st { $$ = stat1(RETURN, $2); }
240: | NEXT st { $$ = stat1(NEXT, 0); }
241: | EXIT st { $$ = stat1(EXIT, 0); }
242: | EXIT expr st { $$ = stat1(EXIT, $2); }
243: | BREAK st { $$ = stat1(BREAK, 0); }
244: | CONTINUE st { $$ = stat1(CONTINUE, 0); }
245: | '{' stmtlist '}' { $$ = $2; }
246: | if stmt { $$ = stat3(IF, $1, $2, 0); }
247: | if stmt elseNL stmt { $$ = stat3(IF, $1, $2, $4); }
248: | while stmt { $$ = stat2(WHILE, $1, $2); }
249: | for
250: | varname st { yyerror("no-effect statement"); $$ = 0; }
251: ;
252:
253: stmtlist:
254: /* nothing */ { $$ = (int) 0; }
255: | stmtlist NL
256: | stmtlist ';'
257: | stmtlist stmt { $$ = linkum($1, $2); }
258: ;
259:
260: subop:
261: SUB | GSUB
262: ;
263:
264: term:
265: var
266: | CALL '(' ')' { $$ = op2(CALL, valtonode($1,CVAR), 0); }
267: | CALL '(' exprlist ')' { $$ = op2(CALL, valtonode($1,CVAR), $3); }
268: | NUMBER { $$ = valtonode($1, CCON); }
269: | STRING { $$ = valtonode($1, CCON); }
270: | CLOSE easy_expr { $$ = op1(CLOSE, $2); }
271: | GETLINE var LT easy_expr { $$ = op3(GETLINE, $2, $3, $4); }
272: | GETLINE LT easy_expr { $$ = op3(GETLINE, 0, $2, $3); }
273: | GETLINE var { $$ = op3(GETLINE, $2, 0, 0); }
274: | GETLINE { $$ = op3(GETLINE, 0, 0, 0); }
275: | BLTIN { $$ = op2(BLTIN, $1, rectonode()); }
276: | BLTIN '(' ')' { $$ = op2(BLTIN, $1, rectonode()); }
277: | BLTIN '(' exprlist ')' { $$ = op2(BLTIN, $1, $3); }
278: | SPRINTF '(' plist ')' { $$ = op1($1, $3); }
279: | SUBSTR '(' expr commaNL expr commaNL expr ')' { $$ = op3(SUBSTR, $3, $5, $7); }
280: | SUBSTR '(' expr commaNL expr ')' { $$ = op3(SUBSTR, $3, $5, 0); }
281: | subop '(' reg_expr commaNL expr ')' { $$ = op4($1, 0, makedfa(reparse($3), 1), $5, rectonode()); }
282: | subop '(' expr commaNL expr ')' { $$ = op4($1, 1, $3, $5, rectonode()); }
283: | subop '(' reg_expr commaNL expr commaNL expr ')' { $$ = op4($1, 0, makedfa(reparse($3), 1), $5, $7); }
284: | subop '(' expr commaNL expr commaNL expr ')' { $$ = op4($1, 1, $3, $5, $7); }
285: | SPLIT '(' expr commaNL varname commaNL expr ')' { $$ = op3(SPLIT, $3, makearr($5), $7); }
286: | SPLIT '(' expr commaNL varname ')' { $$ = op3(SPLIT, $3, makearr($5), 0); }
287: | INDEX '(' expr commaNL expr ')' { $$ = op2(INDEX, $3, $5); }
288: | '(' expr ')' { $$ = $2; }
289: | term '+' term { $$ = op2(ADD, $1, $3); }
290: | term '-' term { $$ = op2(MINUS, $1, $3); }
291: | term '*' term { $$ = op2(MULT, $1, $3); }
292: | term '/' term { $$ = op2(DIVIDE, $1, $3); }
293: | term '%' term { $$ = op2(MOD, $1, $3); }
294: | term POWER term { $$ = op2(POWER, $1, $3); }
295: | '-' term %prec UMINUS { $$ = op1(UMINUS, $2); }
296: | '+' term %prec UMINUS { $$ = $2; }
297: | INCR var { $$ = op1(PREINCR, $2); }
298: | DECR var { $$ = op1(PREDECR, $2); }
299: | var INCR { $$ = op1(POSTINCR, $1); }
300: | var DECR { $$ = op1(POSTDECR, $1); }
301: ;
302:
303: var:
304: varname
305: | varname '[' expr ']' { $$ = op2(ARRAY, makearr($1), $3); }
306: | field
307: ;
308:
309: varlist:
310: /* nothing */ { arglist = (Node *)($$ = 0); }
311: | VAR { $$ = valtonode($1,CVAR); arglist = (Node*) $$; }
312: | varlist commaNL VAR { $$ = linkum($1,valtonode($3,CVAR)); arglist = (Node*) $$; }
313: ;
314:
315: varname:
316: VAR { $$ = valtonode($1, CVAR); }
317: | ARG { $$ = op1(ARG, $1); }
318: | VARNF { $$ = op1(VARNF, $1); }
319: ;
320:
321:
322: while:
323: WHILE '(' conditional rparenNL { $$ = $3; }
324: ;
325:
326: %%
327:
328: setfname(p)
329: Cell *p;
330: {
331: extern int bracecnt, brackcnt, parencnt;
332:
333: curfname = p->nval;
334: /*bracecnt = brackcnt = parencnt = 0;*/
335: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.