Codegenerierung

Der zu generierende Code wird prozedurweise erzeugt und ausgegeben. Es wird jeweils der Code einer Prozedur in den Codeausgabepuffer geschrieben und am Ende der Prozedur wird der Puffer in das Codefile geschrieben und wieder als leer gekennzeichnet. Die Codeausgabe wird über einen Satz von Funktionen realisiert. Folgende Funktionen zur Codeerzeugung sind verfügbar:

Die zentrale Funktion ist die Funktion code, eine Funktion mit variabler Argumentliste. Sie bekommt den Befehlscode, ggf. gefolgt von den anzugebenden Parametern.

Beispiele:

code(entryProc,0,pCurrPr->IdxProc,0);

code(retProc);

code(puAdrVrLocl,pV->Dspl);


Die Datei CodeGen.c enthält eine Reihe von Funktionen zur Unterstützung der Codegenerierung.


/*----------------------------------------------*/
/*Schreiben von Code in den Codeausgabebereich */
int code(tCode Code,...);
/*----------------------------------------------*/
/* Schreiben von Code in die Ausgabedatei */
int CodeOut(void);

/*--------------------------------------*/
/* Oeffnen/Schliessen der Ausgabedatei */
int openOFile(char* arg);

int closeOFile(void);


Intern werden zum Schreiben der Parameter folgende Funktionen verwendet. Sie stellen sicher, das diese Werte in einer einheitlichen, plattformunabhngigen Weise in das Codefile geschrieben werden. Für Konstanten gilt gleiches in der Länge 4.

void wr2ToCode(short x)
{
*pCode++=(unsigned char)(x & 0xff);
*pCode++=(unsigned char)(x >> 8);
}

void wr2ToCodeAtP(short x,char*pD)
{
  * pD =(unsigned char)(x & 0xff); 
  *(pD+1)=(unsigned char)(x >> 8);
}


Die Generierung der Zwischencodebefehle geschieht in den semantischen Aktionen.


programm

block

statement

Condition

expression

Term

Factor