1
Files
lecture-interpreters/doc.org
Christoph 9c3a870992 add doc
2021-09-02 18:46:46 +02:00

2.7 KiB

DynLang Projekt Dokumentation

Sytaktischer Zucker

Es waren keine Anpassungen des Interpreters notwendig, nur eine Erweiterung des Lexings/Parsings.

Lexing

Es wurden neue Token definiert für

  • Arithmetische Operatoren (+, -, *, /, %, …)
  • Arithmetische Operatoren mit Assignment (+=, -=, …)
  • Vergleiche (<, <=, ==, …)
  • Logische Operatoren (&&, ||, !)

Parsing

Arithmetische, Vergleichs- und Logische Operatoren werden im Parser zu Methodenaufrufen der Builtin-Methoden übersetzt. Das Programm ist lauffähig, falls die Traits der entsprechenden Typen diese Methoden Implementieren.

Für Inplace-Operationen wird zusätzlich zum Builtin-Aufruf ein Assignment-Knoten im AST erzeugt.

Klammern von Ausdrücken ist ebenfalls möglich, dafür wird beim Parsing der geklammerte Ausdruck eine Ebene tiefer in den AST eingefügt.

Die Grammatik ist mehrdeutig, Präzedenz wird durch den Parsergenerator behandelt.

Primitive Datentypen

Es wurden die Typen Double, String und Boolean hinzugefügt.

Lexing

Es wurden neue Token definiert für

  • String Literale ("Hallo")
  • Boolean Literale ("true", "false")
  • Double Literale (1.2, 1., .1, -.1, …)

Parsing

Der AST wurde um Expression-Knoten für Double-, String- und Boolean-Literale erweitert (analog zum IntLiteral-Knoten). In der Grammatik können Double/String/Boolean Nichtterminale bei einer basicexpression auftreten.

Objectmodel

Die Boolean/String/Double/Int Objekte erben vom neuen PrimitiveObject, welches den zugehörigen Trait, die Parents, die Slots und den Wahrheitsgehalt bestimmt.

Der Objectspace bekommt Methoden zum Erzeugen eines neuen Boolean/String/Double.

Für jeden Datentyp wurde ein neuer Builtin-Trait hinzugefügt mit Methoden zum Vergleich/zur Conversion etc (mit den entprechenden Primitives).

Compiler/Interpreter

Es wurden neue Bytecodes für Literale hinzugefügt. Diese sind größtenteils identisch zum IntLiteral-Bytecode, nur der StringLiteral- und DoubleLiteral-Bytecode speichert den Inhalt in der Symboltabelle.

Die Bytecodes werden analog zu IntLiteral interpretiert, nur bei StringLiteral und DoubleLiteral wird aus der Symboltabelle geladen.

Garbage Collection

Es wurde Mark & Sweep verwendet.

Implementierung

Im Objectmodel wurde der AbstractObject Klasse ein GC-Flag "mark" gegeben.

Im Objectspace werden alle existierenden Objekte in einer Liste gehalten.

Ablauf:

  • Alle Markierungen entfernen
  • Markieren (rekursiv ausgehend von der Lobby, diese wird also immer markiert)
  • Entfernen (aus der Liste im Objectspace)

Aufruf aus Simple

Es wurde die "gc" Anweisung hinzugefügt: AST-Knoten (GCStatement) und Bytecode (GC)

Der Interpreter ruft im Objectspace die "gc()" auf und legt "true" auf den Stack, da ein Rückgabewert nötig ist.