56 lines
1.0 KiB
Ruby
56 lines
1.0 KiB
Ruby
|
module Ruby
|
||
|
class Statements < Statement
|
||
|
attr_reader :statements
|
||
|
def initialize(statements)
|
||
|
@statements = statements
|
||
|
end
|
||
|
|
||
|
def empty?
|
||
|
@statements.empty?
|
||
|
end
|
||
|
def single?
|
||
|
@statements.length == 1
|
||
|
end
|
||
|
def first
|
||
|
@statements.first
|
||
|
end
|
||
|
def last
|
||
|
@statements.last
|
||
|
end
|
||
|
def length
|
||
|
@statements.length
|
||
|
end
|
||
|
def [](i)
|
||
|
@statements[i]
|
||
|
end
|
||
|
def <<(o)
|
||
|
@statements << o
|
||
|
self
|
||
|
end
|
||
|
|
||
|
# create mom instructions
|
||
|
def to_mom( compiler )
|
||
|
raise "Empty list ? #{statements.length}" if empty?
|
||
|
stats = @statements.dup
|
||
|
flat = stats.shift.to_mom(compiler)
|
||
|
while( nekst = stats.shift )
|
||
|
flat.append nekst.to_mom(compiler)
|
||
|
end
|
||
|
flat
|
||
|
end
|
||
|
|
||
|
def each(&block)
|
||
|
block.call(self)
|
||
|
@statements.each{|a| a.each(&block)}
|
||
|
end
|
||
|
|
||
|
def to_s(depth = 0)
|
||
|
at_depth(depth , *@statements.collect{|st| st.to_s(depth)})
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class ScopeStatement < Statements
|
||
|
end
|
||
|
end
|