Class: Ibex::Runtime::RepairSearch
- Inherits:
-
Object
- Object
- Ibex::Runtime::RepairSearch
- Defined in:
- lib/ibex/runtime/repair_search.rb
Overview
Bounded Dijkstra search over LR state stacks. Semantic actions never run. rubocop:disable Metrics/ClassLength -- queue policy and LR transitions form one bounded search invariant.
Defined Under Namespace
Classes: Configuration
Constant Summary collapse
- NEED_INPUT =
: Object
Object.new.freeze
- LIMIT =
: Object
Object.new.freeze
Instance Method Summary collapse
-
#initialize(tables, policy, tokens, complete:) ⇒ RepairSearch
constructor
A new instance of RepairSearch.
- #search(state_stack) ⇒ Object
Constructor Details
#initialize(tables, policy, tokens, complete:) ⇒ RepairSearch
Returns a new instance of RepairSearch.
26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/ibex/runtime/repair_search.rb', line 26 def initialize(tables, policy, tokens, complete:) @tables = tables @policy = policy @tokens = tokens @complete = complete @configurations = 0 @heap = RepairPriorityQueue.new @best = {} reserved = [Parser::EOF_TOKEN, Parser::ERROR_TOKEN] @candidate_ids = tables.fetch(:token_names).keys.reject { |id| reserved.include?(id) }.sort.freeze end |
Instance Method Details
#search(state_stack) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/ibex/runtime/repair_search.rb', line 39 def search(state_stack) empty_edits = [] #: Array[RepairEdit] push( Configuration.new( stack: state_stack.dup.freeze, input_index: 0, shifts: 0, cost: 0, edits: empty_edits.freeze, goal: false ) ) needs_input = false until @heap.empty? configuration = pop return nil if configuration.equal?(LIMIT) next unless configuration.is_a?(Configuration) result = visit(configuration) return nil if result.equal?(LIMIT) return result if result.is_a?(RepairPlan) needs_input = true if result.equal?(NEED_INPUT) end needs_input ? NEED_INPUT : nil end |