Class: Sequitur::GrammarVisitor
- Inherits:
-
Object
- Object
- Sequitur::GrammarVisitor
- Defined in:
- lib/sequitur/grammar_visitor.rb
Overview
A visitor class dedicated in the visit of Grammar.
Instance Attribute Summary collapse
-
#grammar ⇒ Object
readonly
Link to the grammar to visit.
-
#subscribers ⇒ Object
readonly
List of objects that subscribed to the visit event notification.
Instance Method Summary collapse
-
#end_visit_grammar(aGrammar) ⇒ Object
Visit event.
-
#end_visit_production(aProduction) ⇒ Object
Visit event.
-
#initialize(aGrammar) ⇒ GrammarVisitor
constructor
Build a visitor for the given grammar.
-
#start ⇒ Object
The signal to start the visit.
-
#start_visit_grammar(aGrammar) ⇒ Object
Visit event.
-
#start_visit_production(aProduction) ⇒ Object
Visit event.
-
#subscribe(aSubscriber) ⇒ Object
Add a subscriber for the visit event notification.
-
#unsubscribe(aSubscriber) ⇒ Object
Remove the given object from the subscription list.
-
#visit_prod_ref(aProdRef) ⇒ Object
Visit event.
-
#visit_terminal(aTerminal) ⇒ Object
Visit event.
Constructor Details
#initialize(aGrammar) ⇒ GrammarVisitor
Build a visitor for the given grammar.
13 14 15 16 |
# File 'lib/sequitur/grammar_visitor.rb', line 13 def initialize(aGrammar) @grammar = aGrammar @subscribers = [] end |
Instance Attribute Details
#grammar ⇒ Object (readonly)
Link to the grammar to visit
6 7 8 |
# File 'lib/sequitur/grammar_visitor.rb', line 6 def grammar @grammar end |
#subscribers ⇒ Object (readonly)
List of objects that subscribed to the visit event notification.
9 10 11 |
# File 'lib/sequitur/grammar_visitor.rb', line 9 def subscribers @subscribers end |
Instance Method Details
#end_visit_grammar(aGrammar) ⇒ Object
Visit event. The visitor has completed the visit of the grammar.
80 81 82 |
# File 'lib/sequitur/grammar_visitor.rb', line 80 def end_visit_grammar(aGrammar) broadcast(:after_grammar, aGrammar) end |
#end_visit_production(aProduction) ⇒ Object
Visit event. The visitor has completed its visit of the given production.
72 73 74 75 76 |
# File 'lib/sequitur/grammar_visitor.rb', line 72 def end_visit_production(aProduction) broadcast(:after_rhs, aProduction.rhs) broadcast(:after_production, aProduction) end |
#start ⇒ Object
The signal to start the visit.
34 35 36 |
# File 'lib/sequitur/grammar_visitor.rb', line 34 def start() grammar.accept(self) end |
#start_visit_grammar(aGrammar) ⇒ Object
Visit event. The visitor is about to visit the grammar.
41 42 43 |
# File 'lib/sequitur/grammar_visitor.rb', line 41 def start_visit_grammar(aGrammar) broadcast(:before_grammar, aGrammar) end |
#start_visit_production(aProduction) ⇒ Object
Visit event. The visitor is about to visit the given production.
48 49 50 51 |
# File 'lib/sequitur/grammar_visitor.rb', line 48 def start_visit_production(aProduction) broadcast(:before_production, aProduction) broadcast(:before_rhs, aProduction.rhs) end |
#subscribe(aSubscriber) ⇒ Object
Add a subscriber for the visit event notification.
22 23 24 |
# File 'lib/sequitur/grammar_visitor.rb', line 22 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.
29 30 31 |
# File 'lib/sequitur/grammar_visitor.rb', line 29 def unsubscribe(aSubscriber) subscribers.delete_if { |entry| entry == aSubscriber } end |
#visit_prod_ref(aProdRef) ⇒ Object
Visit event. The visitor is visiting the given reference production (= non-terminal symbol).
56 57 58 59 60 |
# File 'lib/sequitur/grammar_visitor.rb', line 56 def visit_prod_ref(aProdRef) production = aProdRef.production broadcast(:before_non_terminal, production) broadcast(:after_non_terminal, production) end |
#visit_terminal(aTerminal) ⇒ Object
Visit event. The visitor is visiting the given terminal symbol.
65 66 67 68 |
# File 'lib/sequitur/grammar_visitor.rb', line 65 def visit_terminal(aTerminal) broadcast(:before_terminal, aTerminal) broadcast(:after_terminal, aTerminal) end |