83324a1892
Add a new Markdown document detailing the AST node structure as it evolves through the compiler's different stages. This includes a diagram illustrating the data flow and relationships between the generic `Node<K, T>` structure and its specialized forms (`UntypedNode`, `BoundNode`, `TypedNode`, `AnalyzedNode`). The document explains the `kind` and `ty` payloads for each stage and their significance. Also removes a deleted file related to a previous optimization plan and adds new files for future optimization plans.
4.1 KiB
4.1 KiB
AST Node-Struktur über Compiler-Stages
Dieses Dokument beschreibt die Architektur der AST-Knoten (Abstract Syntax Tree) über die verschiedenen Phasen des Compilers hinweg. Die Rust-Implementierung nutzt eine generische Node<K, T> Struktur, die in jeder Phase strikt typisiert wird, um Fehlerklassen der ursprünglichen Delphi-Architektur zu vermeiden.
Architektur & Datenfluss
Der Compiler verarbeitet den AST in mehreren Stufen. Statt die Knoten in-place zu mutieren, erzeugt jede Phase einen neuen, typsicheren und spezialisierten Baum.
classDiagram
direction TB
class Node~K,T~ {
+Identity identity
+K kind
+T ty
}
class UntypedKind {
<<enumeration>>
Identifier(Symbol)
Parameter(Symbol)
Def(Target, Value)
Assign(Target, Value)
MacroDecl(...)
Template(...)
Splice(...)
...
}
class BoundKind~T~ {
<<enumeration>>
Get(Address, Symbol)
Set(Address, Value)
Define(Symbol, Address, Kind, Value, Captures)
GetField(Record, Keyword)
Destructure(Pattern, Value)
Lambda(Params, Upvalues, Body)
...
}
class StaticType {
<<struct>>
// Type Information
}
class NodeMetrics {
<<struct>>
+Rc~TypedNode~ original
+Purity purity
+bool is_recursive
}
%% Typedefs und Spezialisierungen
class UntypedNode {
<<type alias>>
Node~UntypedKind, ()~
}
class BoundNode {
<<type alias>>
Node~BoundKind~()~, ()~
}
class TypedNode {
<<type alias>>
Node~BoundKind~StaticType~, StaticType~
}
class AnalyzedNode {
<<type alias>>
Node~BoundKind~NodeMetrics~, NodeMetrics~
}
Node <|-- UntypedNode : binds
UntypedNode *-- UntypedKind : uses
Node <|-- BoundNode : binds
BoundNode *-- BoundKind : uses
Node <|-- TypedNode : binds
TypedNode *-- StaticType : uses T
TypedNode *-- BoundKind : uses K
Node <|-- AnalyzedNode : binds
AnalyzedNode *-- NodeMetrics : uses T
AnalyzedNode *-- BoundKind : uses K
%% Phasen-Übergänge
UntypedNode ..> BoundNode : Parser & Binder
(Namensauflösung)
BoundNode ..> TypedNode : TypeChecker
(Typ-Inferenz)
TypedNode ..> AnalyzedNode : Analyzer
(Purity, Rekursion)
Compiler Stages im Detail
-
Parser (Untyped AST)
- Typ:
Node<UntypedKind, ()>(Alias: Keiner, direkt genutzt) - Beschreibung: Der vom Parser erstellte Roh-Baum. Bezeichner (
Identifier,Def,Assign) sind lediglich Namen (Symbols). Beinhaltet Strukturen für das Macro-System (MacroDecl,Template,Splice). - Payload (
T):()(Keine Metadaten)
- Typ:
-
Binder (Bound AST)
- Typ:
BoundNode<()>bzw.Node<BoundKind<()>, ()> - Beschreibung: Namensauflösung und Scope-Analyse wurden durchgeführt. Namen wurden in physische Adressen (
Address:LocalSlot,UpvalueIdx,GlobalIdx) überführt. Neue Knoten wieGet,Set,Definelösen die untypisierten Varianten ab. Closures kennen nun ihreUpvalues(gefangene Variablen). Macros wurden vollständig expandiert. - Payload (
T):()
- Typ:
-
Type Checker (Typed AST)
- Typ:
TypedNodebzw.Node<BoundKind<StaticType>, StaticType> - Beschreibung: Statische Typprüfung. Die Kern-Struktur (
BoundKind) bleibt erhalten, aber jeder Knoten trägt nun seinen verifizierten statischen Typ (StaticType) in der Eigenschaftty. - Payload (
T):StaticType
- Typ:
-
Analyzer / Optimizer (Analyzed AST)
- Typ:
AnalyzedNodebzw.Node<BoundKind<NodeMetrics>, NodeMetrics> - Beschreibung: Vorbereitung für die Optimierung. Sammelt wichtige Metadaten pro Knoten für den Optimizer.
- Payload (
T):NodeMetrics(enthält Metadaten wiePurity(Ist der Knoten seiteneffektfrei?),is_recursivesowie eine Referenz auf den originalenTypedNode)
- Typ: