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