A LALR state.
# File ruby-3.1.2/lib/racc/state.rb, line 650
def ==(oth)
@ident == oth.ident
end
# File ruby-3.1.2/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
# File ruby-3.1.2/lib/racc/state.rb, line 701
def conflict?
@conflict
end
# File ruby-3.1.2/lib/racc/state.rb, line 644
def inspect
"<state #{@ident}>"
end
# File ruby-3.1.2/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
# File ruby-3.1.2/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
# File ruby-3.1.2/lib/racc/state.rb, line 754
def n_rrconflicts
@rrconf ? @rrconf.size : 0
end
# File ruby-3.1.2/lib/racc/state.rb, line 750
def n_srconflicts
@srconf ? @srconf.size : 0
end
# File ruby-3.1.2/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
# File ruby-3.1.2/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