diff --git a/lib/ast/basic_expressions.rb b/lib/ast/basic_expressions.rb index 235cc901..357ca4fb 100644 --- a/lib/ast/basic_expressions.rb +++ b/lib/ast/basic_expressions.rb @@ -26,9 +26,14 @@ module Ast def initialize str @string = str end + + def compile context + # TODO check if needst to be added? + ObjectReference.new( StringValue.new(string) ) + end def == other compare other , [:string] end end - + end \ No newline at end of file diff --git a/lib/ast/conversion.rb b/lib/ast/conversion.rb deleted file mode 100644 index cd774669..00000000 --- a/lib/ast/conversion.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Ast - # Convert ast to vm-values via visitor pattern - # We do this (what would otherwise seem like foot-shuffling) to keep the layers seperated - # Ie towards the feature goal of reusing the same parse for several binary outputs - - # scope of the funcitons is thus class scope ie self is the expression and all attributes work - # gets included into Value - module Conversion - def to_value - cl_name = self.class.name.to_s.split("::").last.gsub("Expression","").downcase - send "#{cl_name}_value" - end - def funcall_value - FunctionCall.new( name , args.collect{ |a| a.to_value } ) - end - def string_value - ObjectReference.new( StringValue.new(string) ) - end - end - -end -require_relative "expression" - -Ast::Expression.class_eval do - include Ast::Conversion -end \ No newline at end of file diff --git a/lib/ast/operator_expressions.rb b/lib/ast/operator_expressions.rb index 7935c95d..75a3d032 100644 --- a/lib/ast/operator_expressions.rb +++ b/lib/ast/operator_expressions.rb @@ -7,6 +7,15 @@ module Ast def initialize name, args @name , @args = name , args end + + def compile context + fun = Vm::FunctionCall.new( name , args.collect{ |a| a.compile(context) } ) + fun.assign_function context + fun.load_args + #puts "funcall #{self.inspect}" + fun.do_call + end + def == other compare other , [:name , :args] end diff --git a/lib/vm/function_call.rb b/lib/vm/function_call.rb index 5ca4d717..67bbb9e7 100644 --- a/lib/vm/function_call.rb +++ b/lib/vm/function_call.rb @@ -6,32 +6,24 @@ module Vm def initialize(name , args) super(name) - @name = name - @values = args + @args = args @function = nil end - attr_reader :function - def args - values - end + attr_reader :function , :args - def compile context + def assign_function context @function = context.program.get_function @name if @function - raise "error #{self}" unless @function.arity != @values.length + raise "error #{self}" unless @function.arity != args.length else @function = context.program.get_or_create_function @name end - args.each_with_index do |arg | - arg.compile context - end + end + def load_args args.each_with_index do |arg , index| arg.load index end - #puts "funcall #{self.inspect}" - self.do_call end - def do_call Machine.instance.function_call self end diff --git a/lib/vm/values.rb b/lib/vm/values.rb index 1c9f18e7..09bb1550 100644 --- a/lib/vm/values.rb +++ b/lib/vm/values.rb @@ -96,5 +96,3 @@ module Vm end end - -require "ast/conversion" \ No newline at end of file