module Emfrp::NewNodeConvert

Public Instance Methods

parse_module(mod_name, newnode, file_loader) click to toggle source
# File lib/emfrp/parser/newnode_convert.rb, line 5
def parse_module(mod_name, newnode, file_loader)
  src_str, file_name = file_loader.load(newnode[:module_path].map{|x| x[:desc]})
  top = Parser.parse_src(src_str, file_name, file_loader)
  uniq_key = "#{mod_name}(#{newnode[:names].map{|x| x[:desc]}.join(",")})"
  rename_nodes(top, uniq_key)
  top[:inputs].zip(newnode[:args]).each do |input, arg_exp|
    input[:name][:desc] << "##{uniq_key}"
    top[:nodes] << NodeDef.new(
      :name => input[:name],
      :init_exp => input[:init_exp],
      :params => nil,
      :type => nil,
      :exp => arg_exp,
    )
  end
  top[:inputs] = []
  top[:outputs].zip(newnode[:names]).each do |output, newnode_name|
    output[:name][:desc] << "##{uniq_key}"
    top[:nodes] << NodeDef.new(
      :name => newnode_name,
      :init_exp => nil,
      :params => nil,
      :type => nil,
      :exp => VarRef.new(:name => output[:name])
    )
  end
  top[:outputs] = []
  return top
end
rename_node_exp(exp, datas, white_list, uniq_key, local_vars) click to toggle source
# File lib/emfrp/parser/newnode_convert.rb, line 51
def rename_node_exp(exp, datas, white_list, uniq_key, local_vars)
  case exp
  when VarRef
    name = exp[:name][:desc]
    if !local_vars[name] && (white_list[name] || !datas[name])
      if name =~ /^(.*)@last$/
        exp[:name][:desc] = "#{$1}##{uniq_key}@last"
      else
        exp[:name][:desc] << "##{uniq_key}"
      end
    end
  when Case
    vs = Hash[exp[:pattern].find_refs.map{|x| [x[:desc], true]}]
    rename_node_exp(exp[:exp], datas, white_list, uniq_key, local_vars.merge(vs))
  when Syntax
    rename_node_exp(exp.values, datas, white_list, uniq_key, local_vars)
  when Array
    exp.each{|e| rename_node_exp(e, datas, white_list, uniq_key, local_vars)}
  end
end
rename_nodes(top, uniq_key) click to toggle source
# File lib/emfrp/parser/newnode_convert.rb, line 35
def rename_nodes(top, uniq_key)
  datas = Hash[top[:datas].map{|x| [x[:name][:desc], true]}]
  top[:nodes].each do |n|
    white_list = {}
    n[:name][:desc] << "##{uniq_key}"
    if n[:params]
      n[:params].each do |pn|
        white_list[pn[:as][:desc].clone] = true
        pn[:name][:desc] << "##{uniq_key}"
        pn[:as][:desc] << "##{uniq_key}"
      end
    end
    rename_node_exp(n[:exp], datas, white_list, uniq_key, {})
  end
end