rley 0.3.07 → 0.3.08
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 +5 -0
- data/lib/rley/constants.rb +1 -1
- data/lib/rley/parser/parse_forest_builder.rb +70 -29
- data/lib/rley/parser/parse_walker_factory.rb +10 -2
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 38c77acd3a3831519aa9511c02ab2aaa7f99c962
         | 
| 4 | 
            +
              data.tar.gz: bd84fe47221a72d195a92e40e8c5a62fafed562b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7a36a172143025e47b03022dc2db7be6bcb990b21834ea51288afe9158c3fe97eaafce70cbcd36ea64841da03036a0e98e446454b4e6f8e2170e60e9fa2c0697
         | 
| 7 | 
            +
              data.tar.gz: 716aa238f7f40e07118b11eb3d7c38c5a3f2cc8583c516818d1d5bcb11267a7c52b7849e049de4ecf93729f23746b1569adfbdd1d297947e787f9c82a5a0b94e
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,8 @@ | |
| 1 | 
            +
            ### 0.3.08 / 2016-11-17
         | 
| 2 | 
            +
            * [FIX] Method `ParseWalkerFactory#select_antecedent` did not support alternative nodes creation when visiting an item entry for highly ambiguous parse.
         | 
| 3 | 
            +
            * [FIX] Method `ParseWalkerFactory#select_antecedent` did not manage properly call/return stack for alternative nodes created when visiting an item entry for highly ambiguous parse.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 1 6 | 
             
            ### 0.3.07 / 2016-11-08
         | 
| 2 7 | 
             
            * [FIX] The sharing a of forest node could be repeated in a production in a revisit event.
         | 
| 3 8 | 
             
            * [CHANGE] Method `ParseWalkerFactory#process_end_entry`. Added a guard condition to avoid repeated node sharing
         | 
    
        data/lib/rley/constants.rb
    CHANGED
    
    
| @@ -82,7 +82,7 @@ module Rley # This module is used as a namespace | |
| 82 82 | 
             
                      when :backtrack
         | 
| 83 83 | 
             
                        # Restore path
         | 
| 84 84 | 
             
                        @curr_path = entry2path_to_alt[anEntry].dup
         | 
| 85 | 
            -
                        # puts "Restore path #{curr_path.join(', ')}]"
         | 
| 85 | 
            +
                        # puts "Restore path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
         | 
| 86 86 | 
             
                        antecedent_index = curr_parent.subnodes.size
         | 
| 87 87 | 
             
                        # puts "Current parent #{curr_parent.to_string(0)}"
         | 
| 88 88 | 
             
                        # puts "Antecedent index #{antecedent_index}"
         | 
| @@ -103,35 +103,76 @@ module Rley # This module is used as a namespace | |
| 103 103 | 
             
                  end
         | 
