mirror of
https://github.com/duhanbalci/dexpr.git
synced 2026-08-30 16:01:41 +00:00
0.4.1
This commit is contained in:
@@ -69,6 +69,20 @@ Parse ile birlikte pozisyon bilgisi de toplar ve `DebugInfo` üretir.
|
||||
1. İfadeyi register'a derle
|
||||
2. `StoreGlobal` emit et (tüm değişkenler global)
|
||||
|
||||
### Mantıksal Operatörler (`&&`, `\|\|`) — Short-Circuit
|
||||
|
||||
`compile_logical_op()`; `And`/`Or` opcode'u yerine atlama ile derlenir, sağ taraf gerekmedikçe çalışmaz (`x != null && x.name == "a"` x null iken hata vermez):
|
||||
|
||||
```
|
||||
<left> -> rL
|
||||
JumpIfFalse rL, END (|| için JumpIfTrue)
|
||||
<right> -> rR
|
||||
Move rL, rR (rR == rL ise atlanır)
|
||||
END: sonuç rL'de
|
||||
```
|
||||
|
||||
Sol register sağ taraf derlenmeden önce serbest bırakılır (değeri sadece atlama yolunda lazım), böylece sağ taraf çoğunlukla aynı register'a düşer ve `Move` gerekmez. Sol operand Boolean olmak zorundadır (JumpIf* tip kontrolü yapar); sağ operandın değeri sonuç olarak geçer (`true && 1` → `1`).
|
||||
|
||||
### If Statement (Koşullu Deyim)
|
||||
|
||||
```
|
||||
|
||||
@@ -62,7 +62,7 @@ Tüm built-in fonksiyon ve metodları içeren yeni bir `LanguageInfo` oluşturur
|
||||
| `NumberList` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `sort`, `sum`, `avg`, `min`, `max` |
|
||||
| `StringList` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `sort`, `join` |
|
||||
| `Object` | `keys`, `values`, `length`, `len`, `contains`, `get` |
|
||||
| `List` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `join`, `map`, `filter`, `find`, `sort` |
|
||||
| `List` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `join`, `map`, `filter`, `find`, `sort`, `sum`, `avg`, `min`, `max` |
|
||||
|
||||
### `add_function(name, signature, doc)`
|
||||
|
||||
|
||||
+3
-2
@@ -53,8 +53,8 @@ Bytecode komut setini (instruction set) tanımlar. Her opcode bir `u8` değerine
|
||||
|
||||
| Opcode | Değer | Açıklama |
|
||||
|--------|-------|----------|
|
||||
| `And` | `0x50` | Mantıksal VE |
|
||||
| `Or` | `0x51` | Mantıksal VEYA |
|
||||
| `And` | `0x50` | Mantıksal VE (compiler artık emit etmiyor; `&&` JumpIfFalse ile derlenir) |
|
||||
| `Or` | `0x51` | Mantıksal VEYA (compiler artık emit etmiyor; `\|\|` JumpIfTrue ile derlenir) |
|
||||
| `Not` | `0x52` | Mantıksal DEĞİL |
|
||||
|
||||
### Kontrol Akışı
|
||||
@@ -63,6 +63,7 @@ Bytecode komut setini (instruction set) tanımlar. Her opcode bir `u8` değerine
|
||||
|--------|-------|----------|
|
||||
| `Jump` | `0x60` | Koşulsuz atlama |
|
||||
| `JumpIfFalse` | `0x61` | Register false ise atla |
|
||||
| `JumpIfTrue` | `0x62` | Register true ise atla (`\|\|` short-circuit) |
|
||||
|
||||
### Üyelik Testi
|
||||
|
||||
|
||||
+11
-8
@@ -45,14 +45,17 @@ Byte offset'ini 1-indexed satır ve sütuna dönüştürür. UTF-8 karakter sın
|
||||
|
||||
En düşükten en yükseğe:
|
||||
|
||||
1. Method çağrıları, fonksiyon çağrıları
|
||||
2. Mantıksal AND (`&&`)
|
||||
3. Mantıksal OR (`||`)
|
||||
4. Karşılaştırma (`==`, `!=`, `<`, `<=`, `>`, `>=`, `in`)
|
||||
5. Toplama/Çıkarma (`+`, `-`)
|
||||
6. Çarpma/Bölme/Mod (`*`, `/`, `%`)
|
||||
7. Üs alma (`**`) - sağdan birleşimli (right-associative)
|
||||
8. Tekli operatörler (`-`, `!`), atomik ifadeler
|
||||
1. Fonksiyon çağrıları
|
||||
2. Mantıksal OR (`||`) — soldan birleşimli
|
||||
3. Mantıksal AND (`&&`) — soldan birleşimli (`a && b || c` = `(a && b) || c`)
|
||||
4. Karşılaştırma (`==`, `!=`, `<`, `<=`, `>`, `>=`, `in`) — soldan birleşimli
|
||||
5. Toplama/Çıkarma (`+`, `-`) — soldan birleşimli (`10 - 3 - 2` = `5`)
|
||||
6. Çarpma/Bölme/Mod (`*`, `/`, `%`) — soldan birleşimli
|
||||
7. Tekli operatörler (`-`, `!`) — `unary()` kuralı; postfix ve `**`'dan gevşek bağlanır: `!o.active` = `!(o.active)`, `-2 ** 2` = `-(2 ** 2)`, `- -1` geçerli
|
||||
8. Üs alma (`**`) — sağdan birleşimli, üs kısmı `unary()` (`2 ** -1` geçerli)
|
||||
9. Postfix (`.prop`, `.method()`), atomik ifadeler
|
||||
|
||||
`&&` ve `||` VM'de kısa devre (short-circuit) çalışır; sağ taraf sadece gerektiğinde değerlendirilir (bkz. compiler.md).
|
||||
|
||||
### Postfix Kuralı
|
||||
|
||||
|
||||
+4
-3
@@ -134,18 +134,19 @@ struct VM<'a> {
|
||||
|
||||
### Kontrol Akışı
|
||||
- **`handle_jump()`** — 4-byte adres oku, reader pozisyonunu ayarla
|
||||
- **`handle_jump_if_true()`** — `||` short-circuit için; register true ise atla, Boolean değilse `TypeMismatch`
|
||||
- **`handle_jump_if_false()`** — Register `Boolean(false)` ise atla
|
||||
|
||||
### String, Nesne ve Metodlar
|
||||
- **`handle_concat()`** — İki register'ı birleştir (karışık tip dönüşümü destekler: String, Number, Boolean otomatik olarak String'e dönüştürülür)
|
||||
- **`handle_get_property()`** — Object register'ından alan oku, alan yoksa `Null` döndür. List register'ında property projection yapar: her Object elemanından ilgili alanı çıkarıp NumberList/StringList/List döndürür
|
||||
- **`handle_get_property()`** — Object register'ından alan oku, alan yoksa `Null` döndür. List register'ında property projection yapar: her Object elemanından ilgili alanı çıkarıp NumberList/StringList/List döndürür. `.length` property'si String/NumberList/StringList'te ve elemanları Object olmayan List'te `.length()` ile eşdeğerdir (Object listesinde `length` alanı projection'ı önceliklidir)
|
||||
- **`handle_set_property()`** — Object register'ında alan değerini ayarla
|
||||
- **`handle_method_call()`** — Nesne register'ı, metod adı, argümanlar
|
||||
- **String metodları:** `upper`, `lower`, `trim`, `trimStart`, `trimEnd`, `split(delimiter)`, `replace(old, new)`, `startsWith(prefix)`, `endsWith(suffix)`, `contains(substr)`, `length`, `charAt(index)`, `substring(start, end?)`
|
||||
- **StringList metodları:** `length`/`len`, `isEmpty`, `first`, `last`, `get(index)`, `contains(value)`, `indexOf(value)`, `slice(start, end?)`, `reverse()`, `sort()`, `join(delimiter?)`
|
||||
- **NumberList metodları:** `length`/`len`, `isEmpty`, `first`, `last`, `get(index)`, `contains(value)`, `indexOf(value)`, `slice(start, end?)`, `reverse()`, `sort()`, `sum`, `avg`, `min`, `max`
|
||||
- **Object metodları:** `keys()`, `values()`, `length`/`len()`, `contains(key)`, `get(key)`
|
||||
- **List metodları:** `length`/`len`, `isEmpty`, `first`, `last`, `get(index)`, `contains(value)`, `indexOf(value)`, `slice(start, end?)`, `reverse()`, `join(delim?)`, `map(field)`, `filter(field, value?)`, `find(field, value?)`, `sort(field)`
|
||||
- **List metodları:** `length`/`len`, `isEmpty`, `first`, `last`, `get(index)`, `contains(value)`, `indexOf(value)`, `slice(start, end?)`, `reverse()`, `join(delim?)`, `map(field)`, `filter(field, value?)`, `find(field, value?)`, `sort(field)`, `sum`/`avg`/`min`/`max` (elemanların hepsi Number ise; boş liste → sum 0, diğerleri null. Boş projection `items.amount` List döndürdüğü için gerekli)
|
||||
- **Harici metodlar:** Yukarıdaki built-in metodlar bulunamazsa `external_methods` HashMap'inde aranır
|
||||
|
||||
### Üyelik Testi
|
||||
@@ -163,7 +164,7 @@ struct VM<'a> {
|
||||
- **`max(a, b, ...)`** — Verilen değerlerin maksimumu
|
||||
- **`floor(n)`** — Aşağı yuvarlama
|
||||
- **`ceil(n)`** — Yukarı yuvarlama
|
||||
- **`round(n[, places])`** — Yuvarlama (opsiyonel ondalık basamak sayısı)
|
||||
- **`round(n[, places])`** — Yuvarlama (opsiyonel ondalık basamak sayısı). Yarımlar sıfırdan uzağa (`MidpointAwayFromZero`): `round(2.5)` = 3, `round(-2.5)` = -3, `round(0.125, 2)` = 0.13
|
||||
- **`sqrt(n)`** — Karekök
|
||||
- **`len(v)`** — Değerin uzunluğu (String, List, Object)
|
||||
- **`toString(v)`** — Değeri String'e dönüştür
|
||||
|
||||
Reference in New Issue
Block a user