.c
File für ein C-Programm oder ein .java
File für ein
Java-Programm.Die erste Phase des Compiler-Designs, bei der der Quelltext in Tokens zerlegt wird.
Gegeben sei der Pseudocode:
function add(x, y) {
return x + y;
}
1. `function` - Schlüsselwort
2. `add` - Identifikator
3. `(` - Symbol
4. `x` - Identifikator
5. `,` - Symbol
6. `y` - Identifikator
7. `)` - Symbol
8. `{` - Symbol
9. `return` - Schlüsselwort
10. `x` - Identifikator
11. `+` - Operator
12. `y` - Identifikator
13. `;` - Symbol
14. `}` - Symbol
function add(x, y) {
return x + y;
}
Der obige Code wird in folgende Tokens aufgeteilt:
Die zweite Phase des Compiler-Designs, bei der die Tokens auf ihre syntaktische Struktur geprüft werden.
Für den Pseudocode:
function add(x, y) {
return x + y;
}
ergibt sich folgender Syntaxbaum:
function
|
add
|
------------------------------
| |
params body
| |
------- ---------
| | | |
x y return expression
|
---------
| |
x y
Für den Pseudocode:
function add(x, y) {
return x + y;
}
führt die semantische Analyse folgende Prüfungen durch:
Variablendeklaration: Sind x und y deklariert?
Typüberprüfung: Können x und y addiert werden?
Rückgabetyp: Entspricht der Typ des Ausdrucks
x + y
dem erwarteten Rückgabetyp?
Die semantische Analyse stellt sicher, dass der Quellcode nicht nur syntaktisch korrekt, sondern auch logisch sinnvoll ist. Es wird überprüft, ob Operationen, Datentypen, Variablen und andere Programmstrukturen in einem sinnvollen und zulässigen Zusammenhang stehen.
x
in einem Ausdruck verwendet wird, überprüft der Compiler, ob x
zuvor deklariert wurde.+
nur auf numerische Typen angewendet wird. Wenn x
eine Ganzzahl (int
) und y
ein String (string
) ist, würde der Ausdruck x + y
einen Fehler verursachen.int
-Typ kann kein float
-Wert ohne Konvertierung zugewiesen werden.int
deklariert ist, sollte keinen string
-Wert zurückgeben.x
innerhalb einer Funktion verwendet wird, muss sichergestellt werden, dass sie in einem sichtbaren Gültigkeitsbereich deklariert wurde.break
-Befehl nur innerhalb einer Schleife gültig ist.return
-Anweisung nur innerhalb einer Funktion steht.Name | Typ | Speicherort | Gültigkeitsbereich |
---|---|---|---|
x | int | Register 1 | Funktion add
|
y | int | Register 2 | Funktion add
|
z | int | Register 3 | Funktion main
|
function (add)
|
add
|
--------------------------------
| |
params:(int x, int y) body
| |
------- ---------
| | | |
int x int y return expression
|
---------
| |
int x int y
Der Zwischencode ist eine maschinenunabhängige Darstellung des Quellcodes, die oft nach der semantischen Analyse generiert wird.
Basierend auf unserem Funktionssyntaxbaum könnte der Zwischencode in Drei-Adress-Code wie folgt aussehen:
func add:
param x
param y
t1 = x + y
ret t1