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