define modules and tests, no compiling
This commit is contained in:
@ -9,7 +9,7 @@
|
||||
|
||||
module Ast
|
||||
class Expression
|
||||
def eval
|
||||
def compile context , into
|
||||
raise "abstract #{self}"
|
||||
end
|
||||
def compile context , into
|
||||
@ -22,7 +22,7 @@ module Ast
|
||||
return false unless other.class == self.class
|
||||
attributes.each do |a|
|
||||
left = send(a)
|
||||
right = other.send( a)
|
||||
right = other.send(a)
|
||||
return false unless left.class == right.class
|
||||
return false unless left == right
|
||||
end
|
||||
@ -33,10 +33,11 @@ module Ast
|
||||
end
|
||||
|
||||
require_relative "basic_expressions"
|
||||
require_relative "call_site_expression"
|
||||
require_relative "compound_expressions"
|
||||
require_relative "if_expression"
|
||||
require_relative "while_expression"
|
||||
require_relative "return_expression"
|
||||
require_relative "function_expression"
|
||||
require_relative "module_expression"
|
||||
require_relative "operator_expressions"
|
||||
require_relative "call_site_expression"
|
||||
require_relative "return_expression"
|
||||
require_relative "while_expression"
|
||||
|
34
lib/ast/module_expression.rb
Normal file
34
lib/ast/module_expression.rb
Normal file
@ -0,0 +1,34 @@
|
||||
module Ast
|
||||
class ModuleExpression < Expression
|
||||
attr_reader :name ,:expressions
|
||||
def initialize name , expressions
|
||||
@name = name.to_sym
|
||||
@expressions = expressions
|
||||
end
|
||||
def inspect
|
||||
self.class.name + ".new(" + @name.inspect + " ," + @expressions.inspect + " )"
|
||||
end
|
||||
def to_s
|
||||
"module #{name}\n #{expressions}\nend\n"
|
||||
end
|
||||
def attributes
|
||||
[:name , :expressions]
|
||||
end
|
||||
def compile context , into
|
||||
expression_value = expression.compile(context , into)
|
||||
puts "compiled return expression #{expression_value.inspect}, now return in 7"
|
||||
# copied from function expression: TODO make function
|
||||
|
||||
return_reg = Vm::Integer.new(7)
|
||||
if expression_value.is_a?(Vm::IntegerConstant) or expression_value.is_a?(Vm::StringConstant)
|
||||
return_reg.load into , expression_value if expression_value.register != return_reg.register
|
||||
else
|
||||
return_reg.move( into, expression_value ) if expression_value.register != return_reg.register
|
||||
end
|
||||
#function.set_return return_reg
|
||||
return return_reg
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
Reference in New Issue
Block a user