class SMF::MMLEvaluator

Public Class Methods

new(de) click to toggle source
# File lib/smf/toy/macro/mml/parser.rb, line 469
def initialize(de) @de = de end

Public Instance Methods

evaluate(st) click to toggle source
# File lib/smf/toy/macro/mml/parser.rb, line 471
def evaluate(st)
  case st[0]
  when :list
    @de.push
    st[1].each do |st2|
      evaluate(st2)
    end
    of = @de[:of]
    @de.pop
    @de[:of] = of
    @de.snap
  when :stmt
    of = @de[:of]
    evaluate(st[1])
    if st[2]
      @de[:of] = of
    end
  when :step
    @de[:le] = evaluate(st[1])
  when :add
    return evaluate(st[1]) + evaluate(st[2])
  when :sub
    return evaluate(st[1]) - evaluate(st[2])
  when :mul
    return evaluate(st[1]) * evaluate(st[2])
  when :div
    return evaluate(st[1]) / evaluate(st[2])
  when :negate
    return - evaluate(st[1])
  when :imm
    return st[1]
  when :note
    @de[:_no] = st[1]
    @de.snap
    @de[:_no] = nil
    @de[:of] += @de[:le]
  when :text
    @de[:_tx] = st[1]
    @de.snap
    @de[:_tx] = nil
  when :asgn
    va = st[1]
    op = st[2]
    ob = evaluate(st[3])
    if st[4]
      ob2 = evaluate(st[4])
      ob = [ob, ob2]
    end
    va = va.intern
    v = @de[va]
    case op
    when ?+; v += ob
    when ?-; v -= ob
    when ?*; v *= ob
    when ?/; v /= ob
    when ?=; v  = ob
    end
    if va == :ke
      @de[:_ke] = v
      @de.snap
      @de[:_ke] = nil
    end
    @de[va] = v
    @de.snap
  end
end