# File actiontables.rb, line 163
  def initialize(dea)
    # Alle Zustände in einem Hash speichern und ihnen einen "ordentlichen" Namen
    # nach folgendem Muster zuweissen: K[i] wobei i eine Nummer ist.
    # Eine Tablle ist ein Hash, mit Namen von Zuständen (das ist der Key), denen die Aktionen zugewiesen werden.
    # Eine Aktion kann sein (s.S. 155 u. 178):
    # * Reduktion
    # * Accept
    # * Shift
    # * Error
    super
                
    @conflictArray = Array.new
    conflictZust = Array.new
    # in der Tabelle alle Einträge durchlaufen und alle NonTerminale Spalten entfernen
    @tabelle.each{|zKey,zeile|
     hasshift = false
     hasreduk = false
      @uSymbole.each_key{|symb|
        countReduk=0
        #puts symb.class
        if !symb.terminal
          # Wir haben ein NonTerminal
          # also aus der Tabelle entfernen und zustätzlich aus der Tabelle uSymb entfernen
          zeile.delete(symb)
          @uSymbole.delete(symb)
        else
          # Wenn es ein Übegang zu einem Zustand ist, dann wird es ein Shift
          if zeile[symb.to_s] != "-"
            zeile[symb.to_s] = "shift"
            hasshift = true
          else 
            # Berechnen, ob es ein Reduce oder ein Error ist
            # iterieren durch die Items eines Zustands
            @zusths[zKey].each{|item|
              # Is das vorletze Zeichen ein Punkt(:=46), dann ist es eine Reduktion
              if item.to_s[-2] == 46
                
                if item.getRechtskontext.enthaelt?(symb.to_s) or item.getRechtskontext.length == 0
                countReduk += 1
                hasreduk = true
                @tabelle[zKey][symb.to_s] = "red#{item.to_s}"
                                                                if symb.to_s == "#" and zeile[symb.to_s].include? "red[S' ->"
                                                                        zeile[symb.to_s] = "accept"
                                                                end
                                end                         
              end
            }
          end
        end
      #Alle Zustände mit möglichen Konflikten werden in einem Array abgelegt.
      if (hasshift == true and hasreduk) or countReduk > 1
       (conflictZust.include?(@zusths[zKey])) ? () : (conflictZust.push(@zusths[zKey]))
      end
      }     
      zeile.default= "error"  
    }
    
    #Das Array mit den Konfliktzuständen genauer überprüfen, ob es wirklich Konflikte sind.
    conflictZust.each{|zustand|
      #überprüfen ob es ein Shift-Reduce-Konflikt ist
      zustand.each{|item|
        nextSymb = item.naechstesZeichen      
        zNeu = zustand.items.copy.array.delete_if{|i| i == item}
        #wenn nextSymb nicht nil ist, dann ist es ein Shift, sonst Reduce
        if nextSymb != nil
        # Überprüfen, ob in der Menge der Items des Zustands, das nächste Symbol als Rechtskontext vorkommt
        # wenn ja dann ist es ein Shift-Reduce Konflikt.
        zNeu.each{|item2|
          (item2.getRechtskontext.enthaelt?(nextSymb) and item2.to_s[-2] == 46) ? (zn=@zusths.invert[zustand];@conflictArray.push("#{zn} : Shift-Reduce-Konflikt")) : ()
        }
        else
        # Überprüfen, ob ein Reduce-Reduce-Konflikt auftritt
        # Das liegt vor, wenn ein Zeichen aus dem Rechtskontext des aktuellen Items
        # auch im Rechtskontext der anderen Items vorhanden ist und es müssen beide Reduktionen sein
        item.getRechtskontext.each{|symb|
          zNeu.each{|item2|
            (item2.getRechtskontext.enthaelt?(symb) and item2.to_s[-2] == 46) ? (zn=@zusths.invert[zustand];@conflictArray.push("#{zn} : Reduce-Reduce-Konflikt")) : ()
          }
        }
        end   
      }
      
    }    
  end