crokus 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/crokus +5 -0
- data/lib/crokus.rb +4 -0
- data/lib/crokus/ast.rb +431 -0
- data/lib/crokus/ast_printer.rb +86 -0
- data/lib/crokus/cfg.rb +81 -0
- data/lib/crokus/cfg_builder.rb +169 -0
- data/lib/crokus/cfg_cleaner.rb +62 -0
- data/lib/crokus/cfg_printer.rb +73 -0
- data/lib/crokus/cleaner.rb +10 -0
- data/lib/crokus/code.rb +46 -0
- data/lib/crokus/compiler.rb +124 -0
- data/lib/crokus/generic_lexer.rb +62 -0
- data/lib/crokus/indent.rb +19 -0
- data/lib/crokus/ir_dumper.rb +48 -0
- data/lib/crokus/lexer.rb +113 -0
- data/lib/crokus/parser.rb +1072 -0
- data/lib/crokus/parser_only.rb +993 -0
- data/lib/crokus/pretty_printer.rb +443 -0
- data/lib/crokus/runner.rb +86 -0
- data/lib/crokus/tac_builder.rb +109 -0
- data/lib/crokus/token.rb +43 -0
- data/lib/crokus/transformer.rb +304 -0
- data/lib/crokus/version.rb +3 -0
- data/lib/crokus/visitor.rb +341 -0
- metadata +70 -0
@@ -0,0 +1,341 @@
|
|
1
|
+
module Crokus
|
2
|
+
|
3
|
+
class Visitor
|
4
|
+
|
5
|
+
include Indent
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@ind=-2
|
9
|
+
@verbose=true
|
10
|
+
@verbose=false
|
11
|
+
end
|
12
|
+
|
13
|
+
def visit ast
|
14
|
+
ast.accept(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def visitToken tok, args=nil
|
18
|
+
tok
|
19
|
+
end
|
20
|
+
|
21
|
+
def visitDesignUnit du,args=nil
|
22
|
+
indent "DesignUnit"
|
23
|
+
du.list.each{|e| e.accept(self)}
|
24
|
+
dedent
|
25
|
+
du
|
26
|
+
end
|
27
|
+
|
28
|
+
def visitDecl decl,args=nil
|
29
|
+
indent "Decl"
|
30
|
+
decl.type.accept(self)
|
31
|
+
decl.var.accept(self) if decl.var #case of struct decl only.
|
32
|
+
decl.init.accept(self) if decl.init
|
33
|
+
dedent
|
34
|
+
decl
|
35
|
+
end
|
36
|
+
|
37
|
+
def visitInclude include,args=nil
|
38
|
+
indent "Include"
|
39
|
+
include.name.accept(self)
|
40
|
+
dedent
|
41
|
+
include
|
42
|
+
end
|
43
|
+
|
44
|
+
def visitDefine define,args=nil
|
45
|
+
indent "Define"
|
46
|
+
define.name.accept(self)
|
47
|
+
define.expr.accept(self)
|
48
|
+
dedent
|
49
|
+
define
|
50
|
+
end
|
51
|
+
|
52
|
+
def visitTypedef typdef,args=nil
|
53
|
+
indent "Typdef"
|
54
|
+
typdef.type.accept(self)
|
55
|
+
typdef.name.accept(self)
|
56
|
+
dedent
|
57
|
+
typdef
|
58
|
+
end
|
59
|
+
|
60
|
+
def visitType type,args=nil
|
61
|
+
indent "Type"
|
62
|
+
type.specifiers.each{|spec| spec.accept(self)}
|
63
|
+
type.name.accept(self)
|
64
|
+
dedent
|
65
|
+
type
|
66
|
+
end
|
67
|
+
|
68
|
+
def visitPointerTo pto,args=nil
|
69
|
+
indent "PointerTo"
|
70
|
+
pto.type.accept(self)
|
71
|
+
dedent
|
72
|
+
pto
|
73
|
+
end
|
74
|
+
|
75
|
+
def visitArrayOf aof,args=nil
|
76
|
+
indent "ArrayOf"
|
77
|
+
aof.type.accept(self)
|
78
|
+
aof.size.accept(self) if aof.size
|
79
|
+
dedent
|
80
|
+
aof
|
81
|
+
end
|
82
|
+
|
83
|
+
def visitStruct struct,args=nil
|
84
|
+
indent "Struct"
|
85
|
+
dedent
|
86
|
+
struct
|
87
|
+
end
|
88
|
+
|
89
|
+
def visitCasting cast,args=nil
|
90
|
+
indent "Casting"
|
91
|
+
cast.type.accept(self)
|
92
|
+
dedent
|
93
|
+
cast
|
94
|
+
end
|
95
|
+
|
96
|
+
def visitCastedExpr cexpr,args=nil
|
97
|
+
indent "CastedExpr"
|
98
|
+
cexpr.type.accept(self)
|
99
|
+
cexpr.expr.accept(self)
|
100
|
+
dedent
|
101
|
+
cexpr
|
102
|
+
end
|
103
|
+
|
104
|
+
#......... end of types..........
|
105
|
+
|
106
|
+
def visitFunction func,args=nil
|
107
|
+
indent "Function"
|
108
|
+
func.type.accept(self)
|
109
|
+
func.name.accept(self)
|
110
|
+
func.args.each{|arg| arg.accept(self)}
|
111
|
+
func.body.accept(self)
|
112
|
+
dedent
|
113
|
+
func
|
114
|
+
end
|
115
|
+
|
116
|
+
def visitFunctionProto func,args=nil
|
117
|
+
indent "FunctionProto"
|
118
|
+
func.type.accept(self)
|
119
|
+
func.name.accept(self)
|
120
|
+
func.args.each{|arg| arg.accept(self)}
|
121
|
+
dedent
|
122
|
+
func
|
123
|
+
end
|
124
|
+
|
125
|
+
def visitFormalArg formalArg,args=nil
|
126
|
+
indent "FormalArg"
|
127
|
+
formalArg.name.accept(self) if formalArg.name # e.g : main(void)
|
128
|
+
formalArg.type.accept(self)
|
129
|
+
dedent
|
130
|
+
formalArg
|
131
|
+
end
|
132
|
+
|
133
|
+
#...........stmts...............
|
134
|
+
def visitCommaStmt comma,args=nil
|
135
|
+
lhs=comma.lhs.accept(self)
|
136
|
+
rhs=comma.rhs.accept(self)
|
137
|
+
comma
|
138
|
+
end
|
139
|
+
|
140
|
+
def visitAssign assign,args=nil
|
141
|
+
assign.lhs.accept(self)
|
142
|
+
assign.op.accept(self)
|
143
|
+
assign.rhs.accept(self)
|
144
|
+
assign
|
145
|
+
end
|
146
|
+
|
147
|
+
def visitPostFixAccu accu,args=nil
|
148
|
+
lhs=accu.lhs.accept(self,args) if accu.lhs #++i
|
149
|
+
op =accu.op.accept(self)
|
150
|
+
accu
|
151
|
+
end
|
152
|
+
|
153
|
+
def visitPreFixAccu accu,args=nil
|
154
|
+
lhs=accu.lhs.accept(self,args) if accu.lhs #++i
|
155
|
+
op =accu.op.accept(self)
|
156
|
+
accu
|
157
|
+
end
|
158
|
+
|
159
|
+
def visitFunCall fcall,args=nil
|
160
|
+
indent "FunCall"
|
161
|
+
fcall.name.accept(self)
|
162
|
+
fcall.args.each{|arg| arg.accept(self)}
|
163
|
+
dedent
|
164
|
+
fcall
|
165
|
+
end
|
166
|
+
|
167
|
+
def visitFor for_,args=nil
|
168
|
+
indent "For"
|
169
|
+
for_.init.each{|stmt| stmt.accept(self)}
|
170
|
+
for_.cond.accept(self)
|
171
|
+
for_.increment.accept(self)
|
172
|
+
for_.body.accept(self)
|
173
|
+
dedent
|
174
|
+
for_
|
175
|
+
end
|
176
|
+
|
177
|
+
def visitReturn ret,args=nil
|
178
|
+
indent "Return"
|
179
|
+
ret.expr.accept(self) if ret.expr
|
180
|
+
dedent
|
181
|
+
ret
|
182
|
+
end
|
183
|
+
|
184
|
+
def visitIf if_,args=nil
|
185
|
+
indent "If"
|
186
|
+
if_.cond.accept(self)
|
187
|
+
if_.body.accept(self)
|
188
|
+
dedent
|
189
|
+
if_
|
190
|
+
end
|
191
|
+
|
192
|
+
def visitSwitch sw_,args=nil
|
193
|
+
indent "Switch"
|
194
|
+
sw_.expr.accept(self)
|
195
|
+
sw_.cases.each{|case_| case_.accept(self)}
|
196
|
+
dedent
|
197
|
+
sw_
|
198
|
+
end
|
199
|
+
|
200
|
+
def visitCase case_,args=nil
|
201
|
+
indent "Case"
|
202
|
+
case_.expr.accept(self)
|
203
|
+
case_.body.accept(self)
|
204
|
+
dedent
|
205
|
+
case_
|
206
|
+
end
|
207
|
+
|
208
|
+
def visitWhile while_,args=nil
|
209
|
+
indent "While"
|
210
|
+
while_.cond.accept(self)
|
211
|
+
while_.body.each{|stmt| stmt.accept(self)}
|
212
|
+
dedent
|
213
|
+
while_
|
214
|
+
end
|
215
|
+
|
216
|
+
def visitDoWhile while_,args=nil
|
217
|
+
indent "DoWhile"
|
218
|
+
while_.cond.accept(self)
|
219
|
+
while_.body.each{|stmt| stmt.accept(self)}
|
220
|
+
dedent
|
221
|
+
while_
|
222
|
+
end
|
223
|
+
|
224
|
+
def visitBreak brk,args=nil
|
225
|
+
indent "Break"
|
226
|
+
dedent
|
227
|
+
brk
|
228
|
+
end
|
229
|
+
|
230
|
+
def visitContinue brk,args=nil
|
231
|
+
indent "Continue"
|
232
|
+
dedent
|
233
|
+
brk
|
234
|
+
end
|
235
|
+
|
236
|
+
def visitLabelledStmt label,args=nil
|
237
|
+
indent "LabelledStmt"
|
238
|
+
dedent
|
239
|
+
label
|
240
|
+
end
|
241
|
+
|
242
|
+
def visitGoto goto,args=nil
|
243
|
+
indent "Goto"
|
244
|
+
goto.label.accept(self)
|
245
|
+
dedent
|
246
|
+
goto
|
247
|
+
end
|
248
|
+
#..........expresions..........
|
249
|
+
def visitIdent ident,args=nil
|
250
|
+
ident
|
251
|
+
end
|
252
|
+
|
253
|
+
def visitIntLit lit,args=nil
|
254
|
+
lit
|
255
|
+
end
|
256
|
+
|
257
|
+
def visitStrLit lit,args=nil
|
258
|
+
lit
|
259
|
+
end
|
260
|
+
|
261
|
+
def visitCharLit lit,args=nil
|
262
|
+
lit
|
263
|
+
end
|
264
|
+
|
265
|
+
def visitFloatLit lit,args=nil
|
266
|
+
lit
|
267
|
+
end
|
268
|
+
|
269
|
+
def visitBinary expr,args=nil
|
270
|
+
indent "Binary"
|
271
|
+
expr.lhs.accept(self,args)
|
272
|
+
expr.op.accept(self)
|
273
|
+
expr.rhs.accept(self,args)
|
274
|
+
dedent
|
275
|
+
expr
|
276
|
+
end
|
277
|
+
|
278
|
+
def visitUnary unary,args=nil
|
279
|
+
indent "Unary"
|
280
|
+
dedent
|
281
|
+
unary
|
282
|
+
end
|
283
|
+
|
284
|
+
def visitParenth par,args=nil
|
285
|
+
indent "Parenth"
|
286
|
+
par.expr.accept(self)
|
287
|
+
dedent
|
288
|
+
par
|
289
|
+
end
|
290
|
+
|
291
|
+
def visitArrow arrow,args=nil
|
292
|
+
indent "arrow"
|
293
|
+
arrow.lhs.accept(self)
|
294
|
+
arrow.rhs.accept(self)
|
295
|
+
dedent
|
296
|
+
end
|
297
|
+
|
298
|
+
def visitIndexed index,args=nil
|
299
|
+
indent "Index"
|
300
|
+
index.lhs.accept(self)
|
301
|
+
index.rhs.accept(self)
|
302
|
+
dedent
|
303
|
+
end
|
304
|
+
|
305
|
+
def visitArrayOrStructInit init,args=nil
|
306
|
+
indent "ArrayOrStructInit"
|
307
|
+
init.elements.each{|e| e.accept(self)}
|
308
|
+
dedent
|
309
|
+
end
|
310
|
+
|
311
|
+
def visitAddressOf ao,args=nil
|
312
|
+
indent "AddressOf"
|
313
|
+
dedent
|
314
|
+
end
|
315
|
+
|
316
|
+
def visitPointed pointed,args=nil
|
317
|
+
indent "Pointed"
|
318
|
+
pointed.lhs.accept(self)
|
319
|
+
pointed.rhs.accept(self)
|
320
|
+
dedent
|
321
|
+
end
|
322
|
+
|
323
|
+
def visitSizeof sizeof,args=nil
|
324
|
+
indent "Sizeof"
|
325
|
+
sizeof.type.accept(self)
|
326
|
+
dedent
|
327
|
+
sizeof
|
328
|
+
end
|
329
|
+
|
330
|
+
def visitDeref deref,args=nil
|
331
|
+
indent "Deref"
|
332
|
+
dedent
|
333
|
+
end
|
334
|
+
|
335
|
+
def visitBody body,args=nil
|
336
|
+
indent "body"
|
337
|
+
body.stmts.each{|stmt| stmt.accept(self)}
|
338
|
+
dedent
|
339
|
+
end
|
340
|
+
end #class Visitor
|
341
|
+
end #module
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: crokus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jean-Christophe Le Lann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-09-20 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Crokus is developped in Ruby and aims at providing simple basis for C
|
14
|
+
transformations. It has been use for teaching purposes and applied to Electronic
|
15
|
+
System Level experiments.
|
16
|
+
email: lelannje@ensta-bretagne.fr
|
17
|
+
executables:
|
18
|
+
- crokus
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- bin/crokus
|
23
|
+
- lib/crokus.rb
|
24
|
+
- lib/crokus/ast.rb
|
25
|
+
- lib/crokus/ast_printer.rb
|
26
|
+
- lib/crokus/cfg.rb
|
27
|
+
- lib/crokus/cfg_builder.rb
|
28
|
+
- lib/crokus/cfg_cleaner.rb
|
29
|
+
- lib/crokus/cfg_printer.rb
|
30
|
+
- lib/crokus/cleaner.rb
|
31
|
+
- lib/crokus/code.rb
|
32
|
+
- lib/crokus/compiler.rb
|
33
|
+
- lib/crokus/generic_lexer.rb
|
34
|
+
- lib/crokus/indent.rb
|
35
|
+
- lib/crokus/ir_dumper.rb
|
36
|
+
- lib/crokus/lexer.rb
|
37
|
+
- lib/crokus/parser.rb
|
38
|
+
- lib/crokus/parser_only.rb
|
39
|
+
- lib/crokus/pretty_printer.rb
|
40
|
+
- lib/crokus/runner.rb
|
41
|
+
- lib/crokus/tac_builder.rb
|
42
|
+
- lib/crokus/token.rb
|
43
|
+
- lib/crokus/transformer.rb
|
44
|
+
- lib/crokus/version.rb
|
45
|
+
- lib/crokus/visitor.rb
|
46
|
+
homepage: https://github.com/JC-LL/crokus
|
47
|
+
licenses:
|
48
|
+
- MIT
|
49
|
+
metadata: {}
|
50
|
+
post_install_message: Thanks for installing ! Homepage :https://github.com/JC-LL/crokus
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 2.0.0
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 2.7.7
|
67
|
+
signing_key:
|
68
|
+
specification_version: 4
|
69
|
+
summary: Simple parser for a large subset of C language, for experimental purposes
|
70
|
+
test_files: []
|