# 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