scrag 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/scrag +4 -0
- data/lib/scrag/code.rb +47 -0
- data/lib/scrag/compiler.rb +119 -0
- data/lib/scrag/runner.rb +71 -0
- data/lib/scrag/version.rb +3 -0
- data/lib/scrag.rb +6 -0
- data/lib/templates/ast.erb +42 -0
- data/lib/templates/code.erb +47 -0
- data/lib/templates/compiler.erb +28 -0
- data/lib/templates/exec.erb +4 -0
- data/lib/templates/gemspec.erb +33 -0
- data/lib/templates/generic_lexer.erb +62 -0
- data/lib/templates/generic_parser.erb +53 -0
- data/lib/templates/lexer.erb +50 -0
- data/lib/templates/parser.erb +73 -0
- data/lib/templates/pretty_printer.erb +29 -0
- data/lib/templates/runner.erb +97 -0
- data/lib/templates/token.erb +63 -0
- data/lib/templates/top_module.erb +7 -0
- data/lib/templates/transformer.erb +487 -0
- data/lib/templates/version.erb +3 -0
- data/lib/templates/visitor.erb +39 -0
- metadata +79 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
require_relative "compiler"
|
4
|
+
|
5
|
+
module <%=project_name.capitalize%>
|
6
|
+
|
7
|
+
class Runner
|
8
|
+
|
9
|
+
def self.run *arguments
|
10
|
+
new.run(arguments)
|
11
|
+
end
|
12
|
+
|
13
|
+
def run arguments
|
14
|
+
compiler=Compiler.new
|
15
|
+
compiler.options = args = parse_options(arguments)
|
16
|
+
begin
|
17
|
+
if filename=args[:file]
|
18
|
+
ok=compiler.compile(filename)
|
19
|
+
else
|
20
|
+
raise "need a <%=project_name%> file : <%=project_name%> [options] <file>"
|
21
|
+
end
|
22
|
+
return ok
|
23
|
+
rescue Exception => e
|
24
|
+
puts e unless compiler.options[:mute]
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def header
|
30
|
+
puts "<%=project_name%> (#{VERSION}) - (c) JC Le Lann 2020"
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def parse_options(arguments)
|
35
|
+
|
36
|
+
parser = OptionParser.new
|
37
|
+
|
38
|
+
no_arguments=arguments.empty?
|
39
|
+
|
40
|
+
options = {}
|
41
|
+
|
42
|
+
parser.on("-h", "--help", "Show help message") do
|
43
|
+
puts parser
|
44
|
+
exit(true)
|
45
|
+
end
|
46
|
+
|
47
|
+
parser.on("-p", "--parse", "parse only") do
|
48
|
+
options[:parse_only]=true
|
49
|
+
end
|
50
|
+
|
51
|
+
parser.on("--pp", "pretty print back source code ") do
|
52
|
+
options[:pp] = true
|
53
|
+
end
|
54
|
+
|
55
|
+
parser.on("--ast", "abstract syntax tree (AST)") do
|
56
|
+
options[:ast] = true
|
57
|
+
end
|
58
|
+
|
59
|
+
parser.on("--check", "elaborate and check types") do
|
60
|
+
options[:check] = true
|
61
|
+
end
|
62
|
+
|
63
|
+
parser.on("--draw_ast", "draw abstract syntax tree (AST)") do
|
64
|
+
options[:draw_ast] = true
|
65
|
+
end
|
66
|
+
|
67
|
+
parser.on("--dummy_transform", "dummy ast transform") do
|
68
|
+
options[:dummy_transform] = true
|
69
|
+
end
|
70
|
+
|
71
|
+
parser.on("--vv", "verbose") do
|
72
|
+
options[:verbose] = true
|
73
|
+
end
|
74
|
+
|
75
|
+
parser.on("--mute","mute") do
|
76
|
+
options[:mute]=true
|
77
|
+
end
|
78
|
+
|
79
|
+
parser.on("-v", "--version", "Show version number") do
|
80
|
+
puts VERSION
|
81
|
+
exit(true)
|
82
|
+
end
|
83
|
+
|
84
|
+
parser.parse!(arguments)
|
85
|
+
|
86
|
+
header unless options[:mute]
|
87
|
+
|
88
|
+
options[:file]=arguments.shift #the remaining file
|
89
|
+
|
90
|
+
if no_arguments
|
91
|
+
puts parser
|
92
|
+
end
|
93
|
+
|
94
|
+
options
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class Token
|
2
|
+
attr_accessor :kind,:val,:pos
|
3
|
+
def initialize tab
|
4
|
+
@kind,@val,@pos=*tab
|
5
|
+
end
|
6
|
+
|
7
|
+
def is_a? kind
|
8
|
+
case kind
|
9
|
+
when Symbol
|
10
|
+
return @kind==kind
|
11
|
+
when Array
|
12
|
+
for sym in kind
|
13
|
+
return true if @kind==sym
|
14
|
+
end
|
15
|
+
return false
|
16
|
+
else
|
17
|
+
raise "wrong type during lookahead"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def not_a? kind
|
22
|
+
result=self.is_a? kind
|
23
|
+
!result
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_not_a? kind
|
27
|
+
case kind
|
28
|
+
when Symbol
|
29
|
+
return @kind!=kind
|
30
|
+
when Array
|
31
|
+
ret=true
|
32
|
+
for sym in kind
|
33
|
+
ret=false if @kind==sym
|
34
|
+
end
|
35
|
+
return ret
|
36
|
+
else
|
37
|
+
raise "wrong type during lookahead"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# def accept visitor
|
42
|
+
# end
|
43
|
+
|
44
|
+
def self.create str
|
45
|
+
Token.new [:id,str,[0,0]]
|
46
|
+
end
|
47
|
+
|
48
|
+
# def inspect
|
49
|
+
# "(#{@kind.to_s.ljust(15,' ')},'#{@val}',#{@pos})"
|
50
|
+
# end
|
51
|
+
|
52
|
+
def to_s
|
53
|
+
val
|
54
|
+
end
|
55
|
+
|
56
|
+
def clone
|
57
|
+
Token.new([@kind,@val,@pos])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
ONE = Token.new [:int_lit,'1',['na','na']]
|
62
|
+
ZERO = Token.new [:int_lit,'0',['na','na']]
|
63
|
+
DUMMY= Token.new [:id ,'' ,['na','na']]
|
@@ -0,0 +1,487 @@
|
|
1
|
+
require_relative 'code'
|
2
|
+
|
3
|
+
module <%=project_name.capitalize%>
|
4
|
+
|
5
|
+
# here we transform an AST into another AST.
|
6
|
+
# we don't use Marshalling.
|
7
|
+
|
8
|
+
class Transformer
|
9
|
+
|
10
|
+
attr_accessor :code
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@ind=-2
|
14
|
+
@verbose=true
|
15
|
+
@verbose=false
|
16
|
+
end
|
17
|
+
|
18
|
+
def transform ast
|
19
|
+
ast.accept(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
alias :visit :transform
|
23
|
+
|
24
|
+
def new_tmp
|
25
|
+
$tmp_id||=0
|
26
|
+
tok=Token.create_id "$"+$tmp_id.to_s
|
27
|
+
$tmp_id+=1
|
28
|
+
Ident.new(tok)
|
29
|
+
end
|
30
|
+
|
31
|
+
def new_ident
|
32
|
+
new_tmp
|
33
|
+
end
|
34
|
+
|
35
|
+
def reset_new_ident
|
36
|
+
@tmp_id=0
|
37
|
+
end
|
38
|
+
|
39
|
+
def visitToken tok, args=nil
|
40
|
+
Token.new [tok.kind,tok.val,tok.pos]
|
41
|
+
end
|
42
|
+
|
43
|
+
def visitRoot root,args=nil
|
44
|
+
stmts=root.stmts.map{|stmt| stmt.accept(self)}
|
45
|
+
ret=Root.new(stmts)
|
46
|
+
ret.pass="transformed"
|
47
|
+
ret
|
48
|
+
end
|
49
|
+
|
50
|
+
def visitRequire require_,args=nil
|
51
|
+
Require.new(require.filename)
|
52
|
+
end
|
53
|
+
|
54
|
+
def visitModule module_,args=nil
|
55
|
+
name=module_.name.accept(self)
|
56
|
+
elements=module_.elements.map{|e| e.accept(self)}
|
57
|
+
Module.new(name,elements)
|
58
|
+
end
|
59
|
+
|
60
|
+
def visitComment comment,args=nil
|
61
|
+
Comment.new(comment.str)
|
62
|
+
end
|
63
|
+
|
64
|
+
def visitSingleTokenLit stl,args=nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def visitIdent ident,args=nil
|
68
|
+
token=ident.token.accept(self)
|
69
|
+
Ident.new(token)
|
70
|
+
end
|
71
|
+
|
72
|
+
def visitIntLit intlit,args=nil
|
73
|
+
IntLit.create intlit.token.val
|
74
|
+
end
|
75
|
+
|
76
|
+
def visitFloatLit floatlit,args=nil
|
77
|
+
FloatLit.create floatlit.token.val
|
78
|
+
end
|
79
|
+
|
80
|
+
def visitTrueLit true_,args=nil
|
81
|
+
TrueLit.create "true"
|
82
|
+
end
|
83
|
+
|
84
|
+
def visitFalseLit false_,args=nil
|
85
|
+
FalseLit.create "false"
|
86
|
+
end
|
87
|
+
|
88
|
+
def visitStringLit str,args=nil
|
89
|
+
StringLit.create str.token.val
|
90
|
+
end
|
91
|
+
|
92
|
+
def visitParam param,args=nil
|
93
|
+
name=param.name.accept(self)
|
94
|
+
type=param.parsed_type.accept(self)
|
95
|
+
expr=param.expr.accept(self)
|
96
|
+
Param.new(name,type,expr)
|
97
|
+
end
|
98
|
+
|
99
|
+
def visitIo io,args=nil
|
100
|
+
end
|
101
|
+
|
102
|
+
def visitInput input,args=nil
|
103
|
+
name=input.name.accept(self)
|
104
|
+
type=input.parsed_type.accept(self)
|
105
|
+
Input.new(name,type)
|
106
|
+
end
|
107
|
+
|
108
|
+
def visitOutput output,args=nil
|
109
|
+
name=output.name.accept(self)
|
110
|
+
type=output.parsed_type.accept(self)
|
111
|
+
Output.new(name,type)
|
112
|
+
end
|
113
|
+
|
114
|
+
def visitDeclaration declaration,args=nil
|
115
|
+
end
|
116
|
+
|
117
|
+
def visitVar var,args=nil
|
118
|
+
name=var.name.accept(self)
|
119
|
+
type=var.parsed_type.accept(self)
|
120
|
+
Var.new(name,type)
|
121
|
+
end
|
122
|
+
|
123
|
+
def visitTypeDef typedef,args=nil
|
124
|
+
name=typedef.name.accept(self)
|
125
|
+
type=typedef.type.accept(self)
|
126
|
+
TypeDef.new(name,type)
|
127
|
+
end
|
128
|
+
|
129
|
+
def visitType type,args=nil
|
130
|
+
tok=type.token.accept(self)
|
131
|
+
Type.new(tok)
|
132
|
+
end
|
133
|
+
|
134
|
+
def visitBasicType basic_type,args=nil
|
135
|
+
tok=basic_type.token.accept(self)
|
136
|
+
BasicType.new(tok)
|
137
|
+
end
|
138
|
+
|
139
|
+
def visitNil nil_,args=nil
|
140
|
+
Nil.new
|
141
|
+
end
|
142
|
+
|
143
|
+
def visitNamedType named_type,args=nil
|
144
|
+
name=named_type.name.accept(self)
|
145
|
+
NamedType.new(name)
|
146
|
+
end
|
147
|
+
|
148
|
+
def visitArrayType array_type,args=nil
|
149
|
+
size=array_type.size.accept(self)
|
150
|
+
ptype=array_type.parsed_type.accept(self)
|
151
|
+
ArrayType.new(size,ptype)
|
152
|
+
end
|
153
|
+
|
154
|
+
def visitRecordType record_type,args=nil
|
155
|
+
formal_parameters=record_type.formal_parameters.map{|fp| fp.accept(self)}
|
156
|
+
RecordType.new(formal_parameters)
|
157
|
+
end
|
158
|
+
|
159
|
+
def visitEnumDef enum_def,args=nil
|
160
|
+
list=enum_def.list.map{|e| e.accept(self)}
|
161
|
+
EnumDef.new(list)
|
162
|
+
end
|
163
|
+
|
164
|
+
def visitActor actor,args=nil
|
165
|
+
puts " "+"|--[+] transforming actor #{actor.name.str}"
|
166
|
+
ret=Actor.new
|
167
|
+
ret.name=actor.name.accept(self)
|
168
|
+
ret.includes=actor.includes.map{|inc| inc.accept(self)}
|
169
|
+
ret.inputs=actor.inputs.map{|i| i.accept(self,args)}
|
170
|
+
ret.outputs=actor.outputs.map{|o|o.accept(self,args)}
|
171
|
+
ret.typedefs=actor.typedefs.each {|o| o.accept(self,args)}
|
172
|
+
ret.vars=actor.vars.map{|v| v.accept(self,args)}
|
173
|
+
ret.body=actor.body.accept(self,args)
|
174
|
+
ret.funcs=actor.funcs.map{|func|func.accept(self,args)}
|
175
|
+
ret
|
176
|
+
end
|
177
|
+
|
178
|
+
def visitSystem system,args=nil
|
179
|
+
ret=System.new
|
180
|
+
ret.name=system.name.accept(self)
|
181
|
+
ret.includes=system.includes.map{|e| e.accept(self)}
|
182
|
+
ret.params=system.params.map{|e| e.accept(self)}
|
183
|
+
ret.inputs=system.inputs.map{|i| i.accept(self,args)}
|
184
|
+
ret.outputs=system.outputs.map{|o|o.accept(self,args)}
|
185
|
+
ret.instances=system.instances.map{|e| e.accept(self)}
|
186
|
+
ret.connects=system.connects.map{|e| e.accept(self)}
|
187
|
+
ret.generate_fors=system.generate_fors.map{|e| e.accept(self)}
|
188
|
+
ret
|
189
|
+
end
|
190
|
+
|
191
|
+
def visitInclude include,args=nil
|
192
|
+
name=include.name.accept(self)
|
193
|
+
Include.new(name)
|
194
|
+
end
|
195
|
+
|
196
|
+
def visitInstance instance,args=nil
|
197
|
+
name=instance.name.accept(self)
|
198
|
+
type=instance.parsed_type.accept(self)
|
199
|
+
Instance.new(name,type)
|
200
|
+
end
|
201
|
+
|
202
|
+
def visitConnect connect,args=nil
|
203
|
+
source=connect.source.accept(self)
|
204
|
+
sink=connect.sink.accept(self)
|
205
|
+
channel=connect.channel.accept(self) if connect.channel
|
206
|
+
Connect.new(source,sink,channel)
|
207
|
+
end
|
208
|
+
|
209
|
+
def visitCnxPort cnx_port,args=nil
|
210
|
+
instance_name=cnx_port.instance_name.accept(self) if cnx_port.instance_name
|
211
|
+
port_name=cnx_port.port_name.accept(self)
|
212
|
+
CnxPort.new(instance_name,port_name)
|
213
|
+
end
|
214
|
+
# FSM
|
215
|
+
def visitFsm fsm,args=nil
|
216
|
+
states=fsm.states.map{|state| state.accept(self)}
|
217
|
+
Fsm.new(states)
|
218
|
+
end
|
219
|
+
|
220
|
+
def visitState state,args=nil
|
221
|
+
name=state.name.accept(self)
|
222
|
+
body=state.body.accept(self)
|
223
|
+
State.new(name,body)
|
224
|
+
end
|
225
|
+
|
226
|
+
def visitNext next_,args=nil
|
227
|
+
state_name=next_.state_name.accept(self)
|
228
|
+
Next.new(state_name)
|
229
|
+
end
|
230
|
+
|
231
|
+
# IR
|
232
|
+
def visitIR ir,args=nil
|
233
|
+
name=ir.name.accept(self) #bug fix
|
234
|
+
bbs=ir.bbs.map{|bb| bb.accept(self)}
|
235
|
+
new_ir=IR.new(name,bbs)
|
236
|
+
|
237
|
+
IR_Builder.new.link(new_ir)
|
238
|
+
IR_Finalizer.new.clean(new_ir)
|
239
|
+
new_ir
|
240
|
+
end
|
241
|
+
|
242
|
+
def visitBasicBlock bb,args=nil
|
243
|
+
label=bb.label.accept(self)
|
244
|
+
stmts=bb.stmts.map{|stmt| stmt.accept(self)}
|
245
|
+
infos={:label=>label}
|
246
|
+
BasicBlock.new(infos,stmts)
|
247
|
+
end
|
248
|
+
#
|
249
|
+
def visitBody body,args=nil
|
250
|
+
stmts=body.stmts.map{|stmt| stmt.accept(self)}
|
251
|
+
Body.new(stmts)
|
252
|
+
end
|
253
|
+
|
254
|
+
def visitParallel parallel,args=nil
|
255
|
+
body=parallel.body.accept(self)
|
256
|
+
Parallel.new(body)
|
257
|
+
end
|
258
|
+
|
259
|
+
def visitLabel label,args=nil
|
260
|
+
ident=label.indent.accept(self)
|
261
|
+
Label.new(ident)
|
262
|
+
end
|
263
|
+
|
264
|
+
def visitAssign assign,args=nil
|
265
|
+
lhs=assign.lhs.accept(self)
|
266
|
+
rhs=assign.rhs.accept(self)
|
267
|
+
Assign.new(lhs,rhs)
|
268
|
+
end
|
269
|
+
|
270
|
+
def visitAccu accu,args=nil
|
271
|
+
lhs=accu.lhs.accept(self)
|
272
|
+
op=accu.op.accept(self)
|
273
|
+
rhs=accu.rhs.accept(self)
|
274
|
+
Accu.new(lhs,op,rhs)
|
275
|
+
end
|
276
|
+
|
277
|
+
def visitIf if_,args=nil
|
278
|
+
cond=if_.cond.accept(self)
|
279
|
+
then_=if_.then.accept(self)
|
280
|
+
elsifs_=if_.elsifs.map{|elsif_| elsif_.accept(self)}
|
281
|
+
else_=if_.else.accept(self)
|
282
|
+
If.new(cond,then_,elsifs_,else_)
|
283
|
+
end
|
284
|
+
|
285
|
+
def visitElsif elsif_,args=nil
|
286
|
+
cond=elsif_.cond.accept(self)
|
287
|
+
body=elsif_.body.accept(self)
|
288
|
+
Elsif.new(cond,body)
|
289
|
+
end
|
290
|
+
|
291
|
+
def visitPuts puts_,args=nil
|
292
|
+
expr=puts_.expr.accept(self)
|
293
|
+
Puts.new(expr)
|
294
|
+
end
|
295
|
+
|
296
|
+
def visitWhile while_,args=nil
|
297
|
+
cond=while_.cond.accept(self)
|
298
|
+
body=while_.body.accept(self)
|
299
|
+
While.new(cond,body)
|
300
|
+
end
|
301
|
+
|
302
|
+
def visitFor for_,args=nil
|
303
|
+
idx=for_.idx.accept(self)
|
304
|
+
range=for_.range.accept(self)
|
305
|
+
body=for_.body.accept(self)
|
306
|
+
For.new(idx,range,body)
|
307
|
+
end
|
308
|
+
|
309
|
+
def visitRange range_,args=nil
|
310
|
+
lhs=range_.lhs.accept(self)
|
311
|
+
rhs=range_.rhs.accept(self)
|
312
|
+
Range.new(lhs,rhs)
|
313
|
+
end
|
314
|
+
|
315
|
+
def visitFuncDef func_def,args=nil
|
316
|
+
puts " "*5+"|--[+] transforming def '#{func_def.name}'"
|
317
|
+
name=func_def.name.accept(self)
|
318
|
+
formal_parameters=func_def.formal_parameters.map{|fp| fp.accept(self)}
|
319
|
+
vars=func_def.vars.map{|v| v.accept(self)}
|
320
|
+
body=func_def.body.accept(self)
|
321
|
+
typedefs=func_def.typedefs.map{|td| td.accept(self)}
|
322
|
+
FuncDef.new(name,formal_parameters,vars,body,typedefs)
|
323
|
+
end
|
324
|
+
|
325
|
+
def visitFormalParameter fp,args=nil
|
326
|
+
name=fp.name.accept(self)
|
327
|
+
type=fp.parsed_type.accept(self)
|
328
|
+
FormalParameter.new(name,type)
|
329
|
+
end
|
330
|
+
|
331
|
+
def visitSend send,args=nil
|
332
|
+
expr=send.expr.accept(self)
|
333
|
+
port=send.port.accept(self)
|
334
|
+
Send.new(expr,port)
|
335
|
+
end
|
336
|
+
|
337
|
+
def visitWrite write,args=nil
|
338
|
+
expr=write.expr.accept(self)
|
339
|
+
port=write.port.accept(self)
|
340
|
+
Write.new(expr,port)
|
341
|
+
end
|
342
|
+
|
343
|
+
def visitReceive receive,args=nil
|
344
|
+
expr=receive.expr.accept(self)
|
345
|
+
port=receive.port.accept(self)
|
346
|
+
Receive.new(expr,port)
|
347
|
+
end
|
348
|
+
|
349
|
+
def visitRead read,args=nil
|
350
|
+
expr=read.expr.accept(self)
|
351
|
+
port=read.port.accept(self)
|
352
|
+
Read.new(expr,port)
|
353
|
+
end
|
354
|
+
|
355
|
+
def visitReturn return_,args=nil
|
356
|
+
expr=return_.expr.accept(self)
|
357
|
+
Return.new(expr)
|
358
|
+
end
|
359
|
+
|
360
|
+
def visitWait wait,args=nil
|
361
|
+
Wait.new
|
362
|
+
end
|
363
|
+
|
364
|
+
def visitBinary binary,args=nil
|
365
|
+
ret=Binary.new
|
366
|
+
ret.lhs=binary.lhs.accept(self)
|
367
|
+
ret.op=binary.op.accept(self)
|
368
|
+
ret.rhs=binary.rhs.accept(self)
|
369
|
+
ret.type=binary.type # <======= type also propagated ?
|
370
|
+
ret
|
371
|
+
end
|
372
|
+
|
373
|
+
def visitFuncCall func_call,args=nil
|
374
|
+
name=func_call.name.accept(self)
|
375
|
+
actual_parameters=func_call.actual_parameters.map{|ap| ap.accept(self)}
|
376
|
+
FuncCall.new(name,actual_parameters)
|
377
|
+
end
|
378
|
+
|
379
|
+
def visitIndexed indexed,args=nil
|
380
|
+
lhs=indexed.lhs.accept(self)
|
381
|
+
rhs=indexed.rhs.accept(self)
|
382
|
+
Indexed.new(lhs,rhs)
|
383
|
+
end
|
384
|
+
|
385
|
+
def visitPointed pointed,args=nil
|
386
|
+
lhs=pointed.lhs.accept(self)
|
387
|
+
rhs=pointed.rhs.accept(self)
|
388
|
+
Pointed.new(lhs,rhs)
|
389
|
+
end
|
390
|
+
|
391
|
+
def visitRecordLit reclit,args=nil
|
392
|
+
elements=reclit.elements.map{|e| e.accept(self)}
|
393
|
+
RecordLit.new(elements)
|
394
|
+
end
|
395
|
+
|
396
|
+
def visitArrayLit arylit,args=nil
|
397
|
+
elements=arylit.elements.map{|e| e.accept(self)}
|
398
|
+
ArrayLit.new(elements)
|
399
|
+
end
|
400
|
+
|
401
|
+
def visitUnary unary,args=nil
|
402
|
+
#:abtract
|
403
|
+
end
|
404
|
+
|
405
|
+
def visitMinus minus,args=nil
|
406
|
+
expr=minus.expr.accept(self)
|
407
|
+
Minus.new(expr)
|
408
|
+
end
|
409
|
+
|
410
|
+
def visitNot not_,args=nil
|
411
|
+
expr=not_.expr.accept(self)
|
412
|
+
Not.new(expr)
|
413
|
+
end
|
414
|
+
|
415
|
+
def visitParenth parenth,args=nil
|
416
|
+
expr=parenth.expr.accept(self)
|
417
|
+
Parenth.new(expr)
|
418
|
+
end
|
419
|
+
|
420
|
+
def visitPre pre,args=nil
|
421
|
+
expr=pre.expr.accept(self)
|
422
|
+
Pre.new(expr)
|
423
|
+
end
|
424
|
+
|
425
|
+
def visitValid valid,args=nil
|
426
|
+
port_name=valid.port_name.accept(self)
|
427
|
+
Valid.new(port_name)
|
428
|
+
end
|
429
|
+
|
430
|
+
def visitGoto goto,args=nil
|
431
|
+
label=goto.label.accept(self)
|
432
|
+
Goto.new(label)
|
433
|
+
end
|
434
|
+
|
435
|
+
def visitStop stop,args=nil
|
436
|
+
Stop.new
|
437
|
+
end
|
438
|
+
|
439
|
+
def visitITE ite,args=nil
|
440
|
+
cond=ite.cond.accept(self)
|
441
|
+
label_true=ite.label_true.accept(self)
|
442
|
+
label_false=ite.label_false.accept(self)
|
443
|
+
new_ite=ITE.new(cond)
|
444
|
+
new_ite.label_true=label_true
|
445
|
+
new_ite.label_false=label_false
|
446
|
+
new_ite
|
447
|
+
end
|
448
|
+
|
449
|
+
def visitReq req,args=nil
|
450
|
+
port=req.port.accept(self)
|
451
|
+
Req.new(port)
|
452
|
+
end
|
453
|
+
|
454
|
+
def visitUnreq unreq,args=nil
|
455
|
+
port=unreq.port.accept(self)
|
456
|
+
Unreq.new(port)
|
457
|
+
end
|
458
|
+
|
459
|
+
def visitAck ack,args=nil
|
460
|
+
port=ack.port.accept(self)
|
461
|
+
Ack.new(port)
|
462
|
+
end
|
463
|
+
|
464
|
+
def visitCallAck call_ack,args=nil
|
465
|
+
end
|
466
|
+
|
467
|
+
def visitCallReq call_req,args=nil
|
468
|
+
end
|
469
|
+
|
470
|
+
def visitCallUnreq call_unreq,args=nil
|
471
|
+
end
|
472
|
+
|
473
|
+
def visitCallRet call_ret,args=nil
|
474
|
+
end
|
475
|
+
|
476
|
+
def visitJTrue jtrue,args=nil
|
477
|
+
end
|
478
|
+
|
479
|
+
def visitJlt jlt,args=nil
|
480
|
+
end
|
481
|
+
|
482
|
+
def visitPhi phi,args=nil
|
483
|
+
end
|
484
|
+
|
485
|
+
|
486
|
+
end #def visitVisitor
|
487
|
+
end #module
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative 'code'
|
2
|
+
|
3
|
+
module <%=project_name.capitalize%>
|
4
|
+
|
5
|
+
# here we transform an AST into another AST.
|
6
|
+
# we don't use Marshalling.
|
7
|
+
|
8
|
+
class Visitor
|
9
|
+
|
10
|
+
attr_accessor :code
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@verbose=true
|
14
|
+
@verbose=false
|
15
|
+
end
|
16
|
+
|
17
|
+
def visit ast
|
18
|
+
ast.accept(self)
|
19
|
+
end
|
20
|
+
|
21
|
+
def visitToken tok, args=nil
|
22
|
+
Token.new [tok.kind,tok.val,tok.pos]
|
23
|
+
end
|
24
|
+
|
25
|
+
def visitRoot root,args=nil
|
26
|
+
root.stmts.each{|stmt| stmt.accept(self)}
|
27
|
+
end
|
28
|
+
|
29
|
+
def visitComment comment,args=nil
|
30
|
+
comment
|
31
|
+
end
|
32
|
+
|
33
|
+
def visitIdent ident,args=nil
|
34
|
+
token=ident.token.accept(self)
|
35
|
+
Ident.new(token)
|
36
|
+
end
|
37
|
+
|
38
|
+
end #def visitVisitor
|
39
|
+
end #module
|