Class: Rley::ParseTreeVisitor

Inherits:
Object
  • Object
show all
Defined in:
lib/rley/parse_tree_visitor.rb

Overview

A visitor class dedicated in the visit of a parse tree. It combines the Visitor and Observer patterns.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(aParseTree, aTraversalStrategy = :post_order) ⇒ ParseTreeVisitor

Build a visitor for the given ptree.

Parameters:

  • aParseTree (ParseTree)

    the parse tree to visit.



16
17
18
19
20
# File 'lib/rley/parse_tree_visitor.rb', line 16

def initialize(aParseTree, aTraversalStrategy = :post_order)
  @ptree = aParseTree
  @subscribers = []
  @traversal = aTraversalStrategy
end

Instance Attribute Details

#ptreeObject (readonly)

Link to the parse tree to visit



6
7
8
# File 'lib/rley/parse_tree_visitor.rb', line 6

def ptree
  @ptree
end

#subscribersObject (readonly)

List of objects that subscribed to the visit event notification.



9
10
11
# File 'lib/rley/parse_tree_visitor.rb', line 9

def subscribers
  @subscribers
end

#traversalObject (readonly)

Indicates the kind of tree traversal to perform: :post_order, :pre-order



12
13
14
# File 'lib/rley/parse_tree_visitor.rb', line 12

def traversal
  @traversal
end

Instance Method Details

#end_visit_nonterminal(aNonTerminalNode) ⇒ Object

Visit event. The visitor has completed its visit of the given non-terminal node.

Parameters:

  • aNonTerminalNode (NonTerminalNode)

    the node to visit.



73
74
75
# File 'lib/rley/parse_tree_visitor.rb', line 73

def end_visit_nonterminal(aNonTerminalNode)
  broadcast(:after_non_terminal, aNonTerminalNode)
end

#end_visit_ptree(aParseTree) ⇒ Object

Visit event. The visitor has completed the visit of the ptree.

Parameters:

  • aParseTree (ParseTree)

    the ptree to visit.



79
80
81
# File 'lib/rley/parse_tree_visitor.rb', line 79

def end_visit_ptree(aParseTree)
  broadcast(:after_ptree, aParseTree)
end

#startObject

The signal to begin the visit of the parse tree.



36
37
38
# File 'lib/rley/parse_tree_visitor.rb', line 36

def start()
  ptree.accept(self)
end

#start_visit_ptree(aParseTree) ⇒ Object

Visit event. The visitor is about to visit the ptree.

Parameters:

  • aParseTree (ParseTree)

    the ptree to visit.



43
44
45
# File 'lib/rley/parse_tree_visitor.rb', line 43

def start_visit_ptree(aParseTree)
  broadcast(:before_ptree, aParseTree)
end

#subscribe(aSubscriber) ⇒ Object

Add a subscriber for the visit event notifications.

Parameters:

  • aSubscriber (Object)


24
25
26
# File 'lib/rley/parse_tree_visitor.rb', line 24

def subscribe(aSubscriber)
  subscribers << aSubscriber
end

#unsubscribe(aSubscriber) ⇒ Object

Remove the given object from the subscription list. The object won't be notified of visit events.

Parameters:

  • aSubscriber (Object)


31
32
33
# File 'lib/rley/parse_tree_visitor.rb', line 31

def unsubscribe(aSubscriber)
  subscribers.delete_if { |entry| entry == aSubscriber }
end

#visit_nonterminal(aNonTerminalNode) ⇒ Object

Visit event. The visitor is about to visit the given non terminal node.

Parameters:

  • aNonTerminalNode (NonTerminalNode)

    the node to visit.



50
51
52
53
54
55
56
57
58
59
# File 'lib/rley/parse_tree_visitor.rb', line 50

def visit_nonterminal(aNonTerminalNode)
  if @traversal == :post_order
    broadcast(:before_non_terminal, aNonTerminalNode)
    traverse_subnodes(aNonTerminalNode)
  else
    traverse_subnodes(aNonTerminalNode)
    broadcast(:before_non_terminal, aNonTerminalNode)
  end
  broadcast(:after_non_terminal, aNonTerminalNode)
end

#visit_terminal(aTerminalNode) ⇒ Object

Visit event. The visitor is visiting the given terminal node.

Parameters:

  • aTerminalNode (TerminalNode)

    the terminal to visit.



64
65
66
67
# File 'lib/rley/parse_tree_visitor.rb', line 64

def visit_terminal(aTerminalNode)
  broadcast(:before_terminal, aTerminalNode)
  broadcast(:after_terminal, aTerminalNode)
end