lib/delorean/engine.rb in delorean_lang-0.1.7 vs lib/delorean/engine.rb in delorean_lang-0.2.0

- old
+ new

@@ -3,16 +3,17 @@ require 'set' require 'pp' module Delorean class Engine - attr_reader :last_node, :module_name, :version, - :line_no, :comp_set, :pm, :m, :imports + attr_reader :last_node, :module_name, :line_no, + :comp_set, :pm, :m, :imports, :sset - def initialize(module_name, version=nil) + def initialize(module_name, sset=nil) # name of current module - @module_name, @version = module_name, version + @module_name = module_name + @sset = sset reset end def reset @m, @pm = nil, nil @@ -30,34 +31,34 @@ def curr_line @multi_no || @line_no end - def parse_import(sset, name, version) + def parse_import(name) err(ParseError, "No script set") unless sset err(ParseError, "Module #{name} importing itself") if name == module_name begin - @imports[name] = [sset.import(name, version), version] + @imports[name] = sset.get_engine(name) rescue => exc err(ImportError, exc.to_s) end - @pm.const_set("#{MOD}#{name}", @imports[name][0].pm) + @pm.const_set("#{MOD}#{name}", @imports[name].pm) end - def gen_import(name, version) - @imports.merge!(@imports[name][0].imports) + def gen_import(name) + @imports.merge!(@imports[name].imports) - @m.const_set("#{MOD}#{name}", @imports[name][0].m) + @m.const_set("#{MOD}#{name}", @imports[name].m) end def get_import_engine(name) err(ParseError, "#{name} not imported") unless @imports[name] - @imports[name][0] + @imports[name] end def is_node_defined(name) @pm.constants.member? name.to_sym end @@ -210,12 +211,12 @@ def parser @@parser ||= DeloreanParser.new end - def generate(t, sset=nil) - t.check(self, sset) + def generate(t) + t.check(self) begin # generate ruby code gen = t.rewrite(self) rescue RuntimeError => exc @@ -231,11 +232,11 @@ # bad ruby code generated, shoudn't happen err(ParseError, "codegen error: " + exc.message) end end - def parse(source, sset=nil) + def parse(source) raise "can't call parse again without reset" if @pm # @m module is used at runtime for code evaluation. @pm module # is only used during parsing to check for errors. @m, @pm = BaseModule.clone, Module.new @@ -261,11 +262,11 @@ multi_line += line t = parser.parse(multi_line) if t multi_line, @multi_no = nil, nil - generate(t, sset) + generate(t) end else t = parser.parse(line) @@ -273,11 +274,11 @@ err(ParseError, "syntax error") unless line =~ /^\s+/ multi_line = line @multi_no = @line_no else - generate(t, sset) + generate(t) end end end # left over multi_line @@ -293,12 +294,11 @@ SortedSet[* @node_attrs.keys] end # enumerate qualified list of all attrs def enumerate_attrs - @node_attrs.keys.inject({}) { |h, node| + @node_attrs.keys.each_with_object({}) { |node, h| h[node] = enumerate_attrs_by_node(node) - h } end # enumerate qualified list of attrs by node def enumerate_attrs_by_node(node)