end
end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#BuiltinSyms = {}
-#
-#class Symtable
-# def initialize
-# @builtins = BuiltinSyms
-# @scopes = [{}]
-# end
-#
-# def []=(k,v)
-# @scopes.last[k] = v
-# end
-#
-# def [](k)
-# (@scopes.map{|h| h[k] }.compact.last || BuiltinSyms[k])
-# end
-#
-# def scope_start
-# @scopes.push({})
-# end
-#
-# def scope_stop
-# @scopes.pop()
-# end
-#end
-#
-#class CodeGenerator
-# def initialize(defs, exprs)
-# @syms = Symtable.new
-# @funcs = { toplevel: { freevars: [], code: StringIO.new } }
-# @protos = StringIO.new
-# @protos.puts "Value #{defs.keys.join(", ")};"
-# exprs.each {|e| emit(e) }
-# end
-#
-# def mkvar()
-# @id = 0 if @id.nil?
-# @id++
-# "_tmp#{@id}"
-# end
-#
-# def emitop(op, left, right = nil)
-# @body << [mkvar, op, left, right]
-# @body.last
-# end
-#
-# def func_start(name, args = [])
-# args.each {|a| @syms[a] = :arg }
-# @syms[name] = :func
-# @syms.scope_start
-# @funcs[name.to_sym] = { freevars: [], code: StringIO.new }
-# end
-#
-# def func_stop()
-# @syms.scope_stop
-# end
-#
-# def dump
-# #pp @syms
-# puts @protos.string
-# end
-#
-# def emit(e)
-# if e.is_a? Parser::Val
-# emit_val(e)
-# elsif e.is_a? Parser::Def
-# puts "Def"
-# elsif e.is_a? Parser::Call
-# puts "Call"
-# elsif e.is_a? Parser::IfExpr
-# puts "IfExpr"
-# elsif e.is_a? Parser::Func
-# puts "Func"
-# end
-# end
-#
-# def emit_val(e)
-# case e.type
-# when :nil
-# puts "NULL"
-# when :bool
-# puts e.value
-# when :num
-# puts e.value
-# when :string
-# puts e.value
-# end
-# end
-#end
-
parse = Parser.new("dyn.src")
block = Parser.new("dyn.src").toplevel
-
-pp block
-
+TypeChecker.infer({}, block)