diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2022-07-21 16:04:56 +0200 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2022-07-21 17:28:19 +0200 |
commit | 0e3df321ab2fce795bdc6b9aeb92724733cf8ee0 (patch) | |
tree | 8370e465f2b16f46f623f3e77eef4b1be2219f92 /module/c/parse2.scm | |
parent | Merge call-with-tmpfile and diffs for testrunner. (diff) | |
download | calp-0e3df321ab2fce795bdc6b9aeb92724733cf8ee0.tar.gz calp-0e3df321ab2fce795bdc6b9aeb92724733cf8ee0.tar.xz |
Major work on parser.
Diffstat (limited to 'module/c/parse2.scm')
-rw-r--r-- | module/c/parse2.scm | 614 |
1 files changed, 338 insertions, 276 deletions
diff --git a/module/c/parse2.scm b/module/c/parse2.scm index fad2ffd8..34c1730f 100644 --- a/module/c/parse2.scm +++ b/module/c/parse2.scm @@ -1,12 +1,16 @@ (define-module (c parse2) :use-module (hnh util) - :use-module (system base lalr)) + :use-module (system base lalr) + :export (make-parser + build-lexical-analyzer + error-procedure)) + (define (make-parser) (lalr-parser (#{out-table:}# "/tmp/c-parser.txt") (#{output:}# c-parser "/tmp/c-parser.scm") - ;; (#{driver:}# glr) + (#{driver:}# glr) ( @@ -47,23 +51,27 @@ ;; punctuator - already translated ) - ;; Primitives + (top-level + (translation-unit) : $1 + (statement) : $1 + (constant-expression) : $1) - ;; (identifier) : $1 - ;; (constant) : $1 - ;; (string-literal) : $1 + ;; compounds + ;; 6.9 + (translation-unit + (external-declaration) : (list 'translation-unit $1) + (translation-unit external-declaration) : (append $1 (list $2))) - ;; compounds (primary-expression - ;; 6.5.1 - (identifier) - (constant) - (string-literal) - (lparen expression rparen) - (generic-selection)) + (identifier) : $1 + (constant) : `(constant ,$1) + (string-literal) : `(string-constant ,$1) + ;; output parenthesis skipped, since all forms come with their own + (lparen expression rparen) : $2 + (generic-selection) : $1) (enumeration-constant (identifier)) @@ -71,470 +79,524 @@ ;; 6.5.1.1 (generic-selection - (_Generic lparen assignment-expression comma generic-assoc-list)) + (_Generic lparen assignment-expression comma generic-assoc-list rparen) : `(generic ,$3 ,@$5)) (generic-assoc-list - (generic-association) - (generic-assoc-list comma generic-association)) + (generic-assoc-list comma generic-association) : (append $1 (list $3)) + (generic-association) : (list $1)) (generic-association - (type-name : assignment-expression) - (default : assignment-expression)) + (type-name : assignment-expression) : (cons $1 $3) + (default : assignment-expression) : (cons $1 $3)) ;; 6.5.2 (postfix-expression - (primary-expression) - (postfix-expression lbrack expression rbrack) - (postfix-expression lparen rparen) - (postfix-expression lparen argument-expression-list rparen) - (postfix-expression dot identifier) - (postfix-expression -> identifier) - (postfix-expression ++) - (postfix-expression --) + (postfix-expression lbrack expression rbrack) : `(idx ,$1 ,$3) + (postfix-expression lparen rparen) : `(,$1) + (postfix-expression lparen argument-expression-list rparen) : `(,$1 ,@$3) + (postfix-expression dot identifier) : `(dot-access ,$1 ,$3) + (postfix-expression -> identifier) : `(ptr-access ,$1 ,$3) + (postfix-expression ++) : `(postfix++ ,$1) + (postfix-expression --) : `(postfix-- ,$1) (lparen type-name rparen lbrace initializer-list rbrace) - (lparen type-name rparen lbrace initializer-list comma rbrace)) + (lparen type-name rparen lbrace initializer-list comma rbrace) + (primary-expression) : $1 + ) (argument-expression-list - (assignment-expression) - (argument-expression-list comma assignment-expression)) + (argument-expression-list comma assignment-expression) : (append $1 (list $3)) + (assignment-expression) : (list $1)) ;; 6.5.3 (unary-expression - (postfix-expression) - (++ unary-expression) - (-- unary-expression) - (unary-operator cast-expression) - (sizeof unary-expression) - (sizeof lparen type-name rparen) - (_Alignof lparen type-name rparen)) + (++ unary-expression) : `(prefix++ ,$2) + (-- unary-expression) : `(prefix-- ,$2) + (unary-operator cast-expression) : `(,$1 ,$2) + (sizeof unary-expression) : `(sizeof (typeof ,$2)) + (sizeof lparen type-name rparen) : `(sizeof ,$3) + (_Alignof lparen type-name rparen) : `(alignof ,$3) + (postfix-expression) : $1) (unary-operator - (&) - (*) - (+) - (-) - (~) - (!)) + (&) : 'pointer-to + (*) : 'dereference + (+) : 'unary+ ; separate from + and - for + (-) : 'unary- ; easier eval procedure later + (~) : 'bitwise-not + (!) : 'not) ;; 6.5.4 (cast-expression - (unary-expression) - (lparen type-name rparen cast-expression)) + (lparen type-name rparen cast-expression) : `(as-type ,$2 ,$4) + (unary-expression) : $1) ;; 6.5.5 (multiplicative-expression - (cast-expression) - (multiplicative-expression * cast-expression) - (multiplicative-expression / cast-expression) - (multiplicative-expression % cast-expression)) + (multiplicative-expression * cast-expression) : `(* ,$1 ,$3) + (multiplicative-expression / cast-expression) : `(/ ,$1 ,$3) + (multiplicative-expression % cast-expression) : `(% ,$1 ,$3) + (cast-expression) : $1) ;; 6.5.6 (additive-expression - (multiplicative-expression) - (additive-expression + multiplicative-expression) - (additive-expression - multiplicative-expression)) + (additive-expression + multiplicative-expression) : `(+ ,$1 ,$3) + (additive-expression - multiplicative-expression) : `(- ,$1 ,$3) + (multiplicative-expression) : $1) ;; 6.5.7 (shift-expression - (additive-expression) - (shift-expression << additive-expression) - (shift-expression >> additive-expression)) + (shift-expression << additive-expression) : `(<< ,$1 ,$3) + (shift-expression >> additive-expression) : `(>> ,$1 ,$3) + (additive-expression) : $1) ;; 6.5.8 (relational-expression - (shift-expression) - (relational-expression < shift-expression) - (relational-expression > shift-expression) - (relational-expression <= shift-expression) - (relational-expression >= shift-expression)) + (relational-expression < shift-expression) : `(< ,$1 ,$3) +(relational-expression > shift-expression) : `(> ,$1 ,$3) + (relational-expression <= shift-expression) : `(<= ,$1 ,$3) + (relational-expression >= shift-expression) : `(>= ,$1 ,$3) + (shift-expression) : $1) ;; 6.5.9 (equality-expression - (relational-expression) - (equality-expression == relational-expression) - (equality-expression != relational-expression)) + (equality-expression == relational-expression) : `(== ,$1 ,$3) + (equality-expression != relational-expression) : `(!= ,$1 ,$3) + (relational-expression) : $1) ;; 6.5.10 (AND-expression - (equality-expression) - (AND-expression & equality-expression)) + (AND-expression & equality-expression) : `(bitwise-and ,$1 ,$3) + (equality-expression) : $1) ;; 6.5.11 (exclusive-OR-expression - (AND-expression) - (exclusive-OR-expression ^ AND-expression)) + (exclusive-OR-expression ^ AND-expression) : `(bitwise-xor ,$1 ,$3) + (AND-expression) : $1) ;; 6.5.12 (inclusive-OR-expression - (exclusive-OR-expression) - (inclusive-OR-expression pipe exclusive-OR-expression)) + (inclusive-OR-expression pipe exclusive-OR-expression) : `(bitwise-ior ,$1 ,$3) + (exclusive-OR-expression) : $1) ;; 6.5.13 (logical-AND-expression - (inclusive-OR-expression) - (logical-AND-expression && inclusive-OR-expression)) + (logical-AND-expression && inclusive-OR-expression) : `(and ,$1 ,$3) + (inclusive-OR-expression) : $1) ;; 6.5.14 (logical-OR-expression - (logical-AND-expression) - (logical-OR-expression pipe2 logical-AND-expression)) + (logical-OR-expression pipe2 logical-AND-expression) : `(or ,$1 ,$3) + (logical-AND-expression) : $1) ;; 6.5.15 (conditional-expression - (logical-OR-expression) - (logical-OR-expression ? expression : conditional-expression)) + (logical-OR-expression ? expression : conditional-expression) : `(ternary ,$1 ,$3 ,$5) + (logical-OR-expression) : $1) ;; 6.5.16 (assignment-expression - (conditional-expression) - (unary-expression assignment-operator assignment-expression)) + (unary-expression assignment-operator assignment-expression) : `(,$2 ,$1 ,$3) + (conditional-expression) : $1) (assignment-operator - (=) - (*=) - (/=) - (%=) - (+=) - (-=) - (<<=) - (>>=) - (&=) - (^=) - (pipe=)) + (=) : $1 + (*=) : $1 + (/=) : $1 + (%=) : $1 + (+=) : $1 + (-=) : $1 + (<<=) : $1 + (>>=) : $1 + (&=) : $1 + (^=) : $1 + (pipe=) : $1) ;; 6.5.17 (expression - (assignment-expression) - (expression comma assignment-expression)) + (assignment-expression) : `(begin ,$1) + ;; (This is the comma operator) + (expression comma assignment-expression) : (append $1 (list $3))) ;; 6.6 constant expression (constant-expression - (expression)) + (expression) : `(constexpr ,$1)) ;; 6.7 (declaration - (declaration-specifiers semicolon) - (declaration-specifiers init-declarator-list semicolon) + (declaration-specifiers init-declarator-list semicolon) : ($2 $1) + ;; TODO when is declare-specifiers without init-declarator-list case relevant? + ;; It when enabled, it thinks just about everything is this: + ;; (compile-string* "int x;") + ;; ⇒ (translation-unit (define (named x ((type int))) <undefined-value>)) + ;; ⇒ (translation-unit (declare1 ((type int) (type (typedef x))))) + ;; NOTE this case is for structs + ;; "struct s;" + (declaration-specifiers semicolon) : `(struct-like-declaration ,$1) + (static_assert-declaration)) (declaration-specifiers - (storage-class-specifier) - (storage-class-specifier declaration-specifiers) + (storage-class-specifier declaration-specifiers) : (cons $1 $2) + (storage-class-specifier) : (list $1) + + (type-specifier declaration-specifiers) : (cons $1 $2) + (type-specifier) : (list $1) + + (type-qualifier declaration-specifiers) : (cons $1 $2) + (type-qualifier) : (list $1) - (type-specifier) - (type-specifier declaration-specifiers) + (function-specifier declaration-specifiers) : (cons $1 $2) + (function-specifier) : (list $1) - (type-qualifier) - (type-qualifier declaration-specifiers) + (alignment-specifier declaration-specifiers) : (cons $1 $2) + (alignment-specifier) : (list $1)) - (function-specifier) - (function-specifier declaration-specifiers) - (alignment-specifier) - (alignment-specifier declaration-specifiers)) (init-declarator-list - (init-declarator) - (init-declarator-list comma init-declarator)) + (init-declarator-list comma init-declarator) : (lambda (type) (append ($1 type) (list ($3 type)))) + (init-declarator) : (lambda (type) `(begin ,($1 type)))) (init-declarator - (declarator) - (declarator = initializer)) + (declarator = initializer) : (lambda (type) `(define ,($1 type) ,$3)) + (declarator) : (lambda (type) `(define ,($1 type) <undefined-value>))) ;; 6.7.1 (storage-class-specifier - (typedef) - (extern) - (static) - (_Thread_local) - (auto) - (register)) + (typedef) : '(storage typedef) + (extern) : '(storage extern) + (static) : '(storage static) + (_Thread_local) : '(storage thread-local) + (auto) : '(storage auto) + (register) : '(storage register)) - ;; 6.7.2 - (type-specifier - (void) - (char) - (short) - (int) - (long) - (float) - (double) - (signed) - (unsigned) - (_Bool) - (_Complex) - (atomic-type-specifier) - (struct-or-union-specifier) - (enum-specifier) - (typedef-name)) ;; 6.7.2.1 (struct-or-union-specifier - (struct-or-union lbrace struct-declaration-list rbrace) - (struct-or-union identifier lbrace struct-declaration-list rbrace) - (struct-or-union identifier)) + (struct-or-union lbrace struct-declaration-list rbrace) : `(,$1 ,$3) + (struct-or-union identifier lbrace struct-declaration-list rbrace) : `(,$1 (named ,$2) ,$4) + (struct-or-union identifier) : `(,$1 (named ,$2))) (struct-or-union - (struct) - (union)) + (struct) : 'struct + (union) : 'union) (struct-declaration-list - (struct-declaration) - (struct-declaration-list struct-declaration)) + (struct-declaration-list struct-declaration) : (append $1 (list $2)) + (struct-declaration) : (list 'struct-declaration-list $1) + ) (struct-declaration - (specifier-qualifier-list semicolon) - (specifier-qualifier-list struct-declarator-list semicolon) + (specifier-qualifier-list semicolon) : $1 + (specifier-qualifier-list struct-declarator-list semicolon) : ($2 $1) (static_assert-declaration)) (specifier-qualifier-list - (type-specifier) - (type-specifier specifier-qualifier-list) + (type-specifier specifier-qualifier-list) : `(specifier-qualifier-list ,$1 ,@(cdr $2)) + (type-specifier) : `(specifier-qualifier-list ,$1) - (type-qualifier) - (type-qualifier specifier-qualifier-list)) + (type-qualifier specifier-qualifier-list) : `(specifier-qualifier-list ,$1 ,@(cdr $2)) + (type-qualifier) : `(specifier-qualifier-list ,$1)) (struct-declarator-list - (struct-declarator) - (struct-declarator-list comma struct-declarator)) + (struct-declarator-list comma struct-declarator) : (lambda (type) (append ($1 type) (list ($3 type)))) + (struct-declarator) : (lambda (type) (list 'struct-declarator-list ($1 type))) + ) (struct-declarator - (declarator) - (: constant-expression) - (declarator : constant-expression)) + (: constant-expression) : (lambda (type) `(of-width *nothing* ,$2)) + (declarator : constant-expression) : (lambda (type) `(of-width ,($1 type) ,$3)) + (declarator) : $1) ;; 6.7.2.2 (enum-specifier - (enum identifier lbrace enumerator-list rbrace) - (enum lbrace enumerator-list rbrace) + (enum identifier lbrace enumerator-list rbrace) : `(enum (named ,$2) ,$4) + (enum lbrace enumerator-list rbrace) : `(enum ,$3) - (enum identifier lbrace enumerator-list comma rbrace) - (enum lbrace enumerator-list comma rbrace) + (enum identifier lbrace enumerator-list comma rbrace) : `(enum (named ,$2) ,$4) + (enum lbrace enumerator-list comma rbrace) : `(enum ,$3) - (enum identifier)) + (enum identifier) : `(enum (named ,$2))) (enumerator-list - (enumerator) - (enumerator-list comma enumerator)) + (enumerator-list comma enumerator) : (append $1 (list $3)) + (enumerator) : (list $1) + ) (enumerator - (enumeration-constant) - (enumeration-constant = constant-expression)) + (enumeration-constant = constant-expression) : (list $1 $3) + (enumeration-constant) : $1 + ) ;; 6.7.2.4 (atomic-type-specifier - (_Atomic lparen type-name rparen)) + (_Atomic lparen type-name rparen) : `(atomic ,$3)) ;; 6.7.3 (type-qualifier - (const) - (restrict) - (volatile) - (_Atomic)) + (const) : `(qualifier const) + (restrict) : `(qualifier restrict) + (volatile) : `(qualifier volatile) + (_Atomic) : `(qualifier atomic) + ) ;; 6.7.4 (function-specifier - (inline) - (_Noreturn)) + (inline) : 'inline + (_Noreturn) : 'noterun) ;; 6.7.5 (alignment-specifier - (_Alignas lparen type-name rparen) - (_Alignas lparen constant-expression rparen)) + (_Alignas lparen type-name rparen) : `(aligned-as ,$3) + (_Alignas lparen constant-expression rparen) : `(aligned-as ,$3)) ;; 6.7.6 (declarator - (pointer direct-declarator) - (direct-declarator)) + (pointer direct-declarator) : (lambda (type) ($2 ($1 type))) + (direct-declarator) : (lambda (type) ($1 type))) (direct-declarator - (identifier) - ( lparen declarator rparen ) - - (direct-declarator lbrack type-qualifier-list assignment-expression rbrack ) - (direct-declarator lbrack assignment-expression rbrack ) - (direct-declarator lbrack type-qualifier-list rbrack ) - (direct-declarator lbrack rbrack ) - (direct-declarator lbrack static type-qualifier-list assignment-expression rbrack) - (direct-declarator lbrack static assignment-expression rbrack) - - (direct-declarator lbrack type-qualifier-list static assignment-expression rbrack) - - (direct-declarator lbrack type-qualifier-list * rbrack) - (direct-declarator lbrack * rbrack) - - (direct-declarator lparen parameter-type-list rparen ) - (direct-declarator lparen identifier-list rparen ) - (direct-declarator lparen rparen )) + (direct-declarator lbrack type-qualifier-list assignment-expression rbrack ) : (lambda (type) ($1 `(array (of-length (,$3 ,$4)) + (containing ,type)))) + (direct-declarator lbrack assignment-expression rbrack ) : (lambda (type) ($1 `(array (of-length ,$3) + (containing ,type)))) + (direct-declarator lbrack type-qualifier-list rbrack ) : (lambda (type) ($1 `(array (of-length (,$3)) + (containing ,type)))) + (direct-declarator lbrack rbrack ) : (lambda (type) ($1 `(array (of-indeterminate-length) + (containing ,type)))) + + (direct-declarator lbrack static type-qualifier-list assignment-expression rbrack) : (lambda (type) `(array (static) + (containing ,type) + (of-length (,$3 ,$4)))) + (direct-declarator lbrack static assignment-expression rbrack) : (lambda (type) `(array (static) + (containing ,type) + (of-length ,$4))) + + ;; TODO static position + (direct-declarator lbrack type-qualifier-list static assignment-expression rbrack) : (lambda (type) `(array (static) + (containing ,type) + (of-length (,$3 ,$4)))) + + (direct-declarator lbrack type-qualifier-list * rbrack) : (lambda (type) ($1 '(array (containing ,type) (of-variable-length ,$3)))) + (direct-declarator lbrack * rbrack) : (lambda (type) ($1 '(array (containing ,type) (of-variable-length)))) + + (direct-declarator lparen parameter-type-list rparen ) : (lambda (returning) ($1 `(procedure (returning ,returning) (taking ,@(cdr $3))))) + (direct-declarator lparen identifier-list rparen ) : (lambda (returning) ($1 `(procedure (returning ,returning) (taking ,@(cdr $3))))) + (direct-declarator lparen rparen ) : (lambda (returning) ($1 `(procedure (returning ,returning) (taking *any*)))) + + ( lparen declarator rparen ) : (lambda (type) (list ($2 type))) + (identifier) : (lambda (type) `(named ,$1 ,type)) + ) (pointer - (* type-qualifier-list) - (*) - (* type-qualifier-list pointer) - (* pointer)) + (* type-qualifier-list) : (lambda (to) `(,$2 (pointer-to ,to))) + (* type-qualifier-list pointer) : (lambda (to) `(,$2 (pointer-to ,($3 to)))) + (* pointer) : (lambda (to) `(pointer-to ,($2 to))) + (*) : (lambda (to) `(pointer-to ,to))) (type-qualifier-list - (type-qualifier) - (type-qualifier-list type-qualifier)) + (type-qualifier-list type-qualifier) : (append $1 (list $2)) + (type-qualifier) : (list 'type-qualifier-list $1) + ) (parameter-type-list - (parameter-list) - (parameter-list comma ...)) + (parameter-list comma ...) : `(parameter-list ,$1 ...) + (parameter-list) : `(parameter-list ,$1) + ) (parameter-list - (parameter-declaration) - (parameter-list comma parameter-declaration)) + (parameter-list comma parameter-declaration) : (append $1 (list $3)) + (parameter-declaration) : (list $1) + ) (parameter-declaration - (declaration-specifiers declarator) - (declaration-specifiers abstract-declarator) - (declaration-specifiers)) + (declaration-specifiers declarator) : ($2 $1) + (declaration-specifiers abstract-declarator) : ($2 $1) + (declaration-specifiers) : $1) (identifier-list - (identifier) - (identifier-list comma identifier)) + (identifier-list comma identifier) : (append $1 (list $3)) + (identifier) : (list 'identifier-list $1)) ;; 6.7.7 (type-name - (specifier-qualifier-list) - (specifier-qualifier-list abstract-declarator)) + (specifier-qualifier-list abstract-declarator) : ($2 $1) + (specifier-qualifier-list) : $1 + ) (abstract-declarator - (pointer) - (pointer direct-abstract-declarator) - ( direct-abstract-declarator)) + (pointer direct-abstract-declarator) : (compose $1 $2) + (pointer) : $1 + ( direct-abstract-declarator) : $1 + ) (direct-abstract-declarator - ( lparen abstract-declarator rparen ) - (direct-abstract-declarator lbrack type-qualifier-list assignment-expression rbrack ) - (direct-abstract-declarator lbrack type-qualifier-list rbrack ) - (direct-abstract-declarator lbrack assignment-expression rbrack ) - ( lbrack rbrack ) - ( lbrack type-qualifier-list assignment-expression rbrack ) - ( lbrack type-qualifier-list rbrack ) - (direct-abstract-declarator lbrack * rbrack) - ( lbrack * rbrack) - (direct-abstract-declarator lparen parameter-type-list rparen ) - (direct-abstract-declarator lparen rparen ) - ( lparen parameter-type-list rparen ) - ( lparen rparen )) + ( lparen abstract-declarator rparen ) : (lambda (type) (list ($2 type))) + (direct-abstract-declarator lbrack type-qualifier-list assignment-expression rbrack ) : (lambda (type) ($1 `(array (of-length (,$3 ,$4)) + (containing ,type)))) + (direct-abstract-declarator lbrack type-qualifier-list rbrack ) : (lambda (type) ($1 `(array (of-length (,$3)) + (containing ,type)))) + (direct-abstract-declarator lbrack assignment-expression rbrack ) : (lambda (type) ($1 `(array (of-length ,$3) + (containing ,type)))) + ( lbrack rbrack ) : (lambda (type) `(array (of-indeterminate-length) + (containing ,type))) + ( lbrack type-qualifier-list assignment-expression rbrack ) : (lambda (type) `(array (containing ,type) + (of-length (,$3 ,$4)))) + ( lbrack type-qualifier-list rbrack ) : (lambda (type) `(array (containing ,type) + (of-length (,$3)))) + + (direct-abstract-declarator lbrack static type-qualifier-list assignment-expression rbrack ) : (lambda (type) ($1 `(array (static) + (of-length (,$4 ,$5)) + (containing ,type)))) + (direct-abstract-declarator lbrack static assignment-expression rbrack ) : (lambda (type) ($1 `(array (static) (of-length ,$4) (containing ,type)))) + ( lbrack static type-qualifier-list assignment-expression rbrack ) : (lambda (type) `(array (static) (of-length ,($4 $5)) (containing ,type))) + ( lbrack static assignment-expression rbrack ) : (lambda (type) `(array (static) (of-length ,$3) (containing ,type))) + + ;; TODO static position + (direct-abstract-declarator lbrack type-qualifier-list static assignment-expression rbrack ) : (lambda (type) `(array (static) (of-length (,$3 ,$4)) (containing ,type))) + ( lbrack type-qualifier-list static assignment-expression rbrack ) : (lambda (type) `(array (static) (of-length (,$2 ,$3)) (containing ,type))) + + (direct-abstract-declarator lbrack * rbrack) : (lambda (type) ($1 `(array (of-variable-length) (containing ,type)))) + ( lbrack * rbrack) : (lambda (type) `(array (of-variable-length) (containing ,type))) + (direct-abstract-declarator lparen parameter-type-list rparen ) : (lambda (returning) ($1 `(procedure (returning ,returning) (taking ,$3)))) + (direct-abstract-declarator lparen rparen ) : (lambda (returning) ($1 `(procedure (returning ,returning) (taking *any*)))) + ( lparen parameter-type-list rparen ) : (lambda (returning) `(procedure (returning ,returning) (taking ,$2))) + ( lparen rparen ) : (lambda (returning) `(procedure (returning ,returning) (taking *any*)))) ;; 6.7.8 (typedef-name - (identifier)) + (identifier) : `(typedef ,$1)) ;; 6.7.9 (initializer - (assignment-expression) - (lbrace initializer-list rbrace) - (lbrace initializer-list comma rbrace)) + (lbrace initializer-list rbrace) : $2 + (lbrace initializer-list comma rbrace) : $2 + (assignment-expression) : $1) (initializer-list - (designation initializer) - (initializer) - (initializer-list comma designation initializer) - (initializer-list comma initializer)) + (initializer-list comma designation initializer) : (append $1 (list `(designate ,$3 ,$4))) + (initializer-list comma initializer) : (append $1 (list $3)) + (designation initializer) : `(initializer-list (designate ,$1 ,$2)) + (initializer) : `(initializer-list ,$1)) (designation - (designator-list =)) + (designator-list =) : $1) (designator-list - (designator) - (designator-list designator)) + (designator-list designator) : (append $1 (list $2)) + (designator) : (list 'designators $1)) (designator - (lbrack constant-expression rbrack) - (dot identifier)) + (lbrack constant-expression rbrack) : `(idx ,$2) + (dot identifier) : `(slot ,$2)) ;; 6.7.10 (static_assert-declaration - (_Static_assert lparen constant-expression comma string-literal rparen semicolon)) + (_Static_assert lparen constant-expression comma string-literal rparen semicolon) + : `(static-assert ,$3 ,$5)) ;; 6.8 (statement - (labeled-statement) - (compound-statement) - (expression-statement) - (selection-statement) - (iteration-statement) - (jump-statement)) + (labeled-statement) : $1 + (compound-statement) : $1 + (expression-statement) : $1 + (selection-statement) : $1 + (iteration-statement) : $1 + (jump-statement) : $1) ;; 6.8.1 (labeled-statement - (identifier : statement) - (case constant-expression : statement) - (default : statement)) + (identifier : statement) : `(labeled ,$1 ,$3) + (case constant-expression : statement) : `(case ,$2 ,$4) + (default : statement) : `(case-default ,$3)) ;; 6.8.2 (compound-statement - (lbrace block-item-list rbrace) - (lbrace rbrace)) + (lbrace block-item-list rbrace) : `(begin ,$2) + (lbrace rbrace) : '(begin)) (block-item-list - (block-item) - (block-item-list block-item)) + (block-item-list block-item) : (append $1 (list $2)) + (block-item) : `(let () ,$1) + ) (block-item - (declaration) - (statement)) + (declaration) : $1 + (statement) : $1) ;; 6.8.3 (expression-statement - (expression semicolon) - (semicolon)) + (expression semicolon) : $1 + (semicolon) : '(noop)) (selection-statement - (if lparen expression rparen statement) - (if lparen expression rparen statement else statement) - (switch lparen expression rparen statement)) + (if lparen expression rparen statement else statement) : `(if ,$3 ,$5 ,$7) + (if lparen expression rparen statement) : `(when ,$3 ,$5) + (switch lparen expression rparen statement) : `(switch ,$3 ,$5)) ;; 6.8.5 (iteration-statement - (while lparen expression rparen statement) - (do statement while lparen expression rparen semicolon) - (for lparen expression semicolon expression semicolon expression rparen statement) - (for lparen expression semicolon expression semicolon rparen statement) - (for lparen expression semicolon semicolon expression rparen statement) - (for lparen semicolon semicolon rparen statement) - (for lparen semicolon expression semicolon expression rparen statement) - (for lparen semicolon expression semicolon rparen statement) - (for lparen declaration expression semicolon expression rparen statement) + (while lparen expression rparen statement) : `(while ,$3 ,$5) + (do statement while lparen expression rparen semicolon) : `(do-while ,$5 ,$2) + (for lparen expression semicolon expression semicolon expression rparen statement) : `(for (init ,$3) (cond ,$5) (step ,$7) ,$9) + (for lparen expression semicolon expression semicolon rparen statement) : `(for (init ,$3) (cond ,$5) (step ) ,$8) + (for lparen expression semicolon semicolon expression rparen statement) : `(for (init ,$3) (cond ) (step ,$6) ,$8) + (for lparen semicolon semicolon rparen statement) : `(for (init ) (cond ) (step ) ,$6) + (for lparen semicolon expression semicolon expression rparen statement) : `(for (init ) (cond ,$4) (step ,$6) ,$8) + (for lparen semicolon expression semicolon rparen statement) : `(for (init ) (cond ,$4) (step ) ,$7) + (for lparen declaration expression semicolon expression rparen statement) ; TODO (for lparen declaration expression semicolon rparen statement) (for lparen declaration semicolon expression rparen statement) (for lparen declaration semicolon rparen statement)) ;; 6.8.6 (jump-statement - (goto identifier semicolon) - (continue semicolon) - (break semicolon) - (return expression semicolon) - (return semicolon)) - + (goto identifier semicolon) : `(goto ,$2) + (continue semicolon) : `(continue) + (break semicolon) : `(break) + (return expression semicolon) : `(return ,$2) + (return semicolon) : `(return)) ;; 6.9 - (translation-unit - (external-declaration) - (translation-unit external-declaration)) - (external-declaration - (function-definition) - (declaration)) + (function-definition) : $1 + (declaration) : $1) ;; 6.9.1 (function-definition (declaration-specifiers declarator declaration-list compound-statement) - (declaration-specifiers declarator compound-statement)) + (declaration-specifiers declarator compound-statement) : `(define ,($2 $1) ,$3)) (declaration-list - (declaration) - (declaration-list declaration)))) + (declaration-list declaration) : (append $1 (list $2)) + (declaration) : `(declaration-list ,$1)) + + + ;; 6.7.2 + ;; Placed AFTER init-declarator to handle "int x = 5;" case. Otherwise it's + ;; only treated as a (really badly formed) typedef + (type-specifier + (void) : `(type ,$1) + (char) : `(type ,$1) + (short) : `(type ,$1) + (int) : `(type ,$1) + (long) : `(type ,$1) + (float) : `(type ,$1) + (double) : `(type ,$1) + (signed) : `(type ,$1) + (unsigned) : `(type ,$1) + (_Bool) : `(type bool) + (_Complex) : `(type complex) + (atomic-type-specifier) : `(type ,$1) + (struct-or-union-specifier) : `(type ,$1) + (enum-specifier) : `(type ,$1) + (typedef-name) : `(type ,$1)))) (define (build-lexical-analyzer tokens) |