A LALR state.
# File lib/racc/state.rb, line 608
608: def initialize(ident, core)
609: @ident = ident
610: @core = core
611: @goto_table = {}
612: @gotos = {}
613: @stokens = nil
614: @ritems = nil
615: @action = {}
616: @defact = nil
617: @rrconf = nil
618: @srconf = nil
619:
620: @closure = make_closure(@core)
621: end
# File lib/racc/state.rb, line 649
649: def ==(oth)
650: @ident == oth.ident
651: end
# File lib/racc/state.rb, line 666
666: def check_la(la_rules)
667: @conflict = false
668: s = []
669: r = []
670: @closure.each do |ptr|
671: if t = ptr.dereference
672: if t.terminal?
673: s[t.ident] = t
674: if t.ident == 1 # $error
675: @conflict = true
676: end
677: end
678: else
679: r.push ptr.rule
680: end
681: end
682: unless r.empty?
683: if not s.empty? or r.size > 1
684: @conflict = true
685: end
686: end
687: s.compact!
688: @stokens = s
689: @rrules = r
690:
691: if @conflict
692: @la_rules_i = la_rules.size
693: @la_rules = r.map {|i| i.ident }
694: la_rules.concat r
695: else
696: @la_rules_i = @la_rules = nil
697: end
698: end
# File lib/racc/state.rb, line 700
700: def conflict?
701: @conflict
702: end
# File lib/racc/state.rb, line 643
643: def inspect
644: "<state #{@ident}>"
645: end
# File lib/racc/state.rb, line 717
717: def la=(la)
718: return unless @conflict
719: i = @la_rules_i
720: @ritems = r = []
721: @rrules.each do |rule|
722: r.push Item.new(rule, la[i])
723: i += 1
724: end
725: end
# File lib/racc/state.rb, line 655
655: def make_closure(core)
656: set = ISet.new
657: core.each do |ptr|
658: set.add ptr
659: if t = ptr.dereference and t.nonterminal?
660: set.update_a t.expand
661: end
662: end
663: set.to_a
664: end
# File lib/racc/state.rb, line 753
753: def n_rrconflicts
754: @rrconf ? @rrconf.size : 0
755: end
# File lib/racc/state.rb, line 749
749: def n_srconflicts
750: @srconf ? @srconf.size : 0
751: end
# File lib/racc/state.rb, line 727
727: def rr_conflict(high, low, ctok)
728: c = RRconflict.new(@ident, high, low, ctok)
729:
730: @rrconf ||= {}
731: if a = @rrconf[ctok]
732: a.push c
733: else
734: @rrconf[ctok] = [c]
735: end
736: end
# File lib/racc/state.rb, line 704
704: def rruleid(rule)
705: if i = @la_rules.index(rule.ident)
706: @la_rules_i + i
707: else
708: puts '/// rruleid'
709: p self
710: p rule
711: p @rrules
712: p @la_rules_i
713: raise 'racc: fatal: cannot get reduce rule id'
714: end
715: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.