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