japan-syc
v1.2.1
Published
Japan-SYC — a Japanese-inspired programming language and interpreter
Maintainers
Readme
Japan-SYC
bahasa pemrograman dengan sintaks jepang, base JavaScript
deskripsi
japan-SYC adalah bahasa pemrograman interpreted yang menggunakan sintaks bahasa Jepang. Di-build dari nol pakai JavaScript murni (Node.js), tanpa dependency eksternal cocok buat belajar gimana cara kerja lexer, parser, dan interpreter
fitur
- variabel dengan keyword
変数 - output ke console dengan
見せる() - kondisi
もし/他(if / else if / else) - loop
間(while) - break
区切りdan continue続ける - fungsi
関数dengan戻す(return) - boolean
真/偽 - null
無dan undefined未定義 - operator aritmatika:
+ - * / % - operator perbandingan:
== != < > <= >= - operator logika:
&& || ! - compound assignment:
+= -= *= /= - increment / decrement:
++ -- - array literal
[1, 2, 3]dan akses indexarr[0] - object literal
{キー: 値}dan akses propertyobj["キー"] - string concatenation dengan
+ - scope & closure
- error handling dengan info line & column
- identifier support huruf Jepang (Hiragana, Katakana, Kanji) + Latin
- built-in functions dari JavaScript (Math, String, Array, Object, JSON, Date, Type, Global)
struktur Project
japan-syc/
├── src/
│ ├── lexer.js
│ ├── parser.js
│ ├── interpreter.js
│ ├── errors.js
│ └── builtins/
│ ├── index.js
│ ├── math.js
│ ├── string.js
│ ├── array.js
│ ├── object.js
│ ├── number.js
│ ├── json.js
│ ├── date.js
│ ├── console.js
│ ├── type.js
│ └── global.js
├── bin/
│ └── アリヤ・ラン.js
├── examples/
│ ├── こんにちは.jp
│ ├── ループ.jp
│ ├── 条件.jp
│ ├── 関数.jp
│ └── v2/
│ ├── math.jp
│ ├── string.jp
│ ├── array.jp
│ ├── object.jp
│ ├── json.jp
│ ├── date.jp
│ └── type.jp
├── tests/
│ ├── lexer.test.js
│ ├── parser.test.js
│ ├── interpreter.test.js
│ └── builtins.test.js
├── package.json
└── README.mdrequirement
- node.js v18 atau lebih baru (karena pakai
node:testuntuk testing)
instalasi
install Global
supaya command アリヤ・ラン bisa dipanggil dari mana aja:
npm install -g japan-sycatau install dari github:
git clone japan-syctanpa install apapun langsung jalan pakai node.js:
node bin/アリヤ・ラン.js <file>.jpcara Run
format:
アリヤ・ラン <file>.jpcontoh:
アリヤ・ラン examples/こんにちは.jp
アリヤ・ラン examples/v2/math.jpoutput:
こんにちは、世界!
アリヤ・ラン へようこそ
私の名前は アリヤ です
年齢: 20sintaks
variabel
deklarasi variabel pakai keyword 変数. Reassignment pakai 変数 juga (tanpa keyword baru):
変数 名前 = "アリヤ";
変数 年齢 = 20;
変数 名前 = "Budi";output
pakai 見せる():
見せる("こんにちは");
見せる(42);
見せる(名前);
見せる("Halo, " + 名前);kondisi
if / else if / else:
もし (点数 >= 90) {
見せる("A");
} 他 もし (点数 >= 80) {
見せる("B");
} 他 {
見せる("C");
}loop
while loop pakai 間:
変数 i = 0;
間 (i < 10) {
見せる(i);
変数 i = i + 1;
}break dan continue:
変数 i = 0;
間 (i < 10) {
変数 i = i + 1;
もし (i == 3) {
続ける;
}
もし (i == 7) {
区切り;
}
見せる(i);
}fungsi
Deklarasi pakai 関数, return pakai 戻す:
関数 足し算(a, b) {
戻す a + b;
}
見せる(足し算(2, 3));fungsi rekursif:
関数 階乗(n) {
もし (n <= 1) {
戻す 1;
}
戻す n * 階乗(n - 1);
}
見せる(階乗(5));boolean
nilai boolean pakai 真 (true) dan 偽 (false):
変数 有効 = 真;
もし (有効) {
見せる("OK");
}null dan undefined
変数 空 = 無;
変数 未 = 未定義;array
変数 数値 = [1, 2, 3, 4, 5];
見せる(数値[0]);
見せる(数値[2]);object
変数 人 = {
名前: "アリヤ",
年齢: 20
};
見せる(人["名前"]);
見せる(人["年齢"]);compound assignment
変数 x = 5;
x += 3;
x -= 1;
x *= 2;
x /= 2;
x++;
x--;operator logika
見せる(真 && 偽);
見せる(真 || 偽);
見せる(!偽);keyword reference
| Keyword | Fungsi |
|---------|--------|
| 変数 | deklarasi / assignment variabel |
| 見せる | output ke console |
| もし | if |
| 他 | else / else if |
| 間 | while loop |
| 区切り | break |
| 続ける | continue |
| 関数 | deklarasi fungsi |
| 戻す | return dari fungsi |
| 真 | boolean true |
| 偽 | boolean false |
| 無 | null |
| 未定義 | undefined |
operator reference
| Operator | Keterangan |
|----------|------------|
| + | penjumlahan / string concat |
| - | pengurangan / unary minus |
| * | perkalian |
| / | pembagian |
| % | modulo |
| == | sama dengan |
| != | tidak sama dengan |
| < | kurang dari |
| > | lebih dari |
| <= | kurang dari atau sama dengan |
| >= | lebih dari atau sama dengan |
| && | logika AND |
| \|\| | logika OR |
| ! | logika NOT |
| += | tambah dan assign |
| -= | kurang dan assign |
| *= | kali dan assign |
| /= | bagi dan assign |
| ++ | increment |
| -- | decrement |
built-in functions
数学 (Math)
| Fungsi | Keterangan |
|--------|------------|
| 円周率 | Math.PI |
| 自然対数 | Math.E |
| 絶対値(n) | nilai absolut |
| 切り上げ(n) | pembulatan ke atas |
| 切り捨て(n) | pembulatan ke bawah |
| 四捨五入(n) | pembulatan terdekat |
| 平方根(n) | akar kuadrat |
| べき乗(a, b) | pangkat |
| 最大(...) | nilai maksimum |
| 最小(...) | nilai minimum |
| 乱数() | angka random 0-1 |
| 整数乱数(min, max) | integer random |
| 正弦(n) / 余弦(n) / 正接(n) | trigonometri |
| 対数(n) / 対数10(n) | logaritma |
| 符号(n) | tanda bilangan |
文字列 (String)
| Fungsi | Keterangan |
|--------|------------|
| 長さ(s) | panjang string |
| 大文字(s) / 小文字(s) | upper / lower |
| 分割(s, sep) | split |
| 結合(arr, sep) | join |
| 置換(s, from, to) | replace |
| 検索(s, sub) | indexOf |
| 含む(s, sub) | includes |
| 開始(s, sub) / 終了(s, sub) | startsWith / endsWith |
| 繰り返す(s, n) | repeat |
| 切り出し(s, a, b) | slice |
| トリム(s) | trim |
| 文字取得(s, i) | charAt |
| 一致(s, pattern) | regex test |
配列 (Array)
| Fungsi | Keterangan |
|--------|------------|
| 配列長(arr) | panjang array |
| 配列追加(arr, x) | push |
| 配列削除(arr) | pop |
| 配列結合(a, b) | concat |
| 配列合計(arr) | jumlah semua elemen |
| 配列最大(arr) / 配列最小(arr) | max / min |
| 配列逆(arr) | reverse |
| 配列並替(arr) | sort |
| 配列切出(arr, a, b) | slice |
| 配列地図(arr, fn) | map |
| 配列絞込(arr, fn) | filter |
| 配列集約(arr, fn, init) | reduce |
| 配列各(arr, fn) | forEach |
| 配列含(arr, x) | includes |
| 配列検索(arr, x) | indexOf |
| 配列探索(arr, fn) | find |
| 配列平坦(arr) | flat |
| 配列全真(arr, fn) | every |
| 配列何れ真(arr, fn) | some |
| 配列連結(arr, sep) | join |
物体 (Object)
| Fungsi | Keterangan |
|--------|------------|
| 物体鍵(obj) | keys |
| 物体値(obj) | values |
| 物体項目(obj) | entries |
| 物体結合(...objs) | merge |
| 物体有(obj, key) | hasOwnProperty |
| 物体長(obj) | jumlah key |
| 物体削除(obj, key) | delete |
| 物体凍結(obj) | freeze |
| 物体作成(obj) | copy |
JSON
| Fungsi | Keterangan |
|--------|------------|
| JSON文字列化(obj) | stringify |
| JSON整形(obj) | pretty print |
| JSON解析(str) | parse |
日付 (Date)
| Fungsi | Keterangan |
|--------|------------|
| 現在時刻() | Date.now() |
| 年(d) / 月(d) / 日(d) | tahun / bulan / tanggal |
| 時(d) / 分(d) / 秒(d) | jam / menit / detik |
| 曜日(d) | hari |
| ISO形式(d) | ISO string |
| 日付文字列(d) | date string |
| 時刻文字列(d) | time string |
| 地域形式(d) | locale string |
型 (Type)
| Fungsi | Keterangan |
|--------|------------|
| 型(x) | typeof |
| 数値か(x) | is number |
| 文字列か(x) | is string |
| 真偽か(x) | is boolean |
| 配列か(x) | is array |
| 物体か(x) | is object |
| 関数か(x) | is function |
| 無か(x) / 未定義か(x) | is null / undefined |
| 空か(x) | is empty |
| 変換数値(x) / 変換文字列(x) / 変換真偽(x) | cast |
全体 (Global)
| Fungsi | Keterangan |
|--------|------------|
| 整数変換(s) | parseInt |
| 小数変換(s) | parseFloat |
| 数値判定(x) | isNaN |
| 有限判定(x) | isFinite |
| 無限 | Infinity |
| 非数 | NaN |
| 符号化(s) / 復号化(s) | URI encode / decode |
contoh Program
hello World
見せる("こんにちは、世界!");fizzBuzz sederhana
変数 i = 1;
間 (i <= 15) {
もし (i == 15) {
見せる("FizzBuzz");
} 他 もし (i == 5) {
見せる("Buzz");
} 他 もし (i == 3) {
見せる("Fizz");
} 他 {
見せる(i);
}
変数 i = i + 1;
}kalkulator Sederhana
関数 足し算(a, b) {
戻す a + b;
}
関数 引き算(a, b) {
戻す a - b;
}
関数 掛け算(a, b) {
戻す a * b;
}
関数 割り算(a, b) {
もし (b == 0) {
戻す "エラー: ゼロで割れません";
}
戻す a / b;
}
見せる("10 + 5 = " + 足し算(10, 5));
見せる("10 - 5 = " + 引き算(10, 5));
見せる("10 * 5 = " + 掛け算(10, 5));
見せる("10 / 5 = " + 割り算(10, 5));contoh Array
変数 数値 = [1, 2, 3, 4, 5];
見せる("合計: " + 配列合計(数値));
見せる("最大: " + 配列最大(数値));
変数 倍 = 配列地図(数値, (n) => n * 2);
見せる("倍: " + 倍);
変数 偶数 = 配列絞込(数値, (n) => n % 2 == 0);
見せる("偶数: " + 偶数);contoh Object
変数 人 = {
名前: "アリヤ",
年齢: 20,
都市: "東京"
};
見せる("名前: " + 人["名前"]);
見せる("キー: " + 物体鍵(人));contoh JSON
変数 データ = {
名前: "アリヤ",
年齢: 20
};
変数 文字 = JSON文字列化(データ);
見せる(文字);
変数 解析 = JSON解析(文字);
見せる(解析["名前"]);error Handling
Japan-SYC punya 3 tipe error:
| Error | Kapan Muncul |
|-------|--------------|
| LexerError | karakter tidak dikenal, string tidak ditutup |
| ParserError | sintaks salah, token tidak sesuai |
| RuntimeError | variabel undefined, tipe data salah, bagi nol |
Setiap error menampilkan pesan + line + column.
contoh error:
ParserError (1行目, 10列目): ; が必要ですtesting
jalanin semua test:
npm testtest mencakup:
lexer.test.js— tokenize number, string, keyword, identifier, operatorparser.test.js— parse var, show, if, while, function, precedenceinterpreter.test.js— eksekusi var, arithmetic, if, while, function, rekursifbuiltins.test.js— test semua built-in function
arsitektur
alur eksekusi:
file.jp
↓
[lexer.js] → pecah source jadi tokens
↓
[parser.js] → ubah tokens jadi AST
↓
[interpreter.js] → eksekusi AST
↓
output (console)penjelasan tiap komponen:
| File | Tanggung Jawab |
|------|----------------|
| src/lexer.js | baca source code, hasilkan token |
| src/parser.js | baca token, bangun AST (Abstract Syntax Tree) |
| src/interpreter.js | traverse AST, eksekusi statement & evaluasi expression |
| src/errors.js | custom error class dengan line & column info |
| src/builtins/*.js | kumpulan built-in function dari JavaScript |
| bin/アリヤ・ラン.js | cli entry point, baca file .jp, jalankan pipeline |
ekstensi File
Semua file Japan-SYC harus pakai ekstensi .jp.
Lisensi
MIT - irfanModz
