module Delorean class SNode < Treetop::Runtime::SyntaxNode end class Line < SNode def check(context, *a) f.check(context, *a) end def rewrite(context) f.rewrite(context) end end class Parameter < SNode def check(context, *) context.parse_define_param(i.text_value, []) end def rewrite(context) # Adds a parameter to the current node. Parameters are # implemented as functions (just like attrs). The environment # arg (_e) is a Hash. To find a param (aname) in node (cname), # we first check to see if cname.aname has already been computed # in _e. If not, to compute it we check for the value in _e # (i.e. check for aname). Otherwise, we use the default value # if any. aname, cname = i.text_value, context.last_node not_found = defined?(e) ? e.rewrite(context) : "raise UndefinedParamError, 'undefined parameter #{aname}'" < 1 ? "(#{args_str})" : args_str res << ".each_with_object({}){|#{unpack_str}, _h#{hid}| " + "_h#{hid}[#{el.rewrite(context)}]=(#{er.rewrite(context)})}" unpack_vars.each {|vname| context.parse_undef_var(vname)} res.sum end end class HashExpr < SNode def check(context, *) defined?(args) ? args.check(context) : [] end def rewrite(context) return "{}" unless defined?(args) var = "_h#{context.hcount}" "(#{var}={}; " + args.rewrite(context, var) + "; #{var})" end end class KwArgs < SNode def check(context, *) [arg0.check(context), (ifexp.e3.check(context) if defined?(ifexp.e3)), (args_rest.al.check(context) if defined?(args_rest.al) && !args_rest.al.empty?) ].compact.sum end def rewrite(context, var, i=0) arg0_rw = arg0.rewrite(context) if defined?(splat) res = "#{var}.merge!(#{arg0_rw})" else k_rw = defined?(k.i) ? "'#{k.i.text_value}'" : i.to_s res = "#{var}[#{k_rw}]=(#{arg0_rw})" i += 1 unless defined?(k.i) end res += " if (#{ifexp.e3.rewrite(context)})" if defined?(ifexp.e3) res += ";" res += args_rest.al.rewrite(context, var, i) if defined?(args_rest.al) && !args_rest.al.text_value.empty? res end end class HashArgs < SNode def check(context, *) [e0.check(context), (e1.check(context) unless defined?(splat)), (ifexp.e3.check(context) if defined?(ifexp.e3)), (args_rest.al.check(context) if defined?(args_rest.al) && !args_rest.al.empty?), ].compact.sum end def rewrite(context, var) res = if defined?(splat) "#{var}.merge!(#{e0.rewrite(context)})" else "#{var}[#{e0.rewrite(context)}]=(#{e1.rewrite(context)})" end res += " if (#{ifexp.e3.rewrite(context)})" if defined?(ifexp.e3) res += ";" res += args_rest.al.rewrite(context, var) if defined?(args_rest.al) && !args_rest.al.text_value.empty? res end end end