class Kaguya::Compiler
Public Class Methods
new(ast)
click to toggle source
@param [AST::Node] ast
# File lib/kaguya/compiler.rb, line 6 def initialize(ast) @ast = ast end
Public Instance Methods
compile()
click to toggle source
@return [Array]
# File lib/kaguya/compiler.rb, line 11 def compile iseq = @ast.accept(self) iseq << [:leave, nil] iseq end
visit(node)
click to toggle source
@param [AST::Node] node @return [Array]
# File lib/kaguya/compiler.rb, line 19 def visit(node) iseq = [] case node.type when :forward iseq << [:forward, nil] when :backward iseq << [:backward, nil] when :increment iseq << [:increment, nil] when :decrement iseq << [:decrement, nil] when :output iseq << [:output, nil] when :input iseq << [:input, nil] when :while sub_iseq = [] node.children.each do |child| sub_iseq.concat(child.accept(self)) end iseq << [:branch_ifzero, sub_iseq.size + 2] iseq.concat(sub_iseq) iseq << [:branch_unlesszero, -sub_iseq.size] when :root node.children.each do |child| iseq.concat(child.accept(self)) end else raise 'Invalid node!' end iseq end