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

4.0 KiB
Raw Permalink Blame History

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.

struct Span { line: u32, column: u32 }

Spanned<T>, herhangi bir AST node'unu kaynak kod konumuyla eşleştirir:

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 ı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 ı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 ı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)