class Racc::State
A LALR state.
Attributes
action[R]
closure[R]
core[R]
defact[RW]
goto_table[R]
gotos[R]
hash[R]
ident[R]
ritems[R]
rrconf[R]
rrules[R]
srconf[R]
stateid[R]
stokens[R]
Public Class Methods
new(ident, core)
click to toggle source
# File lib/racc/state.rb, line 609 def initialize(ident, core) @ident = ident @core = core @goto_table = {} @gotos = {} @stokens = nil @ritems = nil @action = {} @defact = nil @rrconf = nil @srconf = nil @closure = make_closure(@core) end
Public Instance Methods
==(oth)
click to toggle source
# File lib/racc/state.rb, line 650 def ==(oth) @ident == oth.ident end
Also aliased as: eql?
check_la(la_rules)
click to toggle source
# File lib/racc/state.rb, line 667 def check_la(la_rules) @conflict = false s = [] r = [] @closure.each do |ptr| if t = ptr.dereference if t.terminal? s[t.ident] = t if t.ident == 1 # $error @conflict = true end end else r.push ptr.rule end end unless r.empty? if not s.empty? or r.size > 1 @conflict = true end end s.compact! @stokens = s @rrules = r if @conflict @la_rules_i = la_rules.size @la_rules = r.map {|i| i.ident } la_rules.concat r else @la_rules_i = @la_rules = nil end end
conflict?()
click to toggle source
# File lib/racc/state.rb, line 701 def conflict? @conflict end
inspect()
click to toggle source
# File lib/racc/state.rb, line 644 def inspect "<state #{@ident}>" end
Also aliased as: to_s
la=(la)
click to toggle source
# File lib/racc/state.rb, line 718 def la=(la) return unless @conflict i = @la_rules_i @ritems = r = [] @rrules.each do |rule| r.push Item.new(rule, la[i]) i += 1 end end
make_closure(core)
click to toggle source
# File lib/racc/state.rb, line 656 def make_closure(core) set = ISet.new core.each do |ptr| set.add ptr if t = ptr.dereference and t.nonterminal? set.update_a t.expand end end set.to_a end
n_rrconflicts()
click to toggle source
# File lib/racc/state.rb, line 754 def n_rrconflicts @rrconf ? @rrconf.size : 0 end
n_srconflicts()
click to toggle source
# File lib/racc/state.rb, line 750 def n_srconflicts @srconf ? @srconf.size : 0 end
rr_conflict(high, low, ctok)
click to toggle source
# File lib/racc/state.rb, line 728 def rr_conflict(high, low, ctok) c = RRconflict.new(@ident, high, low, ctok) @rrconf ||= {} if a = @rrconf[ctok] a.push c else @rrconf[ctok] = [c] end end
rruleid(rule)
click to toggle source
# File lib/racc/state.rb, line 705 def rruleid(rule) if i = @la_rules.index(rule.ident) @la_rules_i + i else puts '/// rruleid' p self p rule p @rrules p @la_rules_i raise 'racc: fatal: cannot get reduce rule id' end end
sr_conflict(shift, reduce)
click to toggle source
# File lib/racc/state.rb, line 739 def sr_conflict(shift, reduce) c = SRconflict.new(@ident, shift, reduce) @srconf ||= {} if a = @srconf[shift] a.push c else @srconf[shift] = [c] end end