class Nydp::Cond_LEX

Public Class Methods

build(cond, when_true, when_false) click to toggle source
# File lib/nydp/cond.rb, line 107
def self.build cond, when_true, when_false
  tsig       = sig(when_true)
  fsig       = sig(when_false)
  cond_sig = "#{tsig}_#{fsig}"

  if (cond == when_true) && (fsig == "LIT")
    OR_LEX_LIT.new cond, nil, when_false.expression
  elsif (cond == when_true) && (fsig == "LEX")
    OR_LEX_LEX.new cond, nil, when_false
  elsif (cond == when_true)
    OR_LEX_XXX.new cond, nil, when_false
  else
    case cond_sig
    when "LIT_LIT"
      # puts "building Cond_LEX_LIT_LIT #{[cond, when_true.expression, when_false.expression]}"
      Nydp::Cond_LEX_LIT_LIT.new(cond, when_true.expression, when_false.expression)
    when "LEX_LIT"
      Nydp::Cond_LEX_LEX_LIT.new(cond, when_true, when_false.expression)
    when "CND_LIT"
      Nydp::Cond_LEX_CND_LIT.new(cond, when_true, when_false.expression)
    when "NVB_LEX"
      Nydp::Cond_LEX_NVB_LEX.new(cond, when_true, when_false)
    when "NVB_LIT"
      Nydp::Cond_LEX_NVB_LIT.new(cond, when_true, when_false.expression)
    else
      new(cond, when_true, when_false)
    end
  end
end

Public Instance Methods

execute(vm) click to toggle source
# File lib/nydp/cond.rb, line 91
def execute vm
  if @condition.value vm.current_context
    @when_true.execute(vm)
  else
    @when_false.execute(vm)
  end
end
lexical_reach(n) click to toggle source
# File lib/nydp/cond.rb, line 99
def lexical_reach n
  cr = @condition.lexical_reach(n)
  ct = @when_true.lexical_reach(n)
  cf = @when_false.lexical_reach(n)

  [cr, ct, cf].max
end