sorting mom instructions and statements into separate dirs
This commit is contained in:
36
lib/mom/statement/if_statement.rb
Normal file
36
lib/mom/statement/if_statement.rb
Normal file
@ -0,0 +1,36 @@
|
||||
module Mom
|
||||
class IfStatement < Statement
|
||||
attr_reader :condition , :if_true , :if_false
|
||||
|
||||
attr_accessor :hoisted
|
||||
|
||||
def initialize( cond , if_true , if_false = nil)
|
||||
@condition = cond
|
||||
@if_true = if_true
|
||||
@if_false = if_false
|
||||
raise if_true.class unless if_true.is_a? Statement
|
||||
end
|
||||
|
||||
def flatten(options = {})
|
||||
true_label = Label.new( "true_label_#{object_id}")
|
||||
false_label = Label.new( "false_label_#{object_id}")
|
||||
merge_label = Label.new( "merge_label_#{object_id}")
|
||||
first = condition.flatten( true_label: true_label , false_label: false_label)
|
||||
if hoisted
|
||||
head = hoisted.flatten
|
||||
head.append first
|
||||
else
|
||||
head = first
|
||||
end
|
||||
head.append true_label
|
||||
head.append if_true.flatten( merge_label: merge_label)
|
||||
if( if_false)
|
||||
head.append false_label
|
||||
head.append if_false.flatten( merge_label: merge_label)
|
||||
end
|
||||
head.append merge_label
|
||||
head
|
||||
end
|
||||
end
|
||||
|
||||
end
|
15
lib/mom/statement/statement.rb
Normal file
15
lib/mom/statement/statement.rb
Normal file
@ -0,0 +1,15 @@
|
||||
module Mom
|
||||
class Statement
|
||||
include Common::List
|
||||
# flattening will change the structure from a tree to a linked list (and use
|
||||
# nekst to do so)
|
||||
def flatten(options = {})
|
||||
raise "not implemented for #{self}"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
require_relative "statements"
|
||||
require_relative "if_statement"
|
||||
require_relative "while_statement"
|
20
lib/mom/statement/statements.rb
Normal file
20
lib/mom/statement/statements.rb
Normal file
@ -0,0 +1,20 @@
|
||||
module Mom
|
||||
class Statements < Statement
|
||||
include Common::Statements
|
||||
|
||||
def flatten( options = {} )
|
||||
flat = @statements.shift.flatten(options)
|
||||
while( nekst = @statements.shift )
|
||||
flat.append nekst.flatten(options)
|
||||
end
|
||||
flat
|
||||
end
|
||||
|
||||
def initialize(arr)
|
||||
super(arr)
|
||||
arr.each {|s|
|
||||
raise "Not a Statement #{s}" unless s.is_a?( Statement) or s.is_a?(Instruction)
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
25
lib/mom/statement/while_statement.rb
Normal file
25
lib/mom/statement/while_statement.rb
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
module Mom
|
||||
class WhileStatement < Statement
|
||||
attr_reader :condition , :statements
|
||||
|
||||
attr_accessor :hoisted
|
||||
|
||||
def initialize( cond , statements)
|
||||
@condition = cond
|
||||
@statements = statements
|
||||
end
|
||||
|
||||
def flatten(options = {})
|
||||
merge_label = Label.new( "merge_label_#{object_id}")
|
||||
cond_label = Label.new( "cond_label_#{object_id}")
|
||||
@nekst = cond_label
|
||||
@nekst.append(hoisted.flatten) if hoisted
|
||||
@nekst.append condition.flatten( true_label: cond_label , false_label: merge_label)
|
||||
@nekst.append merge_label
|
||||
@nekst
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
Reference in New Issue
Block a user