# 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

eql?(oth)
Alias for: ==
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

to_s()
Alias for: inspect