| 104 104 |  | 
| 105 105 |  | 
| 106 | 
            -
                  def process_item_entry( | 
| 107 | 
            -
                     | 
| 108 | 
            -
                       | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 121 | 
            -
                    # Retrieve the grammar symbol before the dot (if any)
         | 
| 122 | 
            -
                    prev_symbol = anEntry.prev_symbol
         | 
| 123 | 
            -
                    case prev_symbol
         | 
| 124 | 
            -
                      when Syntax::Terminal
         | 
| 125 | 
            -
                        # Add node without changing current path
         | 
| 126 | 
            -
                        create_token_node(anEntry, anIndex)
         | 
| 127 | 
            -
             | 
| 128 | 
            -
                      when NilClass # Dot at the beginning of production
         | 
| 129 | 
            -
                        if anEntry.vertex.dotted_item.production.empty?
         | 
| 130 | 
            -
                          # Empty rhs => create an epsilon node ...
         | 
| 131 | 
            -
                          # ... without changing current path
         | 
| 132 | 
            -
                          create_epsilon_node(anEntry, anIndex)
         | 
| 106 | 
            +
                  def process_item_entry(anEvent, anEntry, anIndex)
         | 
| 107 | 
            +
                    case anEvent
         | 
| 108 | 
            +
                      when :visit      
         | 
| 109 | 
            +
                        if anEntry.exit_entry?
         | 
| 110 | 
            +
                          # Previous entry was an end entry (X. pattern)
         | 
| 111 | 
            +
                          # Does the previous entry have multiple antecedent?
         | 
| 112 | 
            +
                          if last_visitee.end_entry? && last_visitee.antecedents.size > 1
         | 
| 113 | 
            +
                            # Store current path for later backtracking
         | 
| 114 | 
            +
                            # puts "Store backtrack context #{last_visitee}"
         | 
| 115 | 
            +
                            # puts "path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
         | 
| 116 | 
            +
                            entry2path_to_alt[last_visitee] = curr_path.dup
         | 
| 117 | 
            +
                            curr_parent.refinement = :or
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                            create_alternative_node(anEntry)
         | 
| 120 | 
            +
                          end
         | 
| 133 121 | 
             
                        end
         | 
| 134 | 
            -
                         | 
| 122 | 
            +
                        
         | 
| 123 | 
            +
                        # Does this entry have multiple antecedent?
         | 
| 124 | 
            +
                        if anEntry.antecedents.size > 1
         | 
| 125 | 
            +
                          # Store current path for later backtracking
         | 
| 126 | 
            +
                          # puts "Store backtrack context #{anEntry}"
         | 
| 127 | 
            +
                          # puts "path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
         | 
| 128 | 
            +
                          entry2path_to_alt[anEntry] = curr_path.dup
         | 
| 129 | 
            +
                          # curr_parent.refinement = :or
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                          create_alternative_node(anEntry)
         | 
| 132 | 
            +
                        end      
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                        # Retrieve the grammar symbol before the dot (if any)
         | 
| 135 | 
            +
                        prev_symbol = anEntry.prev_symbol
         | 
| 136 | 
            +
                        case prev_symbol
         | 
| 137 | 
            +
                          when Syntax::Terminal
         | 
| 138 | 
            +
                            # Add node without changing current path
         | 
| 139 | 
            +
                            create_token_node(anEntry, anIndex)
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                          when NilClass # Dot at the beginning of production
         | 
| 142 | 
            +
                            if anEntry.vertex.dotted_item.production.empty?
         | 
| 143 | 
            +
                              # Empty rhs => create an epsilon node ...
         | 
| 144 | 
            +
                              # ... without changing current path
         | 
| 145 | 
            +
                              create_epsilon_node(anEntry, anIndex)
         | 
| 146 | 
            +
                            end
         | 
| 147 | 
            +
                            curr_path.pop if curr_parent.kind_of?(SPPF::AlternativeNode)
         | 
| 148 | 
            +
                        end
         | 
| 149 | 
            +
                        
         | 
| 150 | 
            +
                      when :backtrack
         | 
| 151 | 
            +
                        # Restore path
         | 
| 152 | 
            +
                        @curr_path = entry2path_to_alt[anEntry].dup
         | 
| 153 | 
            +
                        # puts "Special restore path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
         | 
| 154 | 
            +
                        antecedent_index = curr_parent.subnodes.size
         | 
| 155 | 
            +
                        # puts "Current parent #{curr_parent.to_string(0)}"
         | 
| 156 | 
            +
                        # puts "Antecedent index #{antecedent_index}"
         | 
| 157 | 
            +
                        
         | 
| 158 | 
            +
                        create_alternative_node(anEntry)            
         | 
| 159 | 
            +
                        
         | 
| 160 | 
            +
                    when :revisit
         | 
| 161 | 
            +
                        # Retrieve the grammar symbol before the dot (if any)
         | 
| 162 | 
            +
                        prev_symbol = anEntry.prev_symbol
         | 
| 163 | 
            +
                        case prev_symbol
         | 
| 164 | 
            +
                          when Syntax::Terminal
         | 
| 165 | 
            +
                            # Add node without changing current path
         | 
| 166 | 
            +
                            create_token_node(anEntry, anIndex)
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                          when NilClass # Dot at the beginning of production
         | 
| 169 | 
            +
                            if anEntry.vertex.dotted_item.production.empty?
         | 
| 170 | 
            +
                              # Empty rhs => create an epsilon node ...
         | 
| 171 | 
            +
                              # ... without changing current path
         | 
| 172 | 
            +
                              create_epsilon_node(anEntry, anIndex)
         | 
| 173 | 
            +
                            end
         | 
| 174 | 
            +
                            curr_path.pop if curr_parent.kind_of?(SPPF::AlternativeNode)
         | 
| 175 | 
            +
                        end        
         | 
| 135 176 | 
             
                    end
         | 
| 136 177 | 
             
                  end
         | 
| 137 178 |  | 
| @@ -168,6 +168,7 @@ module Rley # This module is used as a namespace | |
| 168 168 | 
             
                      aContext.return_stack << aContext.curr_entry
         | 
| 169 169 | 
             
                    elsif traversed_edge.kind_of?(GFG::CallEdge)
         | 
| 170 170 | 
             
                      # Pop top of stack
         | 
| 171 | 
            +
                      fail ScriptError, "Return stack empty!" if aContext.return_stack.empty?
         | 
| 171 172 | 
             
                      aContext.return_stack.pop
         | 
| 172 173 | 
             
                      # puts "Pop from return stack matching entry #{new_entry}"
         | 
| 173 174 | 
             
                    elsif traversed_edge.kind_of?(GFG::ScanEdge)
         | 
| @@ -187,13 +188,19 @@ module Rley # This module is used as a namespace | |
| 187 188 | 
             
                    case aContext.curr_entry.vertex
         | 
| 188 189 | 
             
                      when GFG::EndVertex
         | 
| 189 190 | 
             
                        # puts "Add backtrack point stack #{aContext.curr_entry}"
         | 
| 190 | 
            -
                        # An end vertex with multiple antecedents requires
         | 
| 191 | 
            -
                        # a backtrack point for a correct graph traversal
         | 
| 192 191 | 
             
                        bp = add_backtrack_point(aContext)
         | 
| 193 192 | 
             
                        new_entry = bp.visitee.antecedents[bp.antecedent_index]
         | 
| 194 193 |  | 
| 195 194 | 
             
                      when GFG::StartVertex
         | 
| 196 195 | 
             
                        new_entry = select_calling_entry(aContext)
         | 
| 196 | 
            +
                        
         | 
| 197 | 
            +
                      when GFG::ItemVertex
         | 
| 198 | 
            +
                        # Push current entry onto stack
         | 
| 199 | 
            +
                        # puts "Special push on return stack #{aContext.curr_entry}"
         | 
| 200 | 
            +
                        aContext.return_stack << aContext.curr_entry        
         | 
| 201 | 
            +
                        # puts "Add special backtrack point stack #{aContext.curr_entry}"
         | 
| 202 | 
            +
                        bp = add_backtrack_point(aContext)
         | 
| 203 | 
            +
                        new_entry = bp.visitee.antecedents[bp.antecedent_index]          
         | 
| 197 204 | 
             
                      else
         | 
| 198 205 | 
             
                        raise StandardError, 'Internal error'
         | 
| 199 206 | 
             
                    end
         | 
| @@ -239,6 +246,7 @@ module Rley # This module is used as a namespace | |
| 239 246 | 
             
                  # Observation: calling parse entry is an parse entry linked
         | 
| 240 247 | 
             
                  # to a item vertex
         | 
| 241 248 | 
             
                  def select_calling_entry(aContext)
         | 
| 249 | 
            +
                    fail ScriptError, "Empty return stack" if aContext.return_stack.empty?
         | 
| 242 250 | 
             
                    # Retrieve top of stack
         | 
| 243 251 | 
             
                    tos = aContext.return_stack.pop
         | 
| 244 252 | 
             
                    tos_dotted_item = tos.vertex.dotted_item
         | 
    
        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.08
         | 
| 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-11- | 
| 11 | 
            +
            date: 2016-11-17 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake
         |