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