Class: Kanocc::ItemSet

Inherits:
Object
  • Object
show all
Defined in:
lib/kanocc/earley.rb

Instance Method Summary collapse

Constructor Details

#initializeItemSet

FIXME Optimize all this



299
300
301
302
303
# File 'lib/kanocc/earley.rb', line 299

def initialize
  @item_lists = []
  @items_n_and_symbol_after_dot = {}
  @items_rule_dot_j_n = {}
end

Instance Method Details

#add(rule, dot, j, n, prev_pos) ⇒ Object



309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
# File 'lib/kanocc/earley.rb', line 309

def add(rule, dot, j, n, prev_pos)
  if item = @items_rule_dot_j_n[[rule,dot,j,n]]
    item.set_prev_pos(prev_pos)
  else
    item = Item.new(rule, dot, j, n, prev_pos, prev_pos)
    @items_rule_dot_j_n[[rule,dot,j,n]] = item
    @item_lists[item.n] = [] unless @item_lists[item.n]
    @item_lists[item.n] << item

    if item.symbol_after_dot
      unless @items_n_and_symbol_after_dot[[item.n, item.symbol_after_dot]]
        @items_n_and_symbol_after_dot[[item.n, item.symbol_after_dot]] = []
      end
      @items_n_and_symbol_after_dot[[item.n, item.symbol_after_dot]] << item
    end
  end
end

#find(rule, dot, j, n) ⇒ Object



327
328
329
# File 'lib/kanocc/earley.rb', line 327

def find(rule, dot, j, n)
  @items_rule_dot_j_n[[rule, dot, j,n]]
end

#find_all_by_n(n) ⇒ Object



331
332
333
# File 'lib/kanocc/earley.rb', line 331

def find_all_by_n(n)
  @item_lists[n].clone
end

#full_items_by_lhs_j_and_n(lhs, j, n) ⇒ Object



343
344
345
346
347
348
349
# File 'lib/kanocc/earley.rb', line 343

def full_items_by_lhs_j_and_n(lhs, j, n)
  @item_lists[n].find_all do |item|
    item.dot >= item.rule.rhs.size and
    item.j == j and
    item.rule.lhs == lhs
  end
end

#items_at_n(n) ⇒ Object



351
352
353
# File 'lib/kanocc/earley.rb', line 351

def items_at_n(n)
  return @item_lists[n].clone
end

#items_n_and_symbol_after_dot(n, symbol) ⇒ Object



339
340
341
# File 'lib/kanocc/earley.rb', line 339

def items_n_and_symbol_after_dot(n, symbol)
  return @items_n_and_symbol_after_dot[[n, symbol]] || []
end

#number_at_n(n) ⇒ Object



335
336
337
# File 'lib/kanocc/earley.rb', line 335

def number_at_n(n)
  @item_lists[n].length
end

#prepare_for_n(n) ⇒ Object



305
306
307
# File 'lib/kanocc/earley.rb', line 305

def prepare_for_n(n)
  @item_lists[n] = []
end