class Dentaku::PrintVisitor

Public Class Methods

new(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 3
def initialize(node)
  @output = ''
  node.accept(self)
end

Public Instance Methods

should_output?(node, precedence, output_on_equal) click to toggle source
# File lib/dentaku/print_visitor.rb, line 28
def should_output?(node, precedence, output_on_equal)
  return false unless node.is_a?(Dentaku::AST::Operation)

  target_precedence = node.class.precedence
  target_precedence < precedence || (output_on_equal && target_precedence == precedence)
end
to_s() click to toggle source
# File lib/dentaku/print_visitor.rb, line 108
def to_s
  @output
end
visit_access(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 85
def visit_access(node)
  node.structure.accept(self)
  @output << "["
  node.index.accept(self)
  @output << "]"
end
visit_array(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 104
def visit_array(node)
  @output << node.value.to_s
end
visit_case(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 46
def visit_case(node)
  @output << "CASE "
  node.switch.accept(self)
  node.conditions.each { |c| c.accept(self) }
  node.else && node.else.accept(self)
  @output << " END"
end
visit_case_conditional(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 58
def visit_case_conditional(node)
  node.when.accept(self)
  node.then.accept(self)
end
visit_else(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 73
def visit_else(node)
  @output << " ELSE "
  node.node.accept(self)
end
visit_function(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 35
def visit_function(node)
  @output << node.name
  @output << "("
  arg_count = node.args.length
  node.args.each_with_index do |a, index|
    a.accept(self)
    @output << ", " unless index >= arg_count - 1
  end
  @output << ")"
end
visit_identifier(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 96
def visit_identifier(node)
  @output << node.identifier
end
visit_literal(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 92
def visit_literal(node)
  @output << node.quoted
end
visit_negation(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 78
def visit_negation(node)
  @output << "-"
  @output << "(" unless node.node.is_a? Dentaku::AST::Literal
  node.node.accept(self)
  @output << ")" unless node.node.is_a? Dentaku::AST::Literal
end
visit_nil(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 100
def visit_nil(node)
  @output << "NULL"
end
visit_operand(node, precedence, prefix: "", suffix: "", dir: :none) click to toggle source
# File lib/dentaku/print_visitor.rb, line 20
def visit_operand(node, precedence, prefix: "", suffix: "", dir: :none)
  @output << prefix
  @output << "(" if should_output?(node, precedence, dir == :right)
  node.accept(self)
  @output << ")" if should_output?(node, precedence, dir == :right)
  @output << suffix
end
visit_operation(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 8
def visit_operation(node)
  if node.left
    visit_operand(node.left, node.class.precedence, suffix: " ", dir: :left)
  end

  @output << node.display_operator

  if node.right
    visit_operand(node.right, node.class.precedence, prefix: " ", dir: :right)
  end
end
visit_switch(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 54
def visit_switch(node)
  node.node.accept(self)
end
visit_then(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 68
def visit_then(node)
  @output << " THEN "
  node.node.accept(self)
end
visit_when(node) click to toggle source
# File lib/dentaku/print_visitor.rb, line 63
def visit_when(node)
  @output << " WHEN "
  node.node.accept(self)
end