Aufgabe 6

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!

Lösung


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;