Class: ParseTreeVisitor
- Inherits:
-
Object
- Object
- ParseTreeVisitor
- Defined in:
- lib/dendroid/parsing/parse_tree_visitor.rb
Instance Attribute Summary collapse
-
#root ⇒ Object
readonly
Link to the result root node of the tree (forest).
-
#subscribers ⇒ Object
readonly
List of objects that subscribed to the visit event notification.
-
#traversal ⇒ Object
readonly
Indicates the kind of tree traversal to perform: :post_order, :pre-order.
Instance Method Summary collapse
-
#end_visit_nonterminal(aNonTerminalNode) ⇒ Object
Visit event.
-
#end_visit_root(aParseTree) ⇒ Object
Visit event.
-
#initialize(aParseTree, aTraversalStrategy = :post_order) ⇒ ParseTreeVisitor
constructor
Build a visitor for the given root.
-
#start ⇒ Object
The signal to begin the visit of the parse tree.
-
#start_visit_root(aParseTree) ⇒ Object
Visit event.
-
#subscribe(aSubscriber) ⇒ Object
Add a subscriber for the visit event notifications.
-
#unsubscribe(aSubscriber) ⇒ Object
Remove the given object from the subscription list.
-
#visit_and_node(aNonTerminalNode) ⇒ Object
Visit event.
-
#visit_empty_rule_node(anEmptyRuleNode) ⇒ Object
Visit event.
-
#visit_or_node(aNonTerminalNode) ⇒ Object
Visit event.
-
#visit_terminal(aTerminalNode) ⇒ Object
Visit event.
Constructor Details
#initialize(aParseTree, aTraversalStrategy = :post_order) ⇒ ParseTreeVisitor
Build a visitor for the given root.
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
#root ⇒ Object (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 |
#subscribers ⇒ Object (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 |
#traversal ⇒ Object (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.
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.
98 99 100 |
# File 'lib/dendroid/parsing/parse_tree_visitor.rb', line 98 def end_visit_root(aParseTree) broadcast(:after_root, aParseTree) end |
#start ⇒ Object
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.
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.
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.
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.
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.
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.
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.
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 |