mirror of
https://github.com/duhanbalci/dexpr.git
synced 2026-07-01 16:19:16 +00:00
118 lines
4.0 KiB
Markdown
118 lines
4.0 KiB
Markdown
# 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)
|
||
```
|