Files
RustAst/docs/AST_Node_Structure.md
T
Michael Schimmel 83324a1892 feat: Document AST node structure across compiler stages
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.
2026-02-27 08:58:38 +01:00

119 lines
4.1 KiB
Markdown

# 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.
```mermaid
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
1. **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)
2. **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 wie `Get`, `Set`, `Define` lösen die untypisierten Varianten ab. Closures kennen nun ihre `Upvalues` (gefangene Variablen). Macros wurden vollständig expandiert.
* **Payload (`T`):** `()`
3. **Type Checker (Typed AST)**
* **Typ:** `TypedNode` bzw. `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 Eigenschaft `ty`.
* **Payload (`T`):** `StaticType`
4. **Analyzer / Optimizer (Analyzed AST)**
* **Typ:** `AnalyzedNode` bzw. `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 wie `Purity` (Ist der Knoten seiteneffektfrei?), `is_recursive` sowie eine Referenz auf den originalen `TypedNode`)