Class: ParseTreeVisitor

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Build a visitor for the given root.

Parameters:

  • aParseTree (ParseTree)

    the parse tree to visit.

Raises:

  • (StandardError)


15
16
17
18
19
20
21
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 15

def initialize(aParseTree, aTraversalStrategy = :post_order)
  raise StandardError if aParseTree.nil?

  @root = aParseTree
  @subscribers = []
  @traversal = aTraversalStrategy
end

Instance Attribute Details

#rootObject (readonly)

Link to the result root node of the tree (forest)



5
6
7
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 5

def root
  @root
end

#subscribersObject (readonly)

List of objects that subscribed to the visit event notification.



8
9
10
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 8

def subscribers
  @subscribers
end

#traversalObject (readonly)

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



11
12
13
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 11

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.



92
93
94
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 92

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

#end_visit_root(aParseTree) ⇒ Object

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

Parameters:

  • aParseTree (ParseTree)

    the root to visit.



98
99
100
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 98

def end_visit_root(aParseTree)
  broadcast(:after_root, aParseTree)
end

#startObject

The signal to begin the visit of the parse tree.



37
38
39
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 37

def start
  root.accept(self)
end

#start_visit_root(aParseTree) ⇒ Object

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

Parameters:

  • aParseTree (ParseTree)

    the root to visit.



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

def start_visit_root(aParseTree)
  broadcast(:before_root, aParseTree)
end

#subscribe(aSubscriber) ⇒ Object

Add a subscriber for the visit event notifications.

Parameters:

  • aSubscriber (Object)


25
26
27
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 25

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)


32
33
34
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 32

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

#visit_and_node(aNonTerminalNode) ⇒ Object

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

Parameters:

  • aNonTerminalNode (AndNode)

    the node to visit.



49
50
51
52
53
54
55
56
57
58
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 49

def visit_and_node(aNonTerminalNode)
  if @traversal == :post_order
    broadcast(:before_and_node, aNonTerminalNode)
    traverse_subnodes(aNonTerminalNode)
  else
    traverse_subnodes(aNonTerminalNode)
    broadcast(:before_and_node, aNonTerminalNode)
  end
  broadcast(:after_and_node, aNonTerminalNode)
end

#visit_empty_rule_node(anEmptyRuleNode) ⇒ Object

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

Parameters:

  • anEmptyRuleNode (EmptyRuleNode)

    the node to visit.



76
77
78
79
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 76

def visit_empty_rule_node(anEmptyRuleNode)
  broadcast(:before_empty_rule_node, anEmptyRuleNode)
  broadcast(:after_empty_rule_node, anEmptyRuleNode)
end

#visit_or_node(aNonTerminalNode) ⇒ Object

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

Parameters:

  • aNonTerminalNode (OrNode)

    the node to visit.



62
63
64
65
66
67
68
69
70
71
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 62

def visit_or_node(aNonTerminalNode)
  if @traversal == :post_order
    broadcast(:before_or_node, aNonTerminalNode)
    traverse_subnodes(aNonTerminalNode)
  else
    traverse_subnodes(aNonTerminalNode)
    broadcast(:before_or_node, aNonTerminalNode)
  end
  broadcast(:after_or_node, aNonTerminalNode)
end

#visit_terminal(aTerminalNode) ⇒ Object

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

Parameters:

  • aTerminalNode (TerminalNode)

    the terminal to visit.



84
85
86
87
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 84

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