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.
@@ -0,0 +1,3 @@
1
+ module Crokus
2
+ VERSION="0.0.2"
3
+ end
@@ -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: []