class Sequitur::GrammarVisitor

A visitor class dedicated in the visit of Grammar.

Attributes

grammar[R]

@return [Sequitur::DynamicGrammar] Link to the grammar to visit

subscribers[R]

@return [Object] List of objects that subscribed to the visit event notification.

Public Class Methods

new(aGrammar) click to toggle source

Build a visitor for the given grammar. @param aGrammar [DynamicGrammar] the grammar to visit.

# File lib/sequitur/grammar_visitor.rb, line 14
def initialize(aGrammar)
  @grammar = aGrammar
  @subscribers = []
end

Public Instance Methods

end_visit_grammar(aGrammar) click to toggle source

Visit event. The visitor has completed the visit of the grammar. @param aGrammar [DynamicGrammar] the grammar to visit.

# File lib/sequitur/grammar_visitor.rb, line 86
def end_visit_grammar(aGrammar)
  broadcast(:after_grammar, aGrammar)
end
end_visit_production(aProduction) click to toggle source

Visit event. The visitor has completed its visit of the given production. @param aProduction [Production] the production to visit.

# File lib/sequitur/grammar_visitor.rb, line 80
def end_visit_production(aProduction)
  broadcast(:after_production, aProduction)
end
end_visit_rhs(rhs) click to toggle source

Visit event. The visitor has completed its visit of the given rhs. @param rhs [SymbolSequence] the rhs of a production to visit.

# File lib/sequitur/grammar_visitor.rb, line 74
def end_visit_rhs(rhs)
  broadcast(:after_rhs, rhs)
end
start() click to toggle source

The signal to start the visit.

# File lib/sequitur/grammar_visitor.rb, line 33
def start
  grammar.accept(self)
end
start_visit_grammar(aGrammar) click to toggle source

Visit event. The visitor is about to visit the grammar. @param aGrammar [DynamicGrammar] the grammar to visit.

# File lib/sequitur/grammar_visitor.rb, line 39
def start_visit_grammar(aGrammar)
  broadcast(:before_grammar, aGrammar)
end
start_visit_production(aProduction) click to toggle source

Visit event. The visitor is about to visit the given production. @param aProduction [Sequitur::Production] the production to visit.

# File lib/sequitur/grammar_visitor.rb, line 45
def start_visit_production(aProduction)
  broadcast(:before_production, aProduction)
end
start_visit_rhs(rhs) click to toggle source

Visit event. The visitor is about to visit the given rhs of production. @param rhs [SymbolSequence] the rhs of a production to visit.

# File lib/sequitur/grammar_visitor.rb, line 51
def start_visit_rhs(rhs)
  broadcast(:before_rhs, rhs)
end
subscribe(aSubscriber) click to toggle source

Add a subscriber for the visit event notification. @param aSubscriber [Object]

# File lib/sequitur/grammar_visitor.rb, line 21
def subscribe(aSubscriber)
  subscribers << aSubscriber
end
unsubscribe(aSubscriber) click to toggle source

Remove the given object from the subscription list. The object won’t be notified of visit events. @param aSubscriber [Object]

# File lib/sequitur/grammar_visitor.rb, line 28
def unsubscribe(aSubscriber)
  subscribers.delete_if { |entry| entry == aSubscriber }
end
visit_prod_ref(aProdRef) click to toggle source

Visit event. The visitor is visiting the given reference production (= non-terminal symbol). @param aProdRef [ProductionRef] the production reference to visit.

# 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) click to toggle source

Visit event. The visitor is visiting the given terminal symbol. @param aTerminal [Object] the terminal to visit.

# File lib/sequitur/grammar_visitor.rb, line 67
def visit_terminal(aTerminal)
  broadcast(:before_terminal, aTerminal)
  broadcast(:after_terminal, aTerminal)
end

Private Instance Methods

broadcast(msg, *args) click to toggle source

Send a notification to all subscribers. @param msg [Symbol] event to notify @param args [Array] arguments of the notification.

# File lib/sequitur/grammar_visitor.rb, line 95
def broadcast(msg, *args)
  subscribers.each do |a_subscriber|
    next unless a_subscriber.respond_to?(msg)

    a_subscriber.send(msg, *args)
  end
end