rley 0.3.11 → 0.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +3 -0
 - data/examples/data_formats/JSON/{demo_json.rb → JSON_demo.rb} +0 -0
 - data/examples/data_formats/JSON/JSON_parser.rb +0 -1
 - data/examples/general/calc/calc_demo.rb +31 -0
 - data/examples/general/calc/calc_grammar.rb +28 -0
 - data/examples/general/calc/calc_lexer.rb +93 -0
 - data/examples/general/calc/calc_parser.rb +24 -0
 - data/lib/rley/constants.rb +1 -1
 - data/lib/rley/syntax/grammar.rb +6 -7
 - data/lib/rley/syntax/grammar_builder.rb +6 -8
 - data/spec/rley/parser/gfg_earley_parser_spec.rb +25 -22
 - data/spec/rley/parser/groucho_spec.rb +11 -10
 - data/spec/rley/parser/parse_forest_builder_spec.rb +10 -9
 - data/spec/rley/parser/parse_forest_factory_spec.rb +10 -9
 - data/spec/rley/support/ambiguous_grammar_helper.rb +6 -5
 - data/spec/rley/support/grammar_abc_helper.rb +6 -5
 - data/spec/rley/support/grammar_ambig01_helper.rb +8 -7
 - data/spec/rley/support/grammar_b_expr_helper.rb +9 -8
 - data/spec/rley/support/grammar_l0_helper.rb +15 -14
 - data/spec/rley/support/grammar_sppf_helper.rb +10 -9
 - metadata +7 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 3cb8a4bdff7b8a62407ea9b05f6efc807a62bcbf
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 498be3de6c49c8b6800d5f64eb2e1237f845b405
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: e8ca57661728076d51e311c936698bfe603962de9041c02a686bb7cce360ad21f992437e7f3f460b7792b78c1fe30106cd955b3dbe5ecebdd8973112dc2375df
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 984d7e2dc9f42831657f3a30d58c5e4145cc9383df894f3234dabd09c34138bdfa3bde3aa956f1b14dc8cce97dc90eaa11c85074fca21befd9a038cac95e3218
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    
| 
         
            File without changes
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative 'calc_parser'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # Create a calculator parser object
         
     | 
| 
      
 4 
     | 
    
         
            +
            parser = CalcParser.new
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            # Parse the input expression in command-line
         
     | 
| 
      
 7 
     | 
    
         
            +
            if ARGV.empty?
         
     | 
| 
      
 8 
     | 
    
         
            +
              msg = <<-END_MSG
         
     | 
| 
      
 9 
     | 
    
         
            +
            Command-line symtax:
         
     | 
| 
      
 10 
     | 
    
         
            +
              ruby #{__FILE__} "arithmetic expression"
         
     | 
| 
      
 11 
     | 
    
         
            +
              where:
         
     | 
| 
      
 12 
     | 
    
         
            +
                the arithmetic expression is enclosed between double quotes (")
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              Example:
         
     | 
| 
      
 15 
     | 
    
         
            +
              ruby #{__FILE__} "2 * 3 + (4 - 1)"
         
     | 
| 
      
 16 
     | 
    
         
            +
            END_MSG
         
     | 
| 
      
 17 
     | 
    
         
            +
              puts msg
         
     | 
| 
      
 18 
     | 
    
         
            +
              exit(1)
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
      
 20 
     | 
    
         
            +
            puts ARGV[0]
         
     | 
| 
      
 21 
     | 
    
         
            +
            result = parser.parse_expression(ARGV[0])
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            unless result.success?
         
     | 
| 
      
 24 
     | 
    
         
            +
              # Stop if the parse failed...
         
     | 
| 
      
 25 
     | 
    
         
            +
              puts "Parsing of '#{file_name}' failed"
         
     | 
| 
      
 26 
     | 
    
         
            +
              exit(1)
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            # Generate a parse forest from the parse result
         
     | 
| 
      
 30 
     | 
    
         
            +
            pforest = result.parse_forest
         
     | 
| 
      
 31 
     | 
    
         
            +
            # End of file
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Grammar for simple arithmetical expressions
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rley'  # Load the gem
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            ########################################
         
     | 
| 
      
 5 
     | 
    
         
            +
            # Define a grammar for basic arithmetical expressions
         
     | 
| 
      
 6 
     | 
    
         
            +
            builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 7 
     | 
    
         
            +
              add_terminals('NUMBER')
         
     | 
| 
      
 8 
     | 
    
         
            +
              add_terminals('LPAREN', 'RPAREN') # For '(', ')' delimiters
         
     | 
| 
      
 9 
     | 
    
         
            +
              add_terminals('PLUS', 'MINUS') # For '+', '-' operators or sign
         
     | 
| 
      
 10 
     | 
    
         
            +
              add_terminals('STAR', 'DIVIDE') # For '*', '/' operators
         
     | 
| 
      
 11 
     | 
    
         
            +
              rule 'expression' => %w(sign simple_expression)
         
     | 
| 
      
 12 
     | 
    
         
            +
              rule 'simple_expression' => 'term'
         
     | 
| 
      
 13 
     | 
    
         
            +
              rule 'simple_expression' => %w(simple_expression add_operator term)
         
     | 
| 
      
 14 
     | 
    
         
            +
              rule 'term' => 'factor'
         
     | 
| 
      
 15 
     | 
    
         
            +
              rule 'term' => %w(term mul_operator factor)
         
     | 
| 
      
 16 
     | 
    
         
            +
              rule 'factor' => 'NUMBER'
         
     | 
| 
      
 17 
     | 
    
         
            +
              rule 'factor' => %w(LPAREN expression RPAREN)
         
     | 
| 
      
 18 
     | 
    
         
            +
              rule 'sign' => 'PLUS'
         
     | 
| 
      
 19 
     | 
    
         
            +
              rule 'sign' => 'MINUS'
         
     | 
| 
      
 20 
     | 
    
         
            +
              rule 'sign' => []
         
     | 
| 
      
 21 
     | 
    
         
            +
              rule 'add_operator' => 'PLUS'
         
     | 
| 
      
 22 
     | 
    
         
            +
              rule 'add_operator' => 'MINUS'  
         
     | 
| 
      
 23 
     | 
    
         
            +
              rule 'mul_operator' => 'STAR'
         
     | 
| 
      
 24 
     | 
    
         
            +
              rule 'mul_operator' => 'DIVIDE'   
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            # And now build the grammar...
         
     | 
| 
      
 28 
     | 
    
         
            +
            CalcGrammar = builder.grammar
         
     | 
| 
         @@ -0,0 +1,93 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # File: calc_lexer.rb
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Lexer for a basic arithmetical expression parser
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'strscan'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'rley'  # Load the gem
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class CalcLexer
         
     | 
| 
      
 8 
     | 
    
         
            +
              attr_reader(:scanner)
         
     | 
| 
      
 9 
     | 
    
         
            +
              attr_reader(:lineno)
         
     | 
| 
      
 10 
     | 
    
         
            +
              attr_reader(:line_start)
         
     | 
| 
      
 11 
     | 
    
         
            +
              attr_reader(:name2symbol)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              @@lexeme2name = {
         
     | 
| 
      
 14 
     | 
    
         
            +
                '(' => 'LPAREN',
         
     | 
| 
      
 15 
     | 
    
         
            +
                ')' => 'RPAREN',
         
     | 
| 
      
 16 
     | 
    
         
            +
                '+' => 'PLUS',
         
     | 
| 
      
 17 
     | 
    
         
            +
                '-' => 'MINUS',
         
     | 
| 
      
 18 
     | 
    
         
            +
                '*' => 'STAR',
         
     | 
| 
      
 19 
     | 
    
         
            +
                '/' => 'DIVIDE',
         
     | 
| 
      
 20 
     | 
    
         
            +
              }
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              class ScanError < StandardError ; end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            public
         
     | 
| 
      
 25 
     | 
    
         
            +
              def initialize(source, aGrammar)
         
     | 
| 
      
 26 
     | 
    
         
            +
                @scanner = StringScanner.new(source)
         
     | 
| 
      
 27 
     | 
    
         
            +
                @name2symbol = aGrammar.name2symbol
         
     | 
| 
      
 28 
     | 
    
         
            +
                @lineno =  1
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              def tokens()
         
     | 
| 
      
 32 
     | 
    
         
            +
                tok_sequence = []
         
     | 
| 
      
 33 
     | 
    
         
            +
                until @scanner.eos? do
         
     | 
| 
      
 34 
     | 
    
         
            +
                  token = _next_token
         
     | 
| 
      
 35 
     | 
    
         
            +
                  tok_sequence << token unless token.nil?
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                return tok_sequence
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            private
         
     | 
| 
      
 42 
     | 
    
         
            +
              def _next_token()
         
     | 
| 
      
 43 
     | 
    
         
            +
                token = nil
         
     | 
| 
      
 44 
     | 
    
         
            +
                skip_whitespaces
         
     | 
| 
      
 45 
     | 
    
         
            +
                curr_ch = scanner.getch # curr_ch is at start of token or eof reached...
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                begin
         
     | 
| 
      
 48 
     | 
    
         
            +
                  break if curr_ch.nil?
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  case curr_ch
         
     | 
| 
      
 51 
     | 
    
         
            +
                    when '(', ')', '+', '-', '*', '/'
         
     | 
| 
      
 52 
     | 
    
         
            +
                      type_name = @@lexeme2name[curr_ch]
         
     | 
| 
      
 53 
     | 
    
         
            +
                      token_type = name2symbol[type_name]
         
     | 
| 
      
 54 
     | 
    
         
            +
                      token = Rley::Parser::Token.new(curr_ch, token_type)
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                    # LITERALS
         
     | 
| 
      
 57 
     | 
    
         
            +
                    when /[-0-9]/ # Start character of number literal found
         
     | 
| 
      
 58 
     | 
    
         
            +
                      @scanner.pos = scanner.pos - 1 # Simulate putback
         
     | 
| 
      
 59 
     | 
    
         
            +
                      value = scanner.scan(/-?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9])?/)
         
     | 
| 
      
 60 
     | 
    
         
            +
                      token_type = name2symbol['NUMBER']
         
     | 
| 
      
 61 
     | 
    
         
            +
                      token = Rley::Parser::Token.new(value, token_type)
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                    else # Unknown token
         
     | 
| 
      
 65 
     | 
    
         
            +
                      erroneous = curr_ch.nil? ? '' : curr_ch
         
     | 
| 
      
 66 
     | 
    
         
            +
                      sequel = scanner.scan(/.{1,20}/)
         
     | 
| 
      
 67 
     | 
    
         
            +
                      erroneous += sequel unless sequel.nil?
         
     | 
| 
      
 68 
     | 
    
         
            +
                      raise ScanError.new("Unknown token #{erroneous}")
         
     | 
| 
      
 69 
     | 
    
         
            +
                  end #case
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                end while (token.nil? && curr_ch = scanner.getch())
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                return token
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
              def skip_whitespaces()
         
     | 
| 
      
 79 
     | 
    
         
            +
                matched = scanner.scan(/[ \t\f\n\r]+/)
         
     | 
| 
      
 80 
     | 
    
         
            +
                return if matched.nil?
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                newline_count = 0
         
     | 
| 
      
 83 
     | 
    
         
            +
                matched.scan(/\n\r?|\r/) { |_| newline_count += 1 }
         
     | 
| 
      
 84 
     | 
    
         
            +
                newline_detected(newline_count)
         
     | 
| 
      
 85 
     | 
    
         
            +
              end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
              def newline_detected(count)
         
     | 
| 
      
 89 
     | 
    
         
            +
                @lineno += count
         
     | 
| 
      
 90 
     | 
    
         
            +
                @line_start = scanner.pos()
         
     | 
| 
      
 91 
     | 
    
         
            +
              end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            end # class
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Purpose: to demonstrate how to build and render a parse tree for JSON
         
     | 
| 
      
 2 
     | 
    
         
            +
            # language
         
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'calc_lexer'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative 'calc_grammar'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            # A parser for arithmetic expressions
         
     | 
| 
      
 7 
     | 
    
         
            +
            class CalcParser < Rley::Parser::GFGEarleyParser
         
     | 
| 
      
 8 
     | 
    
         
            +
              attr_reader(:source_file)
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              # Constructor
         
     | 
| 
      
 11 
     | 
    
         
            +
              def initialize()
         
     | 
| 
      
 12 
     | 
    
         
            +
                # Builder the Earley parser with the calculator grammar
         
     | 
| 
      
 13 
     | 
    
         
            +
                super(CalcGrammar)
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              def parse_expression(aText)
         
     | 
| 
      
 17 
     | 
    
         
            +
                lexer = CalcLexer.new(aText, self.grammar)
         
     | 
| 
      
 18 
     | 
    
         
            +
                result = parse(lexer.tokens)
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                return result
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end # class
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            # End of file
         
     | 
    
        data/lib/rley/constants.rb
    CHANGED
    
    
    
        data/lib/rley/syntax/grammar.rb
    CHANGED
    
    | 
         @@ -3,11 +3,11 @@ require 'set' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module Rley # This module is used as a namespace
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Syntax # This module is used as a namespace
         
     | 
| 
       5 
5 
     | 
    
         
             
                # A grammar specifies the syntax of a language.
         
     | 
| 
       6 
     | 
    
         
            -
                #   Formally, a grammar has:
         
     | 
| 
       7 
     | 
    
         
            -
                #   One start symbol,
         
     | 
| 
       8 
     | 
    
         
            -
                #   One or more other production rules,
         
     | 
| 
       9 
     | 
    
         
            -
                #   Each production has a rhs that is a sequence of grammar symbols.
         
     | 
| 
       10 
     | 
    
         
            -
                #   Grammar symbols are categorized into
         
     | 
| 
      
 6 
     | 
    
         
            +
                #   Formally, a grammar has: 
         
     | 
| 
      
 7 
     | 
    
         
            +
                #   * One start symbol,
         
     | 
| 
      
 8 
     | 
    
         
            +
                #   * One or more other production rules,
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   * Each production has a rhs that is a sequence of grammar symbols.
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   * Grammar symbols are categorized into 
         
     | 
| 
       11 
11 
     | 
    
         
             
                #   -terminal symbols
         
     | 
| 
       12 
12 
     | 
    
         
             
                #   -non-terminal symbols
         
     | 
| 
       13 
13 
     | 
    
         
             
                class Grammar
         
     | 
| 
         @@ -24,8 +24,7 @@ module Rley # This module is used as a namespace 
     | 
|
| 
       24 
24 
     | 
    
         
             
                  # A Hash with pairs of the kind: symbol name => grammar symbol
         
     | 
| 
       25 
25 
     | 
    
         
             
                  attr_reader(:name2symbol)
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                  # @param theProductions [Array 
     | 
| 
       28 
     | 
    
         
            -
                  # of the grammar.
         
     | 
| 
      
 27 
     | 
    
         
            +
                  # @param theProductions [Array<Production>] productions of the grammar.
         
     | 
| 
       29 
28 
     | 
    
         
             
                  def initialize(theProductions)
         
     | 
| 
       30 
29 
     | 
    
         
             
                    @rules = []
         
     | 
| 
       31 
30 
     | 
    
         
             
                    @symbols = []
         
     | 
| 
         @@ -34,25 +34,23 @@ module Rley # This module is used as a namespace 
     | 
|
| 
       34 
34 
     | 
    
         
             
                    return symbols[aSymbolName]
         
     | 
| 
       35 
35 
     | 
    
         
             
                  end
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
                  # Add the terminal symbols of the language
         
     | 
| 
       38 
     | 
    
         
            -
                  # @param terminalSymbols [String or Terminal]  
     | 
| 
       39 
     | 
    
         
            -
                  # terminal symbols to add to the grammar.
         
     | 
| 
      
 37 
     | 
    
         
            +
                  # Add the given terminal symbols to the grammar of the language
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # @param terminalSymbols [String or Terminal] 1..* terminal symbols.
         
     | 
| 
       40 
39 
     | 
    
         
             
                  def add_terminals(*terminalSymbols)
         
     | 
| 
       41 
40 
     | 
    
         
             
                    new_symbs = build_symbols(Terminal, terminalSymbols)
         
     | 
| 
       42 
41 
     | 
    
         
             
                    symbols.merge!(new_symbs)
         
     | 
| 
       43 
42 
     | 
    
         
             
                  end
         
     | 
| 
       44 
43 
     | 
    
         | 
| 
       45 
44 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
                  # Add a production rule in the grammar 
     | 
| 
       47 
     | 
    
         
            -
                  #  
     | 
| 
       48 
     | 
    
         
            -
                  # production. It consists of a key-value pair of the form: 
         
     | 
| 
       49 
     | 
    
         
            -
                  # String => Array.
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # Add a production rule in the grammar given one 
         
     | 
| 
      
 46 
     | 
    
         
            +
                  # key-value pair of the form: String => Array.
         
     | 
| 
       50 
47 
     | 
    
         
             
                  #   Where the key is the name of the non-terminal appearing in the 
         
     | 
| 
       51 
48 
     | 
    
         
             
                  #   left side of the rule. 
         
     | 
| 
       52 
49 
     | 
    
         
             
                  #   The value, an Array, is a sequence of grammar symbol names.
         
     | 
| 
       53 
50 
     | 
    
         
             
                  # The rule is created and inserted in the grammar.
         
     | 
| 
       54 
51 
     | 
    
         
             
                  # Example:
         
     | 
| 
       55 
     | 
    
         
            -
                  #   builder.add_production('A' => ['a', 'A', 'c'])
         
     | 
| 
      
 52 
     | 
    
         
            +
                  #   builder.add_production('A' => ['a', 'A', 'c'])      
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # @param aProductionRepr [Hash] A Hash-based representation of production 
         
     | 
| 
       56 
54 
     | 
    
         
             
                  def add_production(aProductionRepr)
         
     | 
| 
       57 
55 
     | 
    
         
             
                    aProductionRepr.each_pair do |(lhs_name, rhs_repr)|
         
     | 
| 
       58 
56 
     | 
    
         
             
                      lhs = get_nonterminal(lhs_name)
         
     | 
| 
         @@ -358,13 +358,14 @@ SNIPPET 
     | 
|
| 
       358 
358 
     | 
    
         
             
                      t_plus = Syntax::VerbatimSymbol.new('+')
         
     | 
| 
       359 
359 
     | 
    
         
             
                      t_star = Syntax::VerbatimSymbol.new('*')
         
     | 
| 
       360 
360 
     | 
    
         | 
| 
       361 
     | 
    
         
            -
                      builder = Syntax::GrammarBuilder.new
         
     | 
| 
       362 
     | 
    
         
            -
             
     | 
| 
       363 
     | 
    
         
            -
             
     | 
| 
       364 
     | 
    
         
            -
             
     | 
| 
       365 
     | 
    
         
            -
             
     | 
| 
       366 
     | 
    
         
            -
             
     | 
| 
       367 
     | 
    
         
            -
             
     | 
| 
      
 361 
     | 
    
         
            +
                      builder = Syntax::GrammarBuilder.new do
         
     | 
| 
      
 362 
     | 
    
         
            +
                        add_terminals(t_int, t_plus, t_star)
         
     | 
| 
      
 363 
     | 
    
         
            +
                        rule 'P' => 'S'
         
     | 
| 
      
 364 
     | 
    
         
            +
                        rule 'S' => %w(S + S)
         
     | 
| 
      
 365 
     | 
    
         
            +
                        rule 'S' => %w(S * S)
         
     | 
| 
      
 366 
     | 
    
         
            +
                        rule 'S' => 'L'
         
     | 
| 
      
 367 
     | 
    
         
            +
                        rule 'L' => 'integer'
         
     | 
| 
      
 368 
     | 
    
         
            +
                      end
         
     | 
| 
       368 
369 
     | 
    
         
             
                      input_sequence = [
         
     | 
| 
       369 
370 
     | 
    
         
             
                        { '2' => 'integer' },
         
     | 
| 
       370 
371 
     | 
    
         
             
                        '+',
         
     | 
| 
         @@ -603,12 +604,13 @@ MSG 
     | 
|
| 
       603 
604 
     | 
    
         
             
                      t_lparen = Syntax::VerbatimSymbol.new('(')
         
     | 
| 
       604 
605 
     | 
    
         
             
                      t_rparen = Syntax::VerbatimSymbol.new(')')
         
     | 
| 
       605 
606 
     | 
    
         | 
| 
       606 
     | 
    
         
            -
                      builder = Syntax::GrammarBuilder.new
         
     | 
| 
       607 
     | 
    
         
            -
             
     | 
| 
       608 
     | 
    
         
            -
             
     | 
| 
       609 
     | 
    
         
            -
             
     | 
| 
       610 
     | 
    
         
            -
             
     | 
| 
       611 
     | 
    
         
            -
             
     | 
| 
      
 607 
     | 
    
         
            +
                      builder = Syntax::GrammarBuilder.new do
         
     | 
| 
      
 608 
     | 
    
         
            +
                        add_terminals(t_int, t_plus, t_lparen, t_rparen)
         
     | 
| 
      
 609 
     | 
    
         
            +
                        rule 'S' => 'E'
         
     | 
| 
      
 610 
     | 
    
         
            +
                        rule 'E' => 'int'
         
     | 
| 
      
 611 
     | 
    
         
            +
                        rule 'E' => %w(( E + E ))
         
     | 
| 
      
 612 
     | 
    
         
            +
                        rule 'E' => %w(E + E)
         
     | 
| 
      
 613 
     | 
    
         
            +
                      end
         
     | 
| 
       612 
614 
     | 
    
         
             
                      input_sequence = [
         
     | 
| 
       613 
615 
     | 
    
         
             
                        { '7' => 'int' },
         
     | 
| 
       614 
616 
     | 
    
         
             
                        '+',
         
     | 
| 
         @@ -713,15 +715,16 @@ MSG 
     | 
|
| 
       713 
715 
     | 
    
         
             
                      t_star = Syntax::VerbatimSymbol.new('*')
         
     | 
| 
       714 
716 
     | 
    
         
             
                      t_slash = Syntax::VerbatimSymbol.new('/')
         
     | 
| 
       715 
717 
     | 
    
         | 
| 
       716 
     | 
    
         
            -
                      builder = Syntax::GrammarBuilder.new
         
     | 
| 
       717 
     | 
    
         
            -
             
     | 
| 
       718 
     | 
    
         
            -
             
     | 
| 
       719 
     | 
    
         
            -
             
     | 
| 
       720 
     | 
    
         
            -
             
     | 
| 
       721 
     | 
    
         
            -
             
     | 
| 
       722 
     | 
    
         
            -
             
     | 
| 
       723 
     | 
    
         
            -
             
     | 
| 
       724 
     | 
    
         
            -
             
     | 
| 
      
 718 
     | 
    
         
            +
                      builder = Syntax::GrammarBuilder.new do
         
     | 
| 
      
 719 
     | 
    
         
            +
                        add_terminals(t_a, t_star, t_slash)
         
     | 
| 
      
 720 
     | 
    
         
            +
                        rule 'Z' => 'E'
         
     | 
| 
      
 721 
     | 
    
         
            +
                        rule 'E' => %w(E Q F)
         
     | 
| 
      
 722 
     | 
    
         
            +
                        rule 'E' => 'F'
         
     | 
| 
      
 723 
     | 
    
         
            +
                        rule 'F' => t_a
         
     | 
| 
      
 724 
     | 
    
         
            +
                        rule 'Q' => t_star
         
     | 
| 
      
 725 
     | 
    
         
            +
                        rule 'Q' => t_slash
         
     | 
| 
      
 726 
     | 
    
         
            +
                        rule 'Q' => [] # Empty production
         
     | 
| 
      
 727 
     | 
    
         
            +
                      end
         
     | 
| 
       725 
728 
     | 
    
         | 
| 
       726 
729 
     | 
    
         
             
                      tokens = build_token_sequence(%w(a a / a), builder.grammar)
         
     | 
| 
       727 
730 
     | 
    
         
             
                      instance = GFGEarleyParser.new(builder.grammar)
         
     | 
| 
         @@ -20,16 +20,17 @@ module Rley # Open this namespace to avoid module qualifier prefixes 
     | 
|
| 
       20 
20 
     | 
    
         
             
                  include ExpectationHelper # Mix-in with expectation on parse entry sets
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                  let(:sample_grammar) do
         
     | 
| 
       23 
     | 
    
         
            -
                    builder = Rley::Syntax::GrammarBuilder.new
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 23 
     | 
    
         
            +
                    builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 24 
     | 
    
         
            +
                      add_terminals('N', 'V', 'Pro')  # N(oun), V(erb), Pro(noun)
         
     | 
| 
      
 25 
     | 
    
         
            +
                      add_terminals('Det', 'P')       # Det(erminer), P(reposition)
         
     | 
| 
      
 26 
     | 
    
         
            +
                      rule 'S' => %w(NP VP)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      rule 'NP' => %w(Det N)
         
     | 
| 
      
 28 
     | 
    
         
            +
                      rule 'NP' => %w(Det N PP)
         
     | 
| 
      
 29 
     | 
    
         
            +
                      rule 'NP' => 'Pro'
         
     | 
| 
      
 30 
     | 
    
         
            +
                      rule 'VP' => %w(V NP)
         
     | 
| 
      
 31 
     | 
    
         
            +
                      rule 'VP' => %w(VP PP)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      rule 'PP' => %w(P NP)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
       33 
34 
     | 
    
         
             
                    builder.grammar
         
     | 
| 
       34 
35 
     | 
    
         
             
                  end
         
     | 
| 
       35 
36 
     | 
    
         | 
| 
         @@ -21,15 +21,16 @@ module Rley # Open this namespace to avoid module qualifier prefixes 
     | 
|
| 
       21 
21 
     | 
    
         
             
                      # "SPPF=Style Parsing From Earley Recognizers" in
         
     | 
| 
       22 
22 
     | 
    
         
             
                      # Notes in Theoretical Computer Science 203, (2008), pp. 53-67
         
     | 
| 
       23 
23 
     | 
    
         
             
                      # contains a hidden left recursion and a cycle
         
     | 
| 
       24 
     | 
    
         
            -
                      builder = Syntax::GrammarBuilder.new
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
                      builder = Syntax::GrammarBuilder.new do
         
     | 
| 
      
 25 
     | 
    
         
            +
                        add_terminals('a', 'b')
         
     | 
| 
      
 26 
     | 
    
         
            +
                        rule 'Phi' => 'S'
         
     | 
| 
      
 27 
     | 
    
         
            +
                        rule 'S' => %w(A T)
         
     | 
| 
      
 28 
     | 
    
         
            +
                        rule 'S' => %w(a T)
         
     | 
| 
      
 29 
     | 
    
         
            +
                        rule 'A' => 'a'
         
     | 
| 
      
 30 
     | 
    
         
            +
                        rule 'A' => %w(B A)
         
     | 
| 
      
 31 
     | 
    
         
            +
                        rule 'B' => []
         
     | 
| 
      
 32 
     | 
    
         
            +
                        rule 'T' => %w(b b b)
         
     | 
| 
      
 33 
     | 
    
         
            +
                      end
         
     | 
| 
       33 
34 
     | 
    
         
             
                      builder.grammar
         
     | 
| 
       34 
35 
     | 
    
         
             
                  end
         
     | 
| 
       35 
36 
     | 
    
         | 
| 
         @@ -20,15 +20,16 @@ module Rley # Open this namespace to avoid module qualifier prefixes 
     | 
|
| 
       20 
20 
     | 
    
         
             
                      # "SPPF-Style Parsing From Earley Recognizers" in
         
     | 
| 
       21 
21 
     | 
    
         
             
                      # Notes in Theoretical Computer Science 203, (2008), pp. 53-67
         
     | 
| 
       22 
22 
     | 
    
         
             
                      # contains a hidden left recursion and a cycle
         
     | 
| 
       23 
     | 
    
         
            -
                      builder = Syntax::GrammarBuilder.new
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 23 
     | 
    
         
            +
                      builder = Syntax::GrammarBuilder.new do
         
     | 
| 
      
 24 
     | 
    
         
            +
                        add_terminals('a', 'b')
         
     | 
| 
      
 25 
     | 
    
         
            +
                        rule 'Phi' => 'S'
         
     | 
| 
      
 26 
     | 
    
         
            +
                        rule 'S' => %w(A T)
         
     | 
| 
      
 27 
     | 
    
         
            +
                        rule 'S' => %w(a T)
         
     | 
| 
      
 28 
     | 
    
         
            +
                        rule 'A' => 'a'
         
     | 
| 
      
 29 
     | 
    
         
            +
                        rule 'A' => %w(B A)
         
     | 
| 
      
 30 
     | 
    
         
            +
                        rule 'B' => []
         
     | 
| 
      
 31 
     | 
    
         
            +
                        rule 'T' => %w(b b b)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      end
         
     | 
| 
       32 
33 
     | 
    
         
             
                      builder.grammar
         
     | 
| 
       33 
34 
     | 
    
         
             
                  end
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
         @@ -8,11 +8,12 @@ module AmbiguousGrammarHelper 
     | 
|
| 
       8 
8 
     | 
    
         
             
              # expression grammar.
         
     | 
| 
       9 
9 
     | 
    
         
             
              # (based on an example from Fisher and LeBlanc: "Crafting a Compiler")
         
     | 
| 
       10 
10 
     | 
    
         
             
              def grammar_builder()
         
     | 
| 
       11 
     | 
    
         
            -
                builder = Rley::Syntax::GrammarBuilder.new
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  add_terminals('+', 'id')
         
     | 
| 
      
 13 
     | 
    
         
            +
                  rule 'S' => 'E'
         
     | 
| 
      
 14 
     | 
    
         
            +
                  rule 'E' => %w(E + E)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  rule 'E' => 'id'
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
       16 
17 
     | 
    
         
             
                builder
         
     | 
| 
       17 
18 
     | 
    
         
             
              end
         
     | 
| 
       18 
19 
     | 
    
         | 
| 
         @@ -5,11 +5,12 @@ module GrammarABCHelper 
     | 
|
| 
       5 
5 
     | 
    
         
             
              # Factory method. Creates a grammar builder for a simple grammar.
         
     | 
| 
       6 
6 
     | 
    
         
             
              # (based on example in N. Wirth "Compiler Construction" book, p. 6)
         
     | 
| 
       7 
7 
     | 
    
         
             
              def grammar_abc_builder()
         
     | 
| 
       8 
     | 
    
         
            -
                builder = Rley::Syntax::GrammarBuilder.new
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 8 
     | 
    
         
            +
                builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 9 
     | 
    
         
            +
                  add_terminals('a', 'b', 'c')
         
     | 
| 
      
 10 
     | 
    
         
            +
                  rule 'S' => 'A'
         
     | 
| 
      
 11 
     | 
    
         
            +
                  rule 'A' => %w(a A c)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  rule 'A' => 'b'
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
                return builder
         
     | 
| 
       15 
16 
     | 
    
         
             
              end
         
     | 
| 
         @@ -9,13 +9,14 @@ module GrammarAmbig01Helper 
     | 
|
| 
       9 
9 
     | 
    
         
             
              # Grammar 3: An ambiguous arithmetic expression language
         
     | 
| 
       10 
10 
     | 
    
         
             
              # (based on example in article on Earley's algorithm in Wikipedia)
         
     | 
| 
       11 
11 
     | 
    
         
             
              def grammar_ambig01_builder()
         
     | 
| 
       12 
     | 
    
         
            -
                builder = Rley::Syntax::GrammarBuilder.new
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
                builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  add_terminals('integer', '+', '*')
         
     | 
| 
      
 14 
     | 
    
         
            +
                  rule 'P' => 'S'
         
     | 
| 
      
 15 
     | 
    
         
            +
                  rule 'S' => %w(S + S)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rule 'S' => %w(S * S)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  rule 'S' => 'L'
         
     | 
| 
      
 18 
     | 
    
         
            +
                  rule 'L' => 'integer'
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
       19 
20 
     | 
    
         
             
                builder
         
     | 
| 
       20 
21 
     | 
    
         
             
              end
         
     | 
| 
       21 
22 
     | 
    
         | 
| 
         @@ -8,14 +8,15 @@ module GrammarBExprHelper 
     | 
|
| 
       8 
8 
     | 
    
         
             
              # expression grammar.
         
     | 
| 
       9 
9 
     | 
    
         
             
              # (based on the article about Earley's algorithm in Wikipedia)
         
     | 
| 
       10 
10 
     | 
    
         
             
              def grammar_expr_builder()
         
     | 
| 
       11 
     | 
    
         
            -
                builder = Rley::Syntax::GrammarBuilder.new
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  add_terminals('+', '*', 'integer')
         
     | 
| 
      
 13 
     | 
    
         
            +
                  rule 'P' => 'S'
         
     | 
| 
      
 14 
     | 
    
         
            +
                  rule 'S' => %w(S + M)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  rule 'S' => 'M'
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rule 'M' => %w(M * T)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  rule 'M' => 'T'
         
     | 
| 
      
 18 
     | 
    
         
            +
                  rule 'T' => 'integer'
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
       19 
20 
     | 
    
         
             
                builder
         
     | 
| 
       20 
21 
     | 
    
         
             
              end
         
     | 
| 
       21 
22 
     | 
    
         | 
| 
         @@ -10,20 +10,21 @@ module GrammarL0Helper 
     | 
|
| 
       10 
10 
     | 
    
         
             
              # It defines the syntax of a sentence in a language with a
         
     | 
| 
       11 
11 
     | 
    
         
             
              # very limited syntax and lexicon in the context of airline reservation.
         
     | 
| 
       12 
12 
     | 
    
         
             
              def grammar_l0_builder()
         
     | 
| 
       13 
     | 
    
         
            -
                builder = Rley::Syntax::GrammarBuilder.new
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
                builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  add_terminals('Noun', 'Verb', 'Pronoun', 'Proper-Noun')
         
     | 
| 
      
 15 
     | 
    
         
            +
                  add_terminals('Determiner', 'Preposition')
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rule 'S' => %w(NP VP)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  rule 'NP' => 'Pronoun'
         
     | 
| 
      
 18 
     | 
    
         
            +
                  rule 'NP' => 'Proper-Noun'
         
     | 
| 
      
 19 
     | 
    
         
            +
                  rule 'NP' => %w(Determiner Nominal)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  rule 'Nominal' => %w(Nominal Noun)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  rule 'Nominal' => 'Noun'
         
     | 
| 
      
 22 
     | 
    
         
            +
                  rule 'VP' => 'Verb'
         
     | 
| 
      
 23 
     | 
    
         
            +
                  rule 'VP' => %w(Verb NP)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  rule 'VP' => %w(Verb NP PP)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  rule 'VP' => %w(Verb PP)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  rule 'PP' => %w(Preposition PP)
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
       27 
28 
     | 
    
         
             
                builder
         
     | 
| 
       28 
29 
     | 
    
         
             
              end
         
     | 
| 
       29 
30 
     | 
    
         | 
| 
         @@ -9,15 +9,16 @@ module GrammarSPPFHelper 
     | 
|
| 
       9 
9 
     | 
    
         
             
              # Notes in Theoretical Computer Science 203, (2008), pp. 53-67
         
     | 
| 
       10 
10 
     | 
    
         
             
              # contains a hidden left recursion and a cycle
         
     | 
| 
       11 
11 
     | 
    
         
             
              def grammar_sppf_builder()
         
     | 
| 
       12 
     | 
    
         
            -
                builder = Rley::Syntax::GrammarBuilder.new
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
                builder = Rley::Syntax::GrammarBuilder.new do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  add_terminals('a', 'b')
         
     | 
| 
      
 14 
     | 
    
         
            +
                  rule 'Phi' => 'S'
         
     | 
| 
      
 15 
     | 
    
         
            +
                  rule 'S' => %w(A T)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rule 'S' => %w(a T)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  rule 'A' => 'a'
         
     | 
| 
      
 18 
     | 
    
         
            +
                  rule 'A' => %w(B A)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  rule 'B' => []
         
     | 
| 
      
 20 
     | 
    
         
            +
                  rule 'T' => %w(b b b)
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
       21 
22 
     | 
    
         | 
| 
       22 
23 
     | 
    
         
             
                return builder
         
     | 
| 
       23 
24 
     | 
    
         
             
              end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: rley
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.3.12
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Dimitri Geshef
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2016-12- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-12-08 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: rake
         
     | 
| 
         @@ -130,10 +130,14 @@ files: 
     | 
|
| 
       130 
130 
     | 
    
         
             
            - README.md
         
     | 
| 
       131 
131 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       132 
132 
     | 
    
         
             
            - examples/NLP/mini_en_demo.rb
         
     | 
| 
      
 133 
     | 
    
         
            +
            - examples/data_formats/JSON/JSON_demo.rb
         
     | 
| 
       133 
134 
     | 
    
         
             
            - examples/data_formats/JSON/JSON_grammar.rb
         
     | 
| 
       134 
135 
     | 
    
         
             
            - examples/data_formats/JSON/JSON_lexer.rb
         
     | 
| 
       135 
136 
     | 
    
         
             
            - examples/data_formats/JSON/JSON_parser.rb
         
     | 
| 
       136 
     | 
    
         
            -
            - examples/ 
     | 
| 
      
 137 
     | 
    
         
            +
            - examples/general/calc/calc_demo.rb
         
     | 
| 
      
 138 
     | 
    
         
            +
            - examples/general/calc/calc_grammar.rb
         
     | 
| 
      
 139 
     | 
    
         
            +
            - examples/general/calc/calc_lexer.rb
         
     | 
| 
      
 140 
     | 
    
         
            +
            - examples/general/calc/calc_parser.rb
         
     | 
| 
       137 
141 
     | 
    
         
             
            - lib/rley.rb
         
     | 
| 
       138 
142 
     | 
    
         
             
            - lib/rley/constants.rb
         
     | 
| 
       139 
143 
     | 
    
         
             
            - lib/rley/formatter/base_formatter.rb
         
     |