rename compilers to passses

This commit is contained in:
Torsten Ruger
2017-01-16 17:24:32 +02:00
parent 8dbbffd58e
commit 4ba182a822
14 changed files with 22 additions and 22 deletions

View File

@ -0,0 +1,25 @@
module Melon
module Passes
class LocalsCollector < TotalProcessor
def initialize
@locals = {}
end
def collect(statement)
process statement
@locals
end
def on_lvasgn statement
add_local( statement )
end
def add_local(statement)
var = statement.children[0]
@locals[var] = :Object #not really used right now
end
end
end
end

View File

@ -0,0 +1,38 @@
module Melon
module Passes
class MethodCollector < TotalProcessor
def initialize
@methods = []
end
def collect(statement)
process statement
@methods
end
def on_def(statement)
name , args , body = *statement
args_type = make_type(args)
locals_type = make_locals(body)
@methods << RubyMethod.new(name , args_type , locals_type , body )
end
private
def make_type( statement )
type_hash = {}
statement.children.each do |arg|
type_hash[arg.children[0]] = :Object
end
Parfait::NamedList.type_for( type_hash )
end
def make_locals(body)
type_hash = LocalsCollector.new.collect(body)
Parfait::NamedList.type_for( type_hash )
end
end
end
end

View File

@ -0,0 +1,62 @@
module Melon
module Passes
class MethodCompiler < AST::Processor
def initialize( ruby_method )
@ruby_method = ruby_method
end
def get_code
process(@ruby_method.source)
end
def on_ivasgn(statement)
name , value = *statement
w = Vm::Tree::Assignment.new()
w.name = Vm::Tree::InstanceName.new( name[1..-1].to_sym)
w.value = process(value)
w
end
def on_ivar( var )
name = var.children.first
w = Vm::Tree::FieldAccess.new()
w.receiver = Vm::Tree::KnownName.new(:self)
w.field = Vm::Tree::InstanceName.new( name[1..-1].to_sym)
w
end
def on_send( statement )
receiver , name , args = *statement
w = Vm::Tree::CallSite.new()
puts "receiver #{statement}"
w.name = name
w.arguments = process(args)
w.receiver = process(receiver)
w
end
def on_lvar(statement)
name = statement.children.first.to_sym
if(@ruby_method.args_type.variable_index(name))
return Vm::Tree::ArgumentName.new(name)
end
raise "Not found #{name}"
end
def on_str( string )
Vm::Tree::StringExpression.new(string.children.first)
end
def on_int( expression)
Vm::Tree::IntegerExpression.new(expression.children.first)
end
def handler_missing(node)
raise "No handler for #{node}"
end
end
end
end

View File

@ -0,0 +1,12 @@
module Melon
module Passes
class Normalizer < AST::Processor
def initialize( ruby_method )
@ruby_method
end
end
end
end

View File

@ -0,0 +1,14 @@
module Melon
module Passes
class TotalProcessor < AST::Processor
def handler_missing(node)
node.children.each do |kid |
process(kid) if kid.is_a?(AST::Node)
end
end
end
end
end

View File

@ -0,0 +1,29 @@
module Melon
module Passes
class TypeCollector < TotalProcessor
def initialize
@ivars = {}
end
def collect(statement)
process statement
@ivars
end
def on_ivar(statement)
add_ivar(statement)
end
def on_ivasgn( statement )
add_ivar(statement)
end
def add_ivar(statement)
var = statement.children[0].to_s[1..-1].to_sym
@ivars[var] = :Object #guess, can maybe guess better
end
end
end
end