Class: Sequitur::GrammarVisitor

Inherits:
Object
  • Object
show all
Defined in:
lib/sequitur/grammar_visitor.rb

Overview

A visitor class dedicated in the visit of Grammar.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(aGrammar) ⇒ GrammarVisitor

Build a visitor for the given grammar.

Parameters:



14
15
16
17
# File 'lib/sequitur/grammar_visitor.rb', line 14

def initialize(aGrammar)
  @grammar = aGrammar
  @subscribers = []
end

Instance Attribute Details

#grammarObject (readonly)

Link to the grammar to visit



7
8
9
# File 'lib/sequitur/grammar_visitor.rb', line 7

def grammar
  @grammar
end

#subscribersObject (readonly)

List of objects that subscribed to the visit event notification.



10
11
12
# File 'lib/sequitur/grammar_visitor.rb', line 10

def subscribers
  @subscribers
end

Instance Method Details

#end_visit_grammar(aGrammar) ⇒ Object

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

Parameters:



86
87
88
# File 'lib/sequitur/grammar_visitor.rb', line 86

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.

Parameters:

  • aProduction (Production)

    the production to visit.



80
81
82
# File 'lib/sequitur/grammar_visitor.rb', line 80

def end_visit_production(aProduction)
  broadcast(:after_production, aProduction)
end

#end_visit_rhs(rhs) ⇒ Object

Visit event. The visitor has completed its visit of the given rhs.

Parameters:



74
75
76
# File 'lib/sequitur/grammar_visitor.rb', line 74

def end_visit_rhs(rhs)
  broadcast(:after_rhs, rhs)
end

#startObject

The signal to start the visit.



33
34
35
# File 'lib/sequitur/grammar_visitor.rb', line 33

def start
  grammar.accept(self)
end

#start_visit_grammar(aGrammar) ⇒ Object

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

Parameters:



39
40
41
# File 'lib/sequitur/grammar_visitor.rb', line 39

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.

Parameters:

  • aProduction (Production)

    the production to visit.



45
46
47
# File 'lib/sequitur/grammar_visitor.rb', line 45

def start_visit_production(aProduction)
  broadcast(:before_production, aProduction)
end

#start_visit_rhs(rhs) ⇒ Object

Visit event. The visitor is about to visit the given rhs of production.

Parameters:



51
52
53
# File 'lib/sequitur/grammar_visitor.rb', line 51

def start_visit_rhs(rhs)
  broadcast(:before_rhs, rhs)
end

#subscribe(aSubscriber) ⇒ Object

Add a subscriber for the visit event notification.

Parameters:

  • aSubscriber (Object)


21
22
23
# File 'lib/sequitur/grammar_visitor.rb', line 21

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)


28
29
30
# File 'lib/sequitur/grammar_visitor.rb', line 28

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).

Parameters:

  • aProdRef (ProductionRef)

    the production reference to visit.



58
59
60
61
62
# File 'lib/sequitur/grammar_visitor.rb', line 58

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.

Parameters:

  • aTerminal (Object)

    the terminal to visit.



67
68
69
70
# File 'lib/sequitur/grammar_visitor.rb', line 67

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