lib/sequitur/dynamic_grammar.rb in sequitur-0.1.10 vs lib/sequitur/dynamic_grammar.rb in sequitur-0.1.11
- old
+ new
@@ -1,106 +1,106 @@
-require_relative 'production'
-require_relative 'grammar_visitor'
-
-module Sequitur # Module for classes implementing the Sequitur algorithm
-
-# A dynamic grammar is a context-free grammar that can be built incrementally.
-# Formally, a grammar has:
-# One start production
-# Zero or more other productions
-# Each production has a rhs that is a sequence of grammar symbols.
-# Grammar symbols are categorized into
-# -terminal symbols (i.e. String, Ruby Symbol,...)
-# -non-terminal symbols (i.e. ProductionRef)
-class DynamicGrammar
- # Link to the start production.
- attr_reader(:start)
-
- # The set of production rules of the grammar
- attr_reader(:productions)
-
- # nodoc Trace the execution of the algorithm.
- attr(:trace)
-
-
- # Constructor.
- # Build a grammar with one empty rule as start/start rule.
- def initialize()
- @start = Production.new
- @productions = [ start ]
- @trace = false
- end
-
- public
-
- # Emit a text representation of the grammar.
- # Each production rule is emitted per line.
- # @return [String]
- def to_string()
- rule_text = productions.map(&:to_string).join("\n")
- return rule_text
- end
-
-
- # Add a given production to the grammar.
- # @param aProduction [Production]
- def add_production(aProduction)
- # TODO: remove output
- puts "Adding #{aProduction.object_id}" if trace
- puts aProduction.to_string if trace
- productions << aProduction
- end
-
-
- # Remove a production with given index from the grammar
- # @param anIndex [Fixnum]
- # @return [Production] the production removed from the grammar.
- def remove_production(anIndex)
- puts "Before production removal #{productions[anIndex].object_id}" if trace
- puts to_string if trace
- prod = productions.delete_at(anIndex)
- # TODO: remove output
- puts('Removed: ' + prod.to_string) if trace
- prod.clear_rhs
-
- return prod
- end
-
-
- # Add the given token to the grammar.
- # Append the token to the rhs of the start/start rule.
- # @param aToken [Object] input token to add
- def add_token(aToken)
- append_symbol_to(start, aToken)
- end
-
- # Part of the 'visitee' role in the Visitor design pattern.
- # A visitee is expected to accept the visit from a visitor object
- # @param aVisitor [GrammarVisitor] the visitor object
- def accept(aVisitor)
- aVisitor.start_visit_grammar(self)
-
- # Let's proceed with the visit of productions
- productions.each { |prod| prod.accept(aVisitor) }
-
- aVisitor.end_visit_grammar(self)
- end
-
- # Factory method. Returns a visitor for this grammar.
- # @return [GrammarVisitor]
- def visitor()
- return GrammarVisitor.new(self)
- end
-
- protected
-
- # Append a given symbol to the rhs of passed production.
- # @param aProduction [Production]
- # @param aSymbol [Object]
- def append_symbol_to(aProduction, aSymbol)
- aProduction.append_symbol(aSymbol)
- end
-end # class
-
-end # module
-
-# End of file
+require_relative 'production'
+require_relative 'grammar_visitor'
+
+module Sequitur # Module for classes implementing the Sequitur algorithm
+
+# A dynamic grammar is a context-free grammar that can be built incrementally.
+# Formally, a grammar has:
+# One start production
+# Zero or more other productions
+# Each production has a rhs that is a sequence of grammar symbols.
+# Grammar symbols are categorized into
+# -terminal symbols (i.e. String, Ruby Symbol,...)
+# -non-terminal symbols (i.e. ProductionRef)
+class DynamicGrammar
+ # Link to the start production.
+ attr_reader(:start)
+
+ # The set of production rules of the grammar
+ attr_reader(:productions)
+
+ # nodoc Trace the execution of the algorithm.
+ attr(:trace)
+
+
+ # Constructor.
+ # Build a grammar with one empty rule as start/start rule.
+ def initialize()
+ @start = Production.new
+ @productions = [ start ]
+ @trace = false
+ end
+
+ public
+
+ # Emit a text representation of the grammar.
+ # Each production rule is emitted per line.
+ # @return [String]
+ def to_string()
+ rule_text = productions.map(&:to_string).join("\n")
+ return rule_text
+ end
+
+
+ # Add a given production to the grammar.
+ # @param aProduction [Production]
+ def add_production(aProduction)
+ # TODO: remove output
+ puts "Adding #{aProduction.object_id}" if trace
+ puts aProduction.to_string if trace
+ productions << aProduction
+ end
+
+
+ # Remove a production with given index from the grammar
+ # @param anIndex [Fixnum]
+ # @return [Production] the production removed from the grammar.
+ def remove_production(anIndex)
+ puts "Before production removal #{productions[anIndex].object_id}" if trace
+ puts to_string if trace
+ prod = productions.delete_at(anIndex)
+ # TODO: remove output
+ puts('Removed: ' + prod.to_string) if trace
+ prod.clear_rhs
+
+ return prod
+ end
+
+
+ # Add the given token to the grammar.
+ # Append the token to the rhs of the start/start rule.
+ # @param aToken [Object] input token to add
+ def add_token(aToken)
+ append_symbol_to(start, aToken)
+ end
+
+ # Part of the 'visitee' role in the Visitor design pattern.
+ # A visitee is expected to accept the visit from a visitor object
+ # @param aVisitor [GrammarVisitor] the visitor object
+ def accept(aVisitor)
+ aVisitor.start_visit_grammar(self)
+
+ # Let's proceed with the visit of productions
+ productions.each { |prod| prod.accept(aVisitor) }
+
+ aVisitor.end_visit_grammar(self)
+ end
+
+ # Factory method. Returns a visitor for this grammar.
+ # @return [GrammarVisitor]
+ def visitor()
+ return GrammarVisitor.new(self)
+ end
+
+ protected
+
+ # Append a given symbol to the rhs of passed production.
+ # @param aProduction [Production]
+ # @param aSymbol [Object]
+ def append_symbol_to(aProduction, aSymbol)
+ aProduction.append_symbol(aSymbol)
+ end
+end # class
+
+end # module
+
+# End of file