nyacc: more CPP fixes
[mes.git] / module / nyacc / lang / c99 / mach.d / c99xact.scm
1 ;; ./mach.d/c99xact.scm
2
3 ;; Copyright (C) 2016,2017 Matthew R. Wette
4 ;; 
5 ;; This software is covered by the GNU GENERAL PUBLIC LICENCE, Version 3,
6 ;; or any later version published by the Free Software Foundation.  See
7 ;; the file COPYING included with the this distribution.
8
9 (define act-v
10   (vector
11    ;; $start => expression
12    (lambda ($1 . $rest) $1)
13    ;; primary-expression => identifier
14    (lambda ($1 . $rest) `(p-expr ,$1))
15    ;; primary-expression => constant
16    (lambda ($1 . $rest) `(p-expr ,$1))
17    ;; primary-expression => string-literal
18    (lambda ($1 . $rest) `(p-expr ,(tl->list $1)))
19    ;; primary-expression => "(" expression ")"
20    (lambda ($3 $2 $1 . $rest) $2)
21    ;; postfix-expression => primary-expression
22    (lambda ($1 . $rest) $1)
23    ;; postfix-expression => postfix-expression "[" expression "]"
24    (lambda ($4 $3 $2 $1 . $rest)
25      `(array-ref ,$3 ,$1))
26    ;; postfix-expression => postfix-expression "(" argument-expression-list...
27    (lambda ($4 $3 $2 $1 . $rest)
28      `(fctn-call ,$1 ,(tl->list $3)))
29    ;; postfix-expression => postfix-expression "(" ")"
30    (lambda ($3 $2 $1 . $rest)
31      `(fctn-call ,$1 (expr-list)))
32    ;; postfix-expression => postfix-expression "." identifier
33    (lambda ($3 $2 $1 . $rest) `(d-sel ,$3 ,$1))
34    ;; postfix-expression => postfix-expression "->" identifier
35    (lambda ($3 $2 $1 . $rest) `(i-sel ,$3 ,$1))
36    ;; postfix-expression => postfix-expression "++"
37    (lambda ($2 $1 . $rest) `(post-inc ,$1))
38    ;; postfix-expression => postfix-expression "--"
39    (lambda ($2 $1 . $rest) `(post-dec ,$1))
40    ;; postfix-expression => "(" type-name ")" "{" initializer-list "}"
41    (lambda ($6 $5 $4 $3 $2 $1 . $rest)
42      `(comp-lit ,$2 ,(tl->list $5)))
43    ;; postfix-expression => "(" type-name ")" "{" initializer-list "," "}"
44    (lambda ($7 $6 $5 $4 $3 $2 $1 . $rest)
45      `(comp-lit ,$2 ,(tl->list $5)))
46    ;; argument-expression-list => assignment-expression
47    (lambda ($1 . $rest) (make-tl 'expr-list $1))
48    ;; argument-expression-list => argument-expression-list "," assignment-e...
49    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
50    ;; argument-expression-list => arg-expr-hack
51    (lambda ($1 . $rest) (make-tl 'expr-list $1))
52    ;; argument-expression-list => argument-expression-list "," arg-expr-hack
53    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
54    ;; arg-expr-hack => declaration-specifiers abstract-declarator
55    (lambda ($2 $1 . $rest)
56      `(param-decl ,(tl->list $1) $2))
57    ;; arg-expr-hack => declaration-specifiers
58    (lambda ($1 . $rest)
59      `(param-decl ,(tl->list $1)))
60    ;; unary-expression => postfix-expression
61    (lambda ($1 . $rest) $1)
62    ;; unary-expression => "++" unary-expression
63    (lambda ($2 $1 . $rest) `(pre-inc ,$2))
64    ;; unary-expression => "--" unary-expression
65    (lambda ($2 $1 . $rest) `(pre-dec ,$2))
66    ;; unary-expression => unary-operator cast-expression
67    (lambda ($2 $1 . $rest) (list $1 $2))
68    ;; unary-expression => "sizeof" unary-expression
69    (lambda ($2 $1 . $rest) `(sizeof-expr ,$2))
70    ;; unary-expression => "sizeof" "(" type-name ")"
71    (lambda ($4 $3 $2 $1 . $rest) `(sizeof-type ,$3))
72    ;; unary-operator => "&"
73    (lambda ($1 . $rest) 'ref-to)
74    ;; unary-operator => "*"
75    (lambda ($1 . $rest) 'de-ref)
76    ;; unary-operator => "+"
77    (lambda ($1 . $rest) 'pos)
78    ;; unary-operator => "-"
79    (lambda ($1 . $rest) 'neg)
80    ;; unary-operator => "~"
81    (lambda ($1 . $rest) 'bitwise-not)
82    ;; unary-operator => "!"
83    (lambda ($1 . $rest) 'not)
84    ;; cast-expression => unary-expression
85    (lambda ($1 . $rest) $1)
86    ;; cast-expression => "(" type-name ")" cast-expression
87    (lambda ($4 $3 $2 $1 . $rest) `(cast ,$2 ,$4))
88    ;; multiplicative-expression => cast-expression
89    (lambda ($1 . $rest) $1)
90    ;; multiplicative-expression => multiplicative-expression "*" cast-expre...
91    (lambda ($3 $2 $1 . $rest) `(mul ,$1 ,$3))
92    ;; multiplicative-expression => multiplicative-expression "/" cast-expre...
93    (lambda ($3 $2 $1 . $rest) `(div ,$1 ,$3))
94    ;; multiplicative-expression => multiplicative-expression "%" cast-expre...
95    (lambda ($3 $2 $1 . $rest) `(mod ,$1 ,$3))
96    ;; additive-expression => multiplicative-expression
97    (lambda ($1 . $rest) $1)
98    ;; additive-expression => additive-expression "+" multiplicative-expression
99    (lambda ($3 $2 $1 . $rest) `(add ,$1 ,$3))
100    ;; additive-expression => additive-expression "-" multiplicative-expression
101    (lambda ($3 $2 $1 . $rest) `(sub ,$1 ,$3))
102    ;; shift-expression => additive-expression
103    (lambda ($1 . $rest) $1)
104    ;; shift-expression => shift-expression "<<" additive-expression
105    (lambda ($3 $2 $1 . $rest) `(lshift ,$1 ,$3))
106    ;; shift-expression => shift-expression ">>" additive-expression
107    (lambda ($3 $2 $1 . $rest) `(rshift ,$1 ,$3))
108    ;; relational-expression => shift-expression
109    (lambda ($1 . $rest) $1)
110    ;; relational-expression => relational-expression "<" shift-expression
111    (lambda ($3 $2 $1 . $rest) `(lt ,$1 ,$3))
112    ;; relational-expression => relational-expression ">" shift-expression
113    (lambda ($3 $2 $1 . $rest) `(gt ,$1 ,$3))
114    ;; relational-expression => relational-expression "<=" shift-expression
115    (lambda ($3 $2 $1 . $rest) `(le ,$1 ,$3))
116    ;; relational-expression => relational-expression ">=" shift-expression
117    (lambda ($3 $2 $1 . $rest) `(ge ,$1 ,$3))
118    ;; equality-expression => relational-expression
119    (lambda ($1 . $rest) $1)
120    ;; equality-expression => equality-expression "==" relational-expression
121    (lambda ($3 $2 $1 . $rest) `(eq ,$1 ,$3))
122    ;; equality-expression => equality-expression "!=" relational-expression
123    (lambda ($3 $2 $1 . $rest) `(ne ,$1 ,$3))
124    ;; bitwise-and-expression => equality-expression
125    (lambda ($1 . $rest) $1)
126    ;; bitwise-and-expression => bitwise-and-expression "&" equality-expression
127    (lambda ($3 $2 $1 . $rest)
128      `(bitwise-and ,$1 ,$3))
129    ;; bitwise-xor-expression => bitwise-and-expression
130    (lambda ($1 . $rest) $1)
131    ;; bitwise-xor-expression => bitwise-xor-expression "^" bitwise-and-expr...
132    (lambda ($3 $2 $1 . $rest)
133      `(bitwise-xor ,$1 ,$3))
134    ;; bitwise-or-expression => bitwise-xor-expression
135    (lambda ($1 . $rest) $1)
136    ;; bitwise-or-expression => bitwise-or-expression "|" bitwise-xor-expres...
137    (lambda ($3 $2 $1 . $rest) `(bitwise-or ,$1 ,$3))
138    ;; logical-and-expression => bitwise-or-expression
139    (lambda ($1 . $rest) $1)
140    ;; logical-and-expression => logical-and-expression "&&" bitwise-or-expr...
141    (lambda ($3 $2 $1 . $rest) `(and ,$1 ,$3))
142    ;; logical-or-expression => logical-and-expression
143    (lambda ($1 . $rest) $1)
144    ;; logical-or-expression => logical-or-expression "||" logical-and-expre...
145    (lambda ($3 $2 $1 . $rest) `(or ,$1 ,$3))
146    ;; conditional-expression => logical-or-expression
147    (lambda ($1 . $rest) $1)
148    ;; conditional-expression => logical-or-expression "?" expression ":" co...
149    (lambda ($5 $4 $3 $2 $1 . $rest)
150      `(cond-expr ,$1 ,$3 ,$5))
151    ;; assignment-expression => conditional-expression
152    (lambda ($1 . $rest) $1)
153    ;; assignment-expression => unary-expression assignment-operator assignm...
154    (lambda ($3 $2 $1 . $rest)
155      `(assn-expr ,$1 (op ,$2) ,$3))
156    ;; assignment-operator => "="
157    (lambda ($1 . $rest) $1)
158    ;; assignment-operator => "+="
159    (lambda ($1 . $rest) $1)
160    ;; assignment-operator => "-="
161    (lambda ($1 . $rest) $1)
162    ;; assignment-operator => "*="
163    (lambda ($1 . $rest) $1)
164    ;; assignment-operator => "/="
165    (lambda ($1 . $rest) $1)
166    ;; assignment-operator => "%="
167    (lambda ($1 . $rest) $1)
168    ;; assignment-operator => "<<="
169    (lambda ($1 . $rest) $1)
170    ;; assignment-operator => ">>="
171    (lambda ($1 . $rest) $1)
172    ;; assignment-operator => "&="
173    (lambda ($1 . $rest) $1)
174    ;; assignment-operator => "^="
175    (lambda ($1 . $rest) $1)
176    ;; assignment-operator => "|="
177    (lambda ($1 . $rest) $1)
178    ;; expression => assignment-expression
179    (lambda ($1 . $rest) $1)
180    ;; expression => expression "," assignment-expression
181    (lambda ($3 $2 $1 . $rest)
182      (if (eqv? 'comma-expr (sx-tag $1))
183        (append $1 (list $3))
184        `(comma-expr ,$1 ,$3)))
185    ;; constant-expression => conditional-expression
186    (lambda ($1 . $rest) $1)
187    ;; declaration => declaration-specifiers init-declarator-list $P1 ";" op...
188    (lambda ($5 $4 $3 $2 $1 . $rest)
189      (if (pair? $5) (append $3 (list $5)) $3))
190    ;; declaration => declaration-specifiers ";" opt-code-comment
191    (lambda ($3 $2 $1 . $rest)
192      (if (pair? $3)
193        `(decl ,(tl->list $1) ,(list $3))
194        `(decl ,(tl->list $1))))
195    ;; $P1 => 
196    (lambda ($2 $1 . $rest)
197      (save-typenames
198        `(decl ,(tl->list $1) ,(tl->list $2))))
199    ;; declaration-specifiers => storage-class-specifier
200    (lambda ($1 . $rest)
201      (make-tl 'decl-spec-list $1))
202    ;; declaration-specifiers => storage-class-specifier declaration-specifiers
203    (lambda ($2 $1 . $rest) (tl-insert $2 $1))
204    ;; declaration-specifiers => type-specifier
205    (lambda ($1 . $rest)
206      (make-tl 'decl-spec-list $1))
207    ;; declaration-specifiers => type-specifier declaration-specifiers
208    (lambda ($2 $1 . $rest) (tl-insert $2 $1))
209    ;; declaration-specifiers => type-qualifier
210    (lambda ($1 . $rest)
211      (make-tl 'decl-spec-list $1))
212    ;; declaration-specifiers => type-qualifier declaration-specifiers
213    (lambda ($2 $1 . $rest) (tl-insert $2 $1))
214    ;; declaration-specifiers => function-specifier
215    (lambda ($1 . $rest)
216      (make-tl 'decl-spec-list $1))
217    ;; declaration-specifiers => function-specifier declaration-specifiers
218    (lambda ($2 $1 . $rest) (tl-insert $2 $1))
219    ;; init-declarator-list => init-declarator
220    (lambda ($1 . $rest)
221      (make-tl 'init-declr-list $1))
222    ;; init-declarator-list => init-declarator-list "," init-declarator
223    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
224    ;; init-declarator => declarator
225    (lambda ($1 . $rest) `(init-declr ,$1))
226    ;; init-declarator => declarator "=" initializer
227    (lambda ($3 $2 $1 . $rest) `(init-declr ,$1 ,$3))
228    ;; storage-class-specifier => "auto"
229    (lambda ($1 . $rest) '(stor-spec (auto)))
230    ;; storage-class-specifier => "extern"
231    (lambda ($1 . $rest) '(stor-spec (extern)))
232    ;; storage-class-specifier => "register"
233    (lambda ($1 . $rest) '(stor-spec (register)))
234    ;; storage-class-specifier => "static"
235    (lambda ($1 . $rest) '(stor-spec (static)))
236    ;; storage-class-specifier => "typedef"
237    (lambda ($1 . $rest) '(stor-spec (typedef)))
238    ;; type-specifier => "void"
239    (lambda ($1 . $rest) '(type-spec (void)))
240    ;; type-specifier => fixed-type-specifier
241    (lambda ($1 . $rest) `(type-spec ,$1))
242    ;; type-specifier => float-type-specifier
243    (lambda ($1 . $rest) `(type-spec ,$1))
244    ;; type-specifier => "_Bool"
245    (lambda ($1 . $rest)
246      '(type-spec (fixed-type "_Bool")))
247    ;; type-specifier => complex-type-specifier
248    (lambda ($1 . $rest) `(type-spec ,$1))
249    ;; type-specifier => struct-or-union-specifier
250    (lambda ($1 . $rest) `(type-spec ,$1))
251    ;; type-specifier => enum-specifier
252    (lambda ($1 . $rest) `(type-spec ,$1))
253    ;; type-specifier => typedef-name
254    (lambda ($1 . $rest) `(type-spec ,$1))
255    ;; fixed-type-specifier => "short"
256    (lambda ($1 . $rest) '(fixed-type "short"))
257    ;; fixed-type-specifier => "short" "int"
258    (lambda ($2 $1 . $rest)
259      '(fixed-type "short int"))
260    ;; fixed-type-specifier => "signed" "short"
261    (lambda ($2 $1 . $rest)
262      '(fixed-type "signed short"))
263    ;; fixed-type-specifier => "signed" "short" "int"
264    (lambda ($3 $2 $1 . $rest)
265      '(fixed-type "signed short int"))
266    ;; fixed-type-specifier => "int"
267    (lambda ($1 . $rest) '(fixed-type "int"))
268    ;; fixed-type-specifier => "signed"
269    (lambda ($1 . $rest) '(fixed-type "signed"))
270    ;; fixed-type-specifier => "signed" "int"
271    (lambda ($2 $1 . $rest)
272      '(fixed-type "signed int"))
273    ;; fixed-type-specifier => "long"
274    (lambda ($1 . $rest) '(fixed-type "long"))
275    ;; fixed-type-specifier => "long" "int"
276    (lambda ($2 $1 . $rest) '(fixed-type "long int"))
277    ;; fixed-type-specifier => "signed" "long"
278    (lambda ($2 $1 . $rest)
279      '(fixed-type "signed long"))
280    ;; fixed-type-specifier => "signed" "long" "int"
281    (lambda ($3 $2 $1 . $rest)
282      '(fixed-type "signed long int"))
283    ;; fixed-type-specifier => "long" "long"
284    (lambda ($2 $1 . $rest)
285      '(fixed-type "long long"))
286    ;; fixed-type-specifier => "long" "long" "int"
287    (lambda ($3 $2 $1 . $rest)
288      '(fixed-type "long long int"))
289    ;; fixed-type-specifier => "signed" "long" "long"
290    (lambda ($3 $2 $1 . $rest)
291      '(fixed-type "signed long long"))
292    ;; fixed-type-specifier => "signed" "long" "long" "int"
293    (lambda ($4 $3 $2 $1 . $rest)
294      '(fixed-type "signed long long int"))
295    ;; fixed-type-specifier => "unsigned" "short" "int"
296    (lambda ($3 $2 $1 . $rest)
297      '(fixed-type "unsigned short int"))
298    ;; fixed-type-specifier => "unsigned" "short"
299    (lambda ($2 $1 . $rest)
300      '(fixed-type "unsigned short"))
301    ;; fixed-type-specifier => "unsigned" "int"
302    (lambda ($2 $1 . $rest)
303      '(fixed-type "unsigned int"))
304    ;; fixed-type-specifier => "unsigned"
305    (lambda ($1 . $rest) '(fixed-type "unsigned"))
306    ;; fixed-type-specifier => "unsigned" "long" "int"
307    (lambda ($3 $2 $1 . $rest)
308      '(fixed-type "unsigned long"))
309    ;; fixed-type-specifier => "unsigned" "long"
310    (lambda ($2 $1 . $rest)
311      '(fixed-type "unsigned long"))
312    ;; fixed-type-specifier => "unsigned" "long" "long" "int"
313    (lambda ($4 $3 $2 $1 . $rest)
314      '(fixed-type "unsigned long long int"))
315    ;; fixed-type-specifier => "unsigned" "long" "long"
316    (lambda ($3 $2 $1 . $rest)
317      '(fixed-type "unsigned long long"))
318    ;; fixed-type-specifier => "char"
319    (lambda ($1 . $rest) '(fixed-type "char"))
320    ;; fixed-type-specifier => "signed" "char"
321    (lambda ($2 $1 . $rest)
322      '(fixed-type "signed char"))
323    ;; fixed-type-specifier => "unsigned" "char"
324    (lambda ($2 $1 . $rest)
325      '(fixed-type "unsigned char"))
326    ;; float-type-specifier => "float"
327    (lambda ($1 . $rest) '(float-type "float"))
328    ;; float-type-specifier => "double"
329    (lambda ($1 . $rest) '(float-type "double"))
330    ;; float-type-specifier => "long" "double"
331    (lambda ($2 $1 . $rest)
332      '(float-type "long double"))
333    ;; complex-type-specifier => "_Complex"
334    (lambda ($1 . $rest) '(complex-type "_Complex"))
335    ;; complex-type-specifier => "float" "_Complex"
336    (lambda ($2 $1 . $rest)
337      '(complex-type "float _Complex"))
338    ;; complex-type-specifier => "double" "_Complex"
339    (lambda ($2 $1 . $rest)
340      '(complex-type "double _Complex"))
341    ;; complex-type-specifier => "long" "double" "_Complex"
342    (lambda ($3 $2 $1 . $rest)
343      '(complex-type "long double _Complex"))
344    ;; struct-or-union-specifier => "struct" ident-like "{" struct-declarati...
345    (lambda ($5 $4 $3 $2 $1 . $rest)
346      `(struct-def ,$2 ,(tl->list $4)))
347    ;; struct-or-union-specifier => "struct" "{" struct-declaration-list "}"
348    (lambda ($4 $3 $2 $1 . $rest)
349      `(struct-def ,(tl->list $3)))
350    ;; struct-or-union-specifier => "struct" ident-like
351    (lambda ($2 $1 . $rest) `(struct-ref ,$2))
352    ;; struct-or-union-specifier => "union" ident-like "{" struct-declaratio...
353    (lambda ($5 $4 $3 $2 $1 . $rest)
354      `(union-def ,$2 ,(tl->list $4)))
355    ;; struct-or-union-specifier => "union" "{" struct-declaration-list "}"
356    (lambda ($4 $3 $2 $1 . $rest)
357      `(union-def ,(tl->list $3)))
358    ;; struct-or-union-specifier => "union" ident-like
359    (lambda ($2 $1 . $rest) `(union-ref ,$2))
360    ;; ident-like => identifier
361    (lambda ($1 . $rest) $1)
362    ;; ident-like => typedef-name
363    (lambda ($1 . $rest) `(ident ,(cdr $1)))
364    ;; struct-declaration-list => struct-declaration
365    (lambda ($1 . $rest) (make-tl 'field-list $1))
366    ;; struct-declaration-list => lone-comment
367    (lambda ($1 . $rest) (make-tl 'field-list $1))
368    ;; struct-declaration-list => struct-declaration-list struct-declaration
369    (lambda ($2 $1 . $rest) (tl-append $1 $2))
370    ;; struct-declaration-list => struct-declaration-list lone-comment
371    (lambda ($2 $1 . $rest) (tl-append $1 $2))
372    ;; struct-declaration => specifier-qualifier-list struct-declarator-list...
373    (lambda ($4 $3 $2 $1 . $rest)
374      (if (pair? $4)
375        `(comp-decl ,(tl->list $1) ,(tl->list $2) ,$4)
376        `(comp-decl ,(tl->list $1) ,(tl->list $2))))
377    ;; specifier-qualifier-list => type-specifier specifier-qualifier-list
378    (lambda ($2 $1 . $rest) (tl-insert $2 $1))
379    ;; specifier-qualifier-list => type-specifier
380    (lambda ($1 . $rest)
381      (make-tl 'decl-spec-list $1))
382    ;; specifier-qualifier-list => type-qualifier specifier-qualifier-list
383    (lambda ($2 $1 . $rest) (tl-insert $2 $1))
384    ;; specifier-qualifier-list => type-qualifier
385    (lambda ($1 . $rest)
386      (make-tl 'decl-spec-list $1))
387    ;; struct-declarator-list => struct-declarator
388    (lambda ($1 . $rest)
389      (make-tl 'comp-declr-list $1))
390    ;; struct-declarator-list => struct-declarator-list "," struct-declarator
391    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
392    ;; struct-declarator => declarator
393    (lambda ($1 . $rest) `(comp-declr ,$1))
394    ;; struct-declarator => declarator ":" constant-expression
395    (lambda ($3 $2 $1 . $rest)
396      `(comp-declr (bit-field ,$1 ,$3)))
397    ;; struct-declarator => ":" constant-expression
398    (lambda ($2 $1 . $rest)
399      `(comp-declr (bit-field ,$2)))
400    ;; enum-specifier => "enum" ident-like "{" enumerator-list "}"
401    (lambda ($5 $4 $3 $2 $1 . $rest)
402      `(enum-def ,$2 ,(tl->list $4)))
403    ;; enum-specifier => "enum" ident-like "{" enumerator-list "," "}"
404    (lambda ($6 $5 $4 $3 $2 $1 . $rest)
405      `(enum-def ,$2 ,(tl->list $4)))
406    ;; enum-specifier => "enum" "{" enumerator-list "}"
407    (lambda ($4 $3 $2 $1 . $rest)
408      `(enum-def ,(tl->list $3)))
409    ;; enum-specifier => "enum" "{" enumerator-list "," "}"
410    (lambda ($5 $4 $3 $2 $1 . $rest)
411      `(enum-def ,(tl->list $3)))
412    ;; enum-specifier => "enum" ident-like
413    (lambda ($2 $1 . $rest) `(enum-ref ,$2))
414    ;; enumerator-list => enumerator
415    (lambda ($1 . $rest) (make-tl 'enum-def-list $1))
416    ;; enumerator-list => enumerator-list "," enumerator
417    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
418    ;; enumerator => identifier
419    (lambda ($1 . $rest) `(enum-defn ,$1))
420    ;; enumerator => identifier "=" constant-expression
421    (lambda ($3 $2 $1 . $rest) `(enum-defn ,$1 ,$3))
422    ;; type-qualifier => "const"
423    (lambda ($1 . $rest) `(type-qual ,$1))
424    ;; type-qualifier => "volatile"
425    (lambda ($1 . $rest) `(type-qual ,$1))
426    ;; type-qualifier => "restrict"
427    (lambda ($1 . $rest) `(type-qual ,$1))
428    ;; function-specifier => "inline"
429    (lambda ($1 . $rest) `(fctn-spec ,$1))
430    ;; declarator => pointer direct-declarator
431    (lambda ($2 $1 . $rest) `(ptr-declr ,$1 ,$2))
432    ;; declarator => direct-declarator
433    (lambda ($1 . $rest) $1)
434    ;; direct-declarator => identifier
435    (lambda ($1 . $rest) $1)
436    ;; direct-declarator => "(" declarator ")"
437    (lambda ($3 $2 $1 . $rest) `(scope ,$2))
438    ;; direct-declarator => direct-declarator "[" type-qualifier-list assign...
439    (lambda ($5 $4 $3 $2 $1 . $rest)
440      `(array-of ,$1 ,$3 ,$4))
441    ;; direct-declarator => direct-declarator "[" type-qualifier-list "]"
442    (lambda ($4 $3 $2 $1 . $rest)
443      `(array-of ,$1 ,$3))
444    ;; direct-declarator => direct-declarator "[" assignment-expression "]"
445    (lambda ($4 $3 $2 $1 . $rest)
446      `(array-of ,$1 ,$3))
447    ;; direct-declarator => direct-declarator "[" "]"
448    (lambda ($3 $2 $1 . $rest) `(array-of ,$1))
449    ;; direct-declarator => direct-declarator "[" "static" type-qualifier-li...
450    (lambda ($6 $5 $4 $3 $2 $1 . $rest)
451      `(array-of
452         ,$1
453         ,(tl->list (tl-insert '(stor-spec "static") $4))
454         ,$5))
455    ;; direct-declarator => direct-declarator "[" type-qualifier-list "stati...
456    (lambda ($6 $5 $4 $3 $2 $1 . $rest)
457      `(array-of
458         ,$1
459         ,(tl->list (tl-insert '(stor-spec "static") $3))
460         ,$5))
461    ;; direct-declarator => direct-declarator "[" type-qualifier-list "*" "]"
462    (lambda ($5 $4 $3 $2 $1 . $rest)
463      `(array-of ,$1 ,$3 (var-len)))
464    ;; direct-declarator => direct-declarator "[" "*" "]"
465    (lambda ($4 $3 $2 $1 . $rest)
466      `(array-of ,$1 (var-len)))
467    ;; direct-declarator => direct-declarator "(" parameter-type-list ")"
468    (lambda ($4 $3 $2 $1 . $rest)
469      `(ftn-declr ,$1 ,(tl->list $3)))
470    ;; direct-declarator => direct-declarator "(" identifier-list ")"
471    (lambda ($4 $3 $2 $1 . $rest)
472      `(ftn-declr ,$1 ,(tl->list $3)))
473    ;; direct-declarator => direct-declarator "(" ")"
474    (lambda ($3 $2 $1 . $rest)
475      `(ftn-declr ,$1 (param-list)))
476    ;; pointer => "*" type-qualifier-list
477    (lambda ($2 $1 . $rest)
478      `(pointer ,(tl->list $2)))
479    ;; pointer => "*"
480    (lambda ($1 . $rest) '(pointer))
481    ;; pointer => "*" type-qualifier-list pointer
482    (lambda ($3 $2 $1 . $rest)
483      `(pointer ,(tl->list $2) ,$3))
484    ;; pointer => "*" pointer
485    (lambda ($2 $1 . $rest) `(pointer ,$2))
486    ;; type-qualifier-list => type-qualifier
487    (lambda ($1 . $rest)
488      (make-tl 'decl-spec-list $1))
489    ;; type-qualifier-list => type-qualifier-list type-qualifier
490    (lambda ($2 $1 . $rest) (tl-append $1 $2))
491    ;; parameter-type-list => parameter-list
492    (lambda ($1 . $rest) $1)
493    ;; parameter-type-list => parameter-list "," "..."
494    (lambda ($3 $2 $1 . $rest)
495      (tl-append $1 '(ellipsis)))
496    ;; parameter-list => parameter-declaration
497    (lambda ($1 . $rest) (make-tl 'param-list $1))
498    ;; parameter-list => parameter-list "," parameter-declaration
499    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
500    ;; parameter-declaration => declaration-specifiers declarator
501    (lambda ($2 $1 . $rest)
502      `(param-decl ,(tl->list $1) (param-declr ,$2)))
503    ;; parameter-declaration => declaration-specifiers abstract-declarator
504    (lambda ($2 $1 . $rest)
505      `(param-decl ,(tl->list $1) (param-declr ,$2)))
506    ;; parameter-declaration => declaration-specifiers
507    (lambda ($1 . $rest)
508      `(param-decl ,(tl->list $1)))
509    ;; identifier-list => identifier
510    (lambda ($1 . $rest) (make-tl 'ident-list $1))
511    ;; identifier-list => identifier-list "," identifier
512    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
513    ;; type-name => specifier-qualifier-list abstract-declarator
514    (lambda ($2 $1 . $rest)
515      `(type-name ,(tl->list $1) ,$2))
516    ;; type-name => declaration-specifiers
517    (lambda ($1 . $rest) `(type-name ,(tl->list $1)))
518    ;; abstract-declarator => pointer
519    (lambda ($1 . $rest) `(abs-declr ,$1))
520    ;; abstract-declarator => pointer direct-abstract-declarator
521    (lambda ($2 $1 . $rest) `(abs-declr ,$1 ,$2))
522    ;; abstract-declarator => direct-abstract-declarator
523    (lambda ($1 . $rest) `(abs-declr ,$1))
524    ;; direct-abstract-declarator => "(" abstract-declarator ")"
525    (lambda ($3 $2 $1 . $rest) `(declr-scope ,$2))
526    ;; direct-abstract-declarator => direct-abstract-declarator "[" type-qua...
527    (lambda ($5 $4 $3 $2 $1 . $rest)
528      `(declr-array ,$3 ,$4))
529    ;; direct-abstract-declarator => direct-abstract-declarator "[" type-qua...
530    (lambda ($4 $3 $2 $1 . $rest)
531      `(declr-array ,$1 ,$3))
532    ;; direct-abstract-declarator => direct-abstract-declarator "[" assignme...
533    (lambda ($4 $3 $2 $1 . $rest)
534      `(declr-array ,$1 ,$3))
535    ;; direct-abstract-declarator => direct-abstract-declarator "[" "]"
536    (lambda ($3 $2 $1 . $rest) `(declr-array ,$1))
537    ;; direct-abstract-declarator => direct-abstract-declarator "[" "static"...
538    (lambda ($6 $5 $4 $3 $2 $1 . $rest)
539      `(declr-array
540         ,$1
541         ,(tl->list (tl-insert '(stor-spec "static") $4))
542         ,$5))
543    ;; direct-abstract-declarator => direct-abstract-declarator "[" "static"...
544    (lambda ($5 $4 $3 $2 $1 . $rest)
545      `(declr-array
546         ,$1
547         ,(tl->list (tl-insert '(stor-spec "static") $4))))
548    ;; direct-abstract-declarator => direct-abstract-declarator "[" type-qua...
549    (lambda ($6 $5 $4 $3 $2 $1 . $rest)
550      `(declr-array
551         ,$1
552         ,(tl->list (tl-insert '(stor-spec "static") $3))
553         ,$5))
554    ;; direct-abstract-declarator => "[" type-qualifier-list assignment-expr...
555    (lambda ($4 $3 $2 $1 . $rest)
556      `(declr-anon-array ,$2 ,$3))
557    ;; direct-abstract-declarator => "[" type-qualifier-list "]"
558    (lambda ($3 $2 $1 . $rest)
559      `(declr-anon-array ,$2))
560    ;; direct-abstract-declarator => "[" assignment-expression "]"
561    (lambda ($3 $2 $1 . $rest)
562      `(declr-anon-array ,$2))
563    ;; direct-abstract-declarator => "[" "]"
564    (lambda ($2 $1 . $rest) `(declr-anon-array))
565    ;; direct-abstract-declarator => "[" "static" type-qualifier-list assign...
566    (lambda ($5 $4 $3 $2 $1 . $rest)
567      `(declr-anon-array
568         ,(tl->list (tl-insert '(stor-spec "static") $3))
569         ,$4))
570    ;; direct-abstract-declarator => "[" "static" type-qualifier-list "]"
571    (lambda ($4 $3 $2 $1 . $rest)
572      `(declr-anon-array
573         ,(tl->list (tl-insert '(stor-spec "static") $3))))
574    ;; direct-abstract-declarator => "[" type-qualifier-list "static" assign...
575    (lambda ($5 $4 $3 $2 $1 . $rest)
576      `(declr-anon-array
577         ,(tl->list (tl-insert '(stor-spec "static") $2))
578         ,$4))
579    ;; direct-abstract-declarator => direct-abstract-declarator "[" "*" "]"
580    (lambda ($4 $3 $2 $1 . $rest) `(declr-STAR ,$1))
581    ;; direct-abstract-declarator => "[" "*" "]"
582    (lambda ($3 $2 $1 . $rest) '(declr-STAR))
583    ;; direct-abstract-declarator => direct-abstract-declarator "(" paramete...
584    (lambda ($4 $3 $2 $1 . $rest)
585      `(declr-fctn ,$1 ,(tl->list $3)))
586    ;; direct-abstract-declarator => direct-abstract-declarator "(" ")"
587    (lambda ($3 $2 $1 . $rest) `(declr-fctn ,$1))
588    ;; direct-abstract-declarator => "(" parameter-type-list ")"
589    (lambda ($3 $2 $1 . $rest)
590      `(declr-anon-fctn ,(tl->list $2)))
591    ;; direct-abstract-declarator => "(" ")"
592    (lambda ($2 $1 . $rest) '(declr-anon-fctn))
593    ;; typedef-name => 'typename
594    (lambda ($1 . $rest) `(typename ,$1))
595    ;; initializer => assignment-expression
596    (lambda ($1 . $rest) `(initzer ,$1))
597    ;; initializer => "{" initializer-list "}"
598    (lambda ($3 $2 $1 . $rest)
599      `(initzer ,(tl->list $2)))
600    ;; initializer => "{" initializer-list "," "}"
601    (lambda ($4 $3 $2 $1 . $rest)
602      `(initzer ,(tl->list $2)))
603    ;; initializer-list => designation initializer
604    (lambda ($2 $1 . $rest)
605      (make-tl 'initzer-list $1 $2))
606    ;; initializer-list => initializer
607    (lambda ($1 . $rest) (make-tl 'initzer-list $1))
608    ;; initializer-list => initializer-list "," designation initializer
609    (lambda ($4 $3 $2 $1 . $rest)
610      (tl-append $1 $3 $4))
611    ;; initializer-list => initializer-list "," initializer
612    (lambda ($3 $2 $1 . $rest) (tl-append $1 $3))
613    ;; designation => designator-list "="
614    (lambda ($2 $1 . $rest) `(desig ,$1))
615    ;; designator-list => designator
616    (lambda ($1 . $rest) (make-tl 'desgr-list $1))
617    ;; designator-list => designator-list designator
618    (lambda ($2 $1 . $rest) (tl-append $1 $2))
619    ;; designator => "[" constant-expression "]"
620    (lambda ($3 $2 $1 . $rest) (list 'array-dsgr $2))
621    ;; designator => "." identifier
622    (lambda ($2 $1 . $rest) (list 'sel-dsgr $2))
623    ;; statement => labeled-statement
624    (lambda ($1 . $rest) $1)
625    ;; statement => compound-statement
626    (lambda ($1 . $rest) $1)
627    ;; statement => expression-statement
628    (lambda ($1 . $rest) $1)
629    ;; statement => selection-statement
630    (lambda ($1 . $rest) $1)
631    ;; statement => iteration-statement
632    (lambda ($1 . $rest) $1)
633    ;; statement => jump-statement
634    (lambda ($1 . $rest) $1)
635    ;; statement => cpp-statement
636    (lambda ($1 . $rest) $1)
637    ;; labeled-statement => identifier ":" statement
638    (lambda ($3 $2 $1 . $rest)
639      `(labeled-stmt ,$1 ,$3))
640    ;; labeled-statement => "case" constant-expression ":" statement
641    (lambda ($4 $3 $2 $1 . $rest) `(case ,$2 ,$4))
642    ;; labeled-statement => "default" ":" statement
643    (lambda ($3 $2 $1 . $rest) `(default ,$3))
644    ;; compound-statement => "{" block-item-list "}"
645    (lambda ($3 $2 $1 . $rest)
646      `(compd-stmt ,(tl->list $2)))
647    ;; compound-statement => "{" "}"
648    (lambda ($2 $1 . $rest)
649      `(compd-stmt (block-item-list)))
650    ;; block-item-list => block-item
651    (lambda ($1 . $rest)
652      (make-tl 'block-item-list $1))
653    ;; block-item-list => block-item-list block-item
654    (lambda ($2 $1 . $rest) (tl-append $1 $2))
655    ;; block-item => declaration
656    (lambda ($1 . $rest) $1)
657    ;; block-item => statement
658    (lambda ($1 . $rest) $1)
659    ;; expression-statement => expression ";"
660    (lambda ($2 $1 . $rest) `(expr-stmt ,$1))
661    ;; expression-statement => ";"
662    (lambda ($1 . $rest) '(expr-stmt))
663    ;; selection-statement => "if" "(" expression ")" statement
664    (lambda ($5 $4 $3 $2 $1 . $rest) `(if ,$3 ,$5))
665    ;; selection-statement => "if" "(" expression ")" statement "else" state...
666    (lambda ($7 $6 $5 $4 $3 $2 $1 . $rest)
667      `(if ,$3 ,$5 ,$7))
668    ;; selection-statement => "switch" "(" expression ")" statement
669    (lambda ($5 $4 $3 $2 $1 . $rest)
670      `(switch ,$3 ,$5))
671    ;; iteration-statement => "while" "(" expression ")" statement
672    (lambda ($5 $4 $3 $2 $1 . $rest)
673      `(while ,$3 ,$5))
674    ;; iteration-statement => "do" statement "while" "(" expression ")" ";"
675    (lambda ($7 $6 $5 $4 $3 $2 $1 . $rest)
676      `(do-while ,$2 ,$5))
677    ;; iteration-statement => "for" "(" initial-clause opt-expression ";" op...
678    (lambda ($8 $7 $6 $5 $4 $3 $2 $1 . $rest)
679      `(for ,$3 ,$4 ,$6 ,$8))
680    ;; initial-clause => expression ";"
681    (lambda ($2 $1 . $rest) $1)
682    ;; initial-clause => ";"
683    (lambda ($1 . $rest) '(expr))
684    ;; initial-clause => declaration
685    (lambda ($1 . $rest) $1)
686    ;; opt-expression => 
687    (lambda $rest '(expr))
688    ;; opt-expression => expression
689    (lambda ($1 . $rest) $1)
690    ;; jump-statement => "goto" identifier ";"
691    (lambda ($3 $2 $1 . $rest) `(goto ,$2))
692    ;; jump-statement => "continue" ";"
693    (lambda ($2 $1 . $rest) '(continue))
694    ;; jump-statement => "break" ";"
695    (lambda ($2 $1 . $rest) '(break))
696    ;; jump-statement => "return" expression ";"
697    (lambda ($3 $2 $1 . $rest) `(return ,$2))
698    ;; jump-statement => "return" ";"
699    (lambda ($2 $1 . $rest) `(return (expr)))
700    ;; translation-unit => external-declaration-list
701    (lambda ($1 . $rest) (tl->list $1))
702    ;; external-declaration-list => 
703    (lambda $rest (make-tl 'trans-unit))
704    ;; external-declaration-list => external-declaration-list external-decla...
705    (lambda ($2 $1 . $rest)
706      (if (eqv? (sx-tag $2) 'extern-block)
707        (tl-extend $1 (sx-tail $2 2))
708        (tl-append $1 $2)))
709    ;; external-declaration => function-definition
710    (lambda ($1 . $rest) $1)
711    ;; external-declaration => declaration
712    (lambda ($1 . $rest) $1)
713    ;; external-declaration => lone-comment
714    (lambda ($1 . $rest) $1)
715    ;; external-declaration => cpp-statement
716    (lambda ($1 . $rest) $1)
717    ;; external-declaration => pragma
718    (lambda ($1 . $rest) $1)
719    ;; external-declaration => "extern" '$string "{" external-declaration-li...
720    (lambda ($5 $4 $3 $2 $1 . $rest)
721      `(extern-block
722         ,$2
723         (extern-begin ,$2)
724         ,@(sx-tail (tl->list $4) 1)
725         (extern-end)))
726    ;; external-declaration => ";"
727    (lambda ($1 . $rest)
728      `(decl (@ (not-C99 . "GNU C"))))
729    ;; function-definition => declaration-specifiers declarator declaration-...
730    (lambda ($4 $3 $2 $1 . $rest)
731      `(knr-fctn-defn
732         ,(tl->list $1)
733         ,$2
734         ,(tl->list $3)
735         ,$4))
736    ;; function-definition => declaration-specifiers declarator compound-sta...
737    (lambda ($3 $2 $1 . $rest)
738      `(fctn-defn ,(tl->list $1) ,$2 ,$3))
739    ;; declaration-list => declaration
740    (lambda ($1 . $rest) (make-tl $1))
741    ;; declaration-list => declaration-list declaration
742    (lambda ($2 $1 . $rest) (tl-append $1 $2))
743    ;; opt-code-comment => 
744    (lambda $rest (list))
745    ;; opt-code-comment => code-comment
746    (lambda ($1 . $rest) $1)
747    ;; identifier => '$ident
748    (lambda ($1 . $rest) `(ident ,$1))
749    ;; identifier => 'cpp-ident
750    (lambda ($1 . $rest) `(ident ,$1))
751    ;; constant => '$fixed
752    (lambda ($1 . $rest) `(fixed ,$1))
753    ;; constant => '$float
754    (lambda ($1 . $rest) `(float ,$1))
755    ;; constant => '$chlit
756    (lambda ($1 . $rest) `(char ,$1))
757    ;; string-literal => '$string
758    (lambda ($1 . $rest) (make-tl 'string $1))
759    ;; string-literal => string-literal '$string
760    (lambda ($2 $1 . $rest) (tl-append $1 $2))
761    ;; code-comment => '$code-comm
762    (lambda ($1 . $rest) `(comment ,$1))
763    ;; lone-comment => '$lone-comm
764    (lambda ($1 . $rest) `(comment ,$1))
765    ;; cpp-statement => 'cpp-stmt
766    (lambda ($1 . $rest) $1)
767    ;; pragma => 'cpp-pragma
768    (lambda ($1 . $rest) $1)
769    ))
770
771 ;;; end tables