Coverage report: /home/ellis/comp/core/lib/syn/gen/c/pkg.lisp

KindCoveredAll%
expression023 0.0
branch00nil
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;; c/pkg.lisp --- C Code Generator
2
 
3
 ;; Lisp -> C
4
 
5
 ;; Commentary:
6
 
7
 ;; There are quite a few C Code Generators in the Common Lisp ecosystem, and
8
 ;; of course ECL which is itself a source-to-source Lisp implementation which
9
 ;; targets C. This one is closer to c-mera.
10
 
11
 ;; ref: https://github.com/kiselgra/c-mera
12
 
13
 ;; ref: https://selgrad.org/publications/2014_els_SLWLS.pdf
14
 
15
 ;; ref: https://selgrad.org/publications/2017_els_LSS.pdf
16
 
17
 ;; ref: https://github.com/gcc-mirror/gcc/tree/master/gcc/c
18
 
19
 ;;; Code:
20
 (defpackage :syn/gen/c
21
   (:nicknames :gen/c)
22
   (:use :cl :syn/gen :std/pipe :std/meta :cli/tools/cc :cli/env :id :ast)
23
   ;; (:shadowing-import-from :cl :type :float)
24
   (:export
25
    #:*c-backend*
26
    #:split-aref
27
    #:split-pref
28
    #:split-targof
29
    #:split-oref
30
    #:split-addrof
31
    #:split-unary
32
    #:read-float
33
    #:fix-case
34
    #:dissect
35
    #:pre-process
36
    #:pre-process-heads
37
    #:*c-swap*
38
    #:*c-exports*
39
    #:*c-syntax*
40
    #:*c-symbols*
41
    #:c-reader
42
    #:c-processor
43
    #:read-gen-c-file
44
    #:read-gen-c-string
45
    #:assignment-expression
46
    #:infix-expression
47
    #:prefix-expression
48
    #:postfix-expression
49
    #:not-expression
50
    #:conditional-expression
51
    #:cast-expression
52
    #:jump-statement
53
    #:label-statement
54
    #:expression-statement
55
    #:compound-statement
56
    #:if-statement
57
    #:for-statement
58
    #:while-statement
59
    #:do-statement
60
    #:comment
61
    #:switch-case-statement
62
    #:switch-case-item
63
    #:attribute-expression
64
    #:typedef
65
    #:include
66
    #:preprocessor-macro
67
    #:c-syntax
68
    #:make-exprs
69
    #:make-block
70
    #:make-simple-block
71
    #:switch-reader
72
    #:cl-reader
73
    #:decompose-declaration
74
    #:else-if-traverser
75
    #:nested-ast-remover
76
    #:renamer
77
    #:decl-blocker
78
    #:if-blocker
79
    #:simple-print
80
    #:gen-reader
81
    #:gen-c
82
    #:c-reader-switch))
83
 
84
 (in-package :syn/gen/c)
85
 
86
 (defvar *c-backend*
87
   (append *cl-symbols*
88
           '(name preprocessor-macro include typedef
89
             chars comment do-statement while-statement init
90
             for-statement else-body if-body if-statement
91
             statements compound-statement expression semicolon
92
             expression-statement kind jump-statement cast-expression
93
             else then test conditional-expression not-expression
94
             postfix-expression prefix-expression infix-expression
95
             operator assignment-expression function-pointer float
96
             pointer pointer-reference component object
97
             object-reference indizes array array-reference items
98
             clist value type specifier declaration-item
99
             bindings braces declaration-list union-definition
100
             members struct-definition parameters parameter-list
101
             body parameter function-definition enum-definition
102
             declaration-value float-type linebreak
103
             c-type
104
             constant attribute-expression switch cases
105
             switch-case-statement switch-case-item switch-case-item)))
106
 
107
 (export *c-backend*)
108
 
109
 (defparameter *c-symbols*
110
   '(and or not > <
111
     = /= <= >=
112
     + - * /
113
     do-while
114
     return break continue
115
     if cond when
116
     fn
117
     array aref
118
     union
119
     function
120
     progn block
121
     null length
122
     min max abs
123
     sin cos tan
124
     1- 1+
125
     type float-type
126
     funcall
127
     attribute))
128
 
129
 (defparameter *c-syntax*
130
   '(set *= %= += -= >>= <<= &= ^= \|=
131
     == != \| \|\| % << >> ^ & && ~ ! ?
132
     addr-of targ-of dref switch
133
     prefix++ prefix--
134
     postfix-- postfix++ postfix*
135
     struct enum oref pref specifier
136
     include comment decl
137
     fpointer for while
138
     typedef cast sizeof
139
     goto label clist
140
     cpp pragma))
141
 
142
 (defparameter *c-exports*
143
   (append *c-symbols*
144
           *c-syntax*
145
           *cl-symbols*))
146
 
147
 (defparameter *c-swap*
148
   (append *c-symbols* *c-syntax*))
149
 
150
 (pkg:defpackage* :syn/gen/c/swap
151
     (:shadow-symbols *c-swap*))
152
 
153
 (pkg:defpackage* :syn/gen/c/sym
154
     (:shadow-symbols *c-swap* :export-symbols *c-exports*)
155
   (:nicknames :c)
156
   (:use :cl)
157
   (:import-from :syn/gen :quoty :print-code :write-code :cintern :gen-package)
158
   (:import-from :syn/gen/c :c-reader :read-gen-c-string :read-gen-c-file :simple-print
159
    :cl-reader :switch-reader :decompose-declaration))