Files
dexpr/docs/ast.md
2026-04-07 15:16:19 +03:00

118 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AST (Abstract Syntax Tree) Modülü
**Konum:** `src/ast/`
AST modülü, parser tarafından üretilen ve compiler tarafından tüketilen ağaç yapısını tanımlar. Üç alt modülden oluşur: `expr.rs`, `stmt.rs`, `value.rs`.
---
## Span & Spanned
**Dosya:** `src/ast/expr.rs`
`Span`, kaynak koddaki bir konumu (satır, sütun) temsil eder. 1-indexed'tir.
```rust
struct Span { line: u32, column: u32 }
```
`Spanned<T>`, herhangi bir AST node'unu kaynak kod konumuyla eşleştirir:
```rust
struct Spanned<T> { node: T, span: Span }
```
`dummy()` metodu test ve internal kullanım için varsayılan konum oluşturur.
---
## Expr (İfadeler)
**Dosya:** `src/ast/expr.rs`
**Type alias:** `SpannedExpr = Spanned<Expr>`
`Expr` enum'u tüm ifade türlerini kapsar:
| Variant | Açıklama | Örnek |
|---------|----------|-------|
| `Value(Value)` | Sabit değer (literal) | `42`, `"hello"`, `true` |
| `Variable(SmolStr)` | Değişken referansı | `x`, `result` |
| `BinaryOp(Box<Expr>, Op, Box<Expr>)` | İkili operasyon | `a + b`, `x > 5` |
| `UnaryOp(Op, Box<Expr>)` | Tekli operasyon | `-x`, `!flag` |
| `FunctionCall(SmolStr, Vec<Expr>)` | Built-in fonksiyon çağrısı | `log(x)` |
| `MethodCall(Box<Expr>, SmolStr, Vec<Expr>)` | Metod çağrısı | `name.upper()`, `text.split(",")` |
| `PropertyAccess(Box<Expr>, SmolStr)` | Özellik erişimi | `obj.field`, `person.name` |
> **Not:** `FunctionCall` hem built-in (`log`) hem de harici (host) fonksiyonlar için kullanılır. Built-in olmayan fonksiyonlar `CallExternal` opcode'u ile derlenir ve VM tarafından runtime'da çözümlenir.
---
## Op (Operatörler)
**Dosya:** `src/ast/expr.rs`
| Kategori | Operatörler |
|----------|-------------|
| Aritmetik | `Add`, `Sub`, `Mul`, `Div`, `Mod`, `Pow` |
| Karşılaştırma | `Lt`, `Lte`, `Gt`, `Gte`, `Eq`, `Neq` |
| Boolean | `And`, `Or`, `Not` |
| Üyelik | `In` (değer listede/string'de var mı) |
| Tekli | `Neg` (negatif) |
---
## Stmt (İfadeler/Deyimler)
**Dosya:** `src/ast/stmt.rs`
**Type alias:** `SpannedStmt = Spanned<Stmt>`
| Variant | Açıklama | Sözdizimi |
|---------|----------|-----------|
| `Assignment(SmolStr, Box<Expr>)` | Değişken ataması | `x = 5` |
| `ExprStmt(Box<Expr>)` | İfade deyimi | `log(x)` |
| `If(Box<Expr>, Vec<Stmt>, Option<Vec<Stmt>>)` | Koşullu deyim | `if x > 0 then ... end` |
| `PropertyAssignment(SmolStr, Vec<SmolStr>, Box<Expr>)` | Özellik ataması | `a.b.c = expr` |
---
## Value (Çalışma Zamanı Değerleri)
**Dosya:** `src/ast/value.rs`
| Variant | Rust Tipi | Açıklama |
|---------|-----------|----------|
| `Null` | - | Boş değer |
| `Number(Decimal)` | `rust_decimal::Decimal` | Keyfi hassasiyetli ondalık sayı |
| `String(SmolStr)` | `smol_str::SmolStr` | Optimize edilmiş string |
| `Boolean(bool)` | `bool` | Mantıksal değer |
| `NumberList(Vec<Decimal>)` | `Vec<Decimal>` | Sayı listesi |
| `StringList(Vec<SmolStr>)` | `Vec<SmolStr>` | String listesi |
| `Object(IndexMap<SmolStr, Value>)` | `IndexMap<SmolStr, Value>` | Anahtar-değer nesnesi |
| `List(Vec<Value>)` | `Vec<Value>` | Genel liste (object array dahil) |
### Serileştirme
Her `Value` bytecode'a gömülebilir. Serileştirme formatı:
1. **Tip etiketi** (1 byte): `NULL=0x00`, `NUMBER=0x01`, `STRING=0x02`, `BOOLEAN=0x03`, `NUMBER_LIST=0x04`, `STRING_LIST=0x05`, `OBJECT=0x06`, `LIST=0x07`
2. **Veri:**
- Number: 16 byte (Decimal serialization)
- String: 2-byte uzunluk + UTF-8 bytes
- Boolean: 1 byte (0 veya 1)
- NumberList: 2-byte count + her sayı için 16 byte
- StringList: 2-byte count + her string için (2-byte uzunluk + bytes)
- Object: 2-byte entry count + her girdi için (anahtar: 2-byte uzunluk + bytes, değer: rekürsif serialize)
- List: 2-byte count + her eleman için rekürsif serialize
`serialize()` ve `deserialize()` metodları bu dönüşümü gerçekleştirir.
---
## Modüller Arası İlişki
```
Parser --> Expr, Stmt, Value (AST üretir)
Compiler <-- Expr, Stmt, Value (AST tüketir, bytecode üretir)
VM <-- Value (çalışma zamanında değer olarak kullanılır)
```