Nach der Erzeugung des abstrakten Programmbaums überprüfen wir die Kontextbedingungen. Dazu wird jedes syntaktische Objekt mit einer is-wellformed-Funktion versehen, die die Kontextbedingungen für dieses Objekt prüft:
Boolean AssNode::Iswf(ObjType &t)
{
ObjType t1, t2;
t = typNONE;
if ((l != NULL) && (r != NULL))
if(l->Iswf(t1))
if (r->Iswf(t2))
if (t1 == t2) return TRUE;
else return FALSE;
else return FALSE;
else return FALSE;
else return FALSE;
}
Eine Zuweisung besteht aus der linken und der rechten Seite, die beide vorhanden sein müssen. Wenn beide Seiten die jeweils ihre eigenen Kontextbedingungen erfüllen und die Typen übereinstimmen, ist auch die ganze Zuweisung in Ordnung.
Die linke und die rechte Seite sind Objekte des Typs IdNode:
Boolean IdNode::Iswf(ObjType &t)
{
Entry *s;
s = myEnv->Search(str);
if (s == NULL)
{
cerr << str << " nicht deklariert!" << endl;
return FALSE;
}
t = s->GetType(); return TRUE;
}
Hier wird geprüft, ob der Identifikator deklariert wurde. In der Referenz t wird der Typ zurückgegeben.
Variablendeklarationen setzen sich aus einer Liste von Identifikatoren und einem Typ zusammen. Die einzelnen Variablen werden in das Adreßbuch eingetragen und erhalten eine Adresse.
Boolean VarNode::Iswf(ObjType &t)
{
Entry *newEntry, *s;
s = myEnv->Search(str);
if (s != NULL)
{
cerr << str << " mehrfach deklariert!" << endl;
return FALSE;
}
else
{
newEntry = new Entry(str, isvar, typINT, NextAddr());
myEnv->Insert(newEntry);
t = typINT;
return TRUE;
}
}
Zum Abschluß betrachten wir die Kontextbedingungen für die WHILE -Anweisung:
Boolean WhileNode::Iswf(ObjType &t)
{
ObjType t1;
t = typNONE;
if ((l != NULL) && (r != NULL))
if(l->Iswf(t1))
if (t1 == typBOOL)
if (r->Iswf(t1)) return TRUE;
return FALSE;
}
Prof. Dr. Reinhard Völler