[Übersetzerbau 1] Fragen zur Sprachbeschreibung

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

[Übersetzerbau 1] Fragen zur Sprachbeschreibung
Paar Fragen zur Sprachbeschreibung, die mir auch nach mehrmaligen Lesen nicht ganz klar sind. Kurze Suche in diesem Unterforum ergab auch nichts, sorry falls ich was übersehen hab.

Verstehe ich richtig:

1. “rundet nach 0 auf die nächste ganze Zahl” bedeutet:
-9.001 → -9
0.2323 → 1

2. Boolean als Datentyp existieren nicht innerhalb der Sprache, nur intern im Übersetzer (zB bei Type in python-Vorlage: getBoolType).

3. Implizite Wandlung findet ausschließlich statt bei
a) arith. Ausdrücken (Richtung real).
b) einer return-Anweisung (Richtung Rückgabetyp).

4. Typgerechte Array-Zuweisungen sind nicht erlaubt. zB:
a) int[2][2] a;
int[2][2] b;

a := b;

b) int[3][5] c;
int[5] d;

c[1] := d; // iSv kurz für c[1][0] := d[0]; c[1][1] = d[1]; …

5. Bei Arrays sind passende Funktionsaufrufe in Deklaration, Definition bzw. Zugriff nicht erlaubt. zB mit "int vier() { return 4; }":
a) int[vier()] arr;

b/c) arr[vier()-1] := 4 - arr[vier()-2];

6. Arrays sind als Funktionsparameter nicht erlaubt. Auch nicht etwa
writeInt(d[2]);


Ja.

Das getBoolType() in der Python-Vorlage muss nicht verwendet werden.
Du darfst Boolean als Datentyp intern im Übersetzer einführen - musst Du aber nicht…

Nein. Funktionsaufrufe, Zuweisungen, Vergleiche, etc…

Nein.

In einer Array-Deklaration nicht, hier sind nur konstante Ausdrücke erlaubt.

Im Zugriff schon.

Richtig.


Als Beispiel:

int[3][3] d;

x := writeInt(d); // Verboten
x := writeInt(d[1]); // Verboten
x := writeInt(d[1][1]); // Erlaubt
x := writeInt(d[1][1]1[1]); // Verboten

Kurzer Hinweis: Die letzten zwei Fragen wären auch durch einen Blick in die Testsuite beantwortet worden.

(Ich will damit niemandem vom Nachfragen abhalten, sondern nur auf eine weitere mögliche Quelle von Antworten hinweisen :slight_smile: )

1 „Gefällt mir“

[quote=jabot]

Nein.

[quote=misc]
[/quote][/quote]

Danke… nur um sicher zu gehen: Doppelte Verneinung, das heißt meine beiden genannten Fälle sind erlaubt? (In 4b steckt auch die Frage, ob bei einem Array-Zugriff immer alle Dimensionen verwendet/gegeben werden müssen.)

Noch etwas: Es heißt, Variablen „müssen vor Benutzung definiert werden.“ Wird das nicht hinfällig dadurch dass sie einen impliziten Initialwert haben sollen – also bereits implizit definiert werden? (Dass der Initialwert selber undefiniert ist mWn irrelevant – ohne implizite Definition könnte er ja gar nicht existieren.)

Zur Testsuite: Die Programme sind alle grammatikalisch korrekt?

Zu Funktionen: Inwiefern muss sichergestellt werden, dass ein Aufruf in einem return endet? Reicht es schon zu checken, dass die Funktion über irgendeine return-Anweisung verfügt?

1 „Gefällt mir“

Es gibt (im entsprechenden Unterverzeichnis) grammatikalisch inkorrekte Programme. Es ist undefiniertes Verhalten, wenn ein Kontrollflusspfad der eine Funktion verlässt keine return-Anweisung hat.


Ups, übersehen. Danke.


[quote=misc:1446750208]

[quote=jabot]

Nein.

Nein. Ja – Wikipedia

Es gibt keinen „impliziten Initialwert“, also wird auch nichts hinfällig.
Genau wie in Java oder C darfst du eine Variable erst nach der zugehörigen Variablendeklaration benutzen.
Außerdem ist der Initialwert der Variablen nach ihrer Deklaration undefiniert.