Gegeben ist folgende Grammatik:
table = header { tuple } header = attr { ":" attr } "12C" tuple = value { ":" value } "12C" attr = string value = string | number string = {"A" "B" ... "Z" "a" "b" ... "z"} number = { "0" "1" ... "9" }Anm.: Die in Apostroph gesetzten Symbole sind Terminalsymbole.
Zu einem Programm, das mit der so definierten Grammatik arbeiten soll, sollen Sie nun eine Datenstruktur (Typ-Definitionen) entwickeln, die einen "Satz" dieser Sprache aufnehmen kann. Um die Sache zu erleichtern bzw. klarer zu definieren, sei folgendes Beispiel gegeben:
Der Doppelpunkt in der Definition wird also in der Datenstruktur nicht wiedergegeben, da die Trennung der Objekte attr bzw. value in der Listenstruktur durch Ablegen in einzelnen Listenelementen erkennbar ist. Die in der Grafik angegebenen Indizes (z.B. value(1,2)) sollen nicht als Array-Indizes verstanden werden.
Geben Sie geeignete Typ-Definitionen an, so daß eine Variable anker vereinbart werden kann!
CONST Max = 20; TYPE String = ARRAY[0..Max] OF CHAR; Art = (a,v); Value = RECORD CASE art: Art OF | a: attr: String; | v: value: CARDINAL END END; AttrRecPointer = POINTER TO AttrRecord; ValueRecPointer = POINTER TO ValueRecord; AttrRecord = RECORD attr: String; nextAttr: AttrRecPointer; nextValue: ValueRecPointer; END; ValueRecord = RECORD val: Value; next,tuple: ValueRecPointer END;