54 lines
933 B
Ruby
54 lines
933 B
Ruby
|
require_relative "kernel"
|
||
|
|
||
|
module Vm
|
||
|
class Context
|
||
|
def initialize
|
||
|
@locals = {}
|
||
|
end
|
||
|
def get name
|
||
|
@locals[name]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# ast classes
|
||
|
module Parser
|
||
|
Expression.class_eval do
|
||
|
def compile builder , context
|
||
|
raise "abstract #{self.inspect}"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
IntegerExpression.class_eval do
|
||
|
end
|
||
|
|
||
|
NameExpression.class_eval do
|
||
|
end
|
||
|
|
||
|
StringExpression.class_eval do
|
||
|
def compile builder , context
|
||
|
return string
|
||
|
end
|
||
|
end
|
||
|
|
||
|
FuncallExpression.class_eval do
|
||
|
def compile builder , context
|
||
|
arguments = args.collect{|arg| arg.compile(builder , context) }
|
||
|
function = context.get(name)
|
||
|
unless function
|
||
|
function = Vm::Kernel.send(name)
|
||
|
context.add_function( name , function )
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|
||
|
|
||
|
ConditionalExpression.class_eval do
|
||
|
end
|
||
|
|
||
|
AssignmentExpression.class_eval do
|
||
|
end
|
||
|
FunctionExpression.class_eval do
|
||
|
end
|
||
|
end
|