bahasa-simpl 1.0.13 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +7 -0
- package/README.md +37 -5
- package/dist/simpl.d.ts +2 -2
- package/package.json +3 -7
- package/dist/simpl.min.js +0 -1
package/LICENSE.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright 2026 faeiz-ff
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
1
|
# `simpl`: Indonesian Mini Programming Language
|
|
4
2
|
`simpl` adalah bahasa pemrograman mini yang berbasis dari bahasa Indonesia. Bahasa ini dirancang untuk memudahkan penerjemahan berbagai konsep pemrograman ke dalam bahasa Indonesia. Selain itu, semua kata kunci (_keywords_) dari bahasa ini memiliki jumlah karakter persis 5 huruf untuk alasan estetika :)
|
|
5
3
|
|
|
6
4
|
`simpl` adalah akronim rekursif dari `simpl`: Indonesian Mini Programming Language
|
|
7
5
|
|
|
6
|
+
Coba sekarang dalam website [simpl](https://bahasa-simpl.pages.dev)!
|
|
7
|
+
|
|
8
8
|
## Fitur `simpl`
|
|
9
9
|
`simpl` **masih dalam tahap pengembangan!** Jadi, semua yang tertera disini akan berubah sewaktu-waktu!
|
|
10
10
|
|
|
@@ -17,16 +17,48 @@ Berikut fitur yang _sekarang_ sudah diimplementasikan:
|
|
|
17
17
|
|
|
18
18
|
Fitur yang akan datang:
|
|
19
19
|
- dokumentasi penuh
|
|
20
|
-
- Pembersihan dan perapihan kode sumber
|
|
20
|
+
- Pembersihan dan perapihan kode sumber
|
|
21
21
|
- Pengecekan sebelum eksekusi (Analisa semantik)
|
|
22
22
|
- Pe`masuk`an input ke program
|
|
23
23
|
- Pengendalian `error`
|
|
24
24
|
- `impor` dan `expor`
|
|
25
25
|
- bytecode...
|
|
26
|
-
- dan fitur lainnya yang tidak terpikirkan sekarang
|
|
26
|
+
- dan fitur lainnya yang tidak terpikirkan sekarang
|
|
27
|
+
|
|
28
|
+
## Instalasi
|
|
29
|
+
|
|
30
|
+
Saat ini CLI belum didukung.
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
npm install bahasa-simpl
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
lalu pada suatu index.js dalam folder yang sama:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
import { Simpl } from "bahasa-simpl";
|
|
40
|
+
|
|
41
|
+
let s = new Simpl();
|
|
42
|
+
|
|
43
|
+
console.log(s.runCode(`
|
|
44
|
+
|
|
45
|
+
cetak "Halo Dunia!"
|
|
46
|
+
|
|
47
|
+
`));
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## API
|
|
51
|
+
|
|
52
|
+
`class Simpl(opts?: { keepMemory?: boolean })`:
|
|
53
|
+
- Menghasilkan sebuah instance dari simpl
|
|
54
|
+
- `keepMemory?: boolean` default `false`:
|
|
55
|
+
- Kalau bernilai `true`, `simpl` akan menyimpan memorinya setiap kali `runCode`, Mengingatnya kembali saat `runCode` selanjutnya.
|
|
56
|
+
|
|
57
|
+
- `runCode(code: string): string`:
|
|
58
|
+
- Menjalankan `simpl` dan mencetak output programnya ke layar.
|
|
27
59
|
|
|
28
60
|
## Contoh `simpl`
|
|
29
|
-
Tur lebih lengkap ada dalam [Tur Sintaks Simpl](docs/tur.md)
|
|
61
|
+
Tur lebih lengkap ada dalam [Tur Sintaks Simpl](https://github.com/faeiz-ff/simpl/blob/main/docs/tur.md)
|
|
30
62
|
- `mesin` akar dua
|
|
31
63
|
```simpl
|
|
32
64
|
mesin akar2 ==> (angka n) {
|
package/dist/simpl.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bahasa-simpl",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.15",
|
|
4
|
+
"description": "Bahasa pemrograman mini berbasis kata bahasa Indonesia",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
7
7
|
"types": "./dist/simpl.d.ts",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
},
|
|
11
11
|
"main": "./dist/simpl.js",
|
|
12
12
|
"module": "./dist/simpl.js",
|
|
13
|
-
"types": "./dist/simpl.
|
|
13
|
+
"types": "./dist/simpl.d.ts",
|
|
14
14
|
"files": [
|
|
15
15
|
"dist"
|
|
16
16
|
],
|
|
@@ -30,10 +30,6 @@
|
|
|
30
30
|
},
|
|
31
31
|
"homepage": "https://github.com/faeiz-ff/simpl#readme",
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@rollup/plugin-terser": "^0.4.4",
|
|
34
33
|
"rollup": "^4.55.1"
|
|
35
|
-
},
|
|
36
|
-
"dependencies": {
|
|
37
|
-
"bahasa-simpl": "^1.0.3"
|
|
38
34
|
}
|
|
39
35
|
}
|
package/dist/simpl.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
class e extends Error{constructor(e,t){super(e),this.line=t}}class t extends e{constructor(e,t,i){super(e,t),this.output=i}}class i extends e{}class a extends e{}class s{constructor(e){this.enclosing=e,this.memory=new Map}define(e,t){this.memory.set(e,t)}assign(e,t){return this.has(e)?this.memory.set(e,t):this.enclosing&&this.enclosing.assign(e,t),null}get(e){return this.has(e)?this.memory.get(e):this.enclosing?this.enclosing.get(e):null}has(e){return this.memory.has(e)}}const n=["petik","angka","logis","mesin","baris","stipe","modul"],r=Symbol("petik"),h=Symbol("angka"),l=Symbol("logis"),m=Symbol("mesin"),o=Symbol("baris"),d=Symbol("stipe"),u=Symbol("modul");class c{constructor(e,t){this.type=e,this.data=t,this.member=null}}const p=new c(null,null);class k extends c{constructor(e,t,i){super(e,i),this.tetap=t,this.isDatum=!1}}class b extends k{constructor(e,t){super(d,!0,t),this.symbol=e,this.member=new s,this.member.define("buat",new k(m,!0,t))}}function f(e,t){if(t.type===l)return t.data?"benar":"salah";if(t.type===o)return"["+t.data.reduce((t,i)=>t+", "+f(e,i),"").slice(1)+" ]";if(t.type===d)return`Model<${t.symbol?.description?t.symbol.description:""}>`;if(t.type===m){let e=t.data.returnType?.description;return`Mesin<${e||"datum"}>`}if(t.type===h)return t.data.toString();if(t.type===r)return t.data;{if(!t?.type)return"nihil";let i=e.environment.get(t.type.description);if(i?.member.has("kePetik")){return e.callFunc(i.member.get("kePetik").data,[t]).data}return`${t.type.description}<>`}}let w=class extends b{constructor(e,t){let i=Symbol(e);super(i,new g(null,(e,a)=>{let n=new c(i,!0);n.member=new s;let r=e.line;for(let i=0;i<a.length;i++){let s=t[i][0],h=s.accept(e),l=t[i][1].lexeme,m=new k(h,s.tetap,a[i].data);null===h?(m.isDatum=!0,m.type=a[i].type):a[i].type!==h&&(e.line=r,e.error(`Argumen pembuatan objek tidak sama dengan argumen model, menemukan ${a[i].type?.description}, mengharapkan ${h?h.description:"nihil"}`)),m.member=a[i].member,n.member.define(l,m)}return n},t.map(e=>[null]),i,!0))}},S=class extends b{constructor(e,t){let i=Symbol(e);super(i,null),t.forEach((e,t)=>{this.member.define(e.lexeme,new c(i,t))}),this.member.define("kePetik",y([i],r,(t,[i])=>new c(r,`${e}<${i.data}>`))),this.member.define("SAMA_SAMA",y([i,i],l,(e,[t,i])=>new c(l,i.data===t.data))),this.member.define("SERU_SAMA",y([i,i],l,(e,[t,i])=>new c(l,i.data!==t.data)))}};class g{constructor(e,t,i,a,s=!1){this.closure=e,this.block=t,this.parameters=i,this.returnType=a,this.isBuiltIn=s}}function y(e,t,i){let a=new g(null,i,e.map(e=>[e]),t,!0);return new k(m,!0,a)}function A(e){switch(e.type){case r:return new c(r,e.data);case h:return new c(h,e.data);case l:return new c(l,e.data);case m:return new c(m,e.data);case o:return new c(o,e.data.map(e=>{let t=A(e),i=new k(t.type,!1,t.data);return i.member=t.member,i}));case d:case u:return p;default:if(e.member&&e.member instanceof s){let t=e.member.memory.keys(),i=new c(e.type,null),a=new s;for(let i of t){let t=e.member.get(i),s=A(t),n=new k(t.type,t.tetap,s.data);n.member=s.member,a.define(i,n)}return i.member=a,i.data=e.data,i}return new c(e.type,e.data)}}const x=(()=>{let e=new b(r,new g(null,(e,t)=>new c(r,f(e,t[0])),[[null]],r,!0));return e.member.define("PLUS",y([r,r],r,(e,[t,i])=>new c(r,i.data+t.data))),e.member.define("LEBIH",y([r,r],l,(e,[t,i])=>new c(l,i.data>t.data))),e.member.define("KURANG",y([r,r],l,(e,[t,i])=>new c(l,i.data<t.data))),e.member.define("SAMA_SAMA",y([r,r],l,(e,[t,i])=>new c(l,i.data===t.data))),e.member.define("LEBIH_SAMA",y([r,r],l,(e,[t,i])=>new c(l,i.data>=t.data))),e.member.define("KURANG_SAMA",y([r,r],l,(e,[t,i])=>new c(l,i.data<=t.data))),e.member.define("SERU_SAMA",y([r,r],l,(e,[t,i])=>new c(l,i.data!==t.data))),e.member.define("AMPERSAN",y([r,r],l,(e,[t,i])=>new c(l,i.data&&t.data))),e.member.define("PIPA",y([r,r],l,(e,[t,i])=>new c(l,i.data||t.data))),e.member.define("SERU_UNER",y([r],l,(e,[t])=>new c(l,!Boolean(t.data)))),e.member.define("kePetik",y([r],r,(e,[t])=>new c(r,f(e,t)))),e.member.define("pisah",y([r,r],o,(e,[t,i])=>new c(o,t.data.split(i.data).map(e=>new c(r,e))))),e.member.define("bersih",y([r],r,(e,[t])=>new c(r,t.data.trim()))),e.member.define("ganti",y([r,r,r],r,(e,[t,i,a])=>new c(r,t.data.replaceAll(i.data,a.data)))),e.member.define("besar",y([r],r,(e,[t])=>new c(r,t.data.toUpperCase()))),e.member.define("kecil",y([r],r,(e,[t])=>new c(r,t.data.toLowerCase()))),e})(),M=(()=>{let e=new b(h,new g(null,(e,t)=>{if("number"==typeof t[0].data)return new c(h,t[0].data);switch(t[0].type){case r:return isNaN(Number(t[0].data))&&e.error("Nilai dari petik bukanlah sebuah angka, konversi gagal."),new c(h,Number(t[0].data));case h:return new c(h,t[0].data);case l:return new c(h,Number(t[0].data));default:return void e.error(`Tipe yang dapat diterima hanyalah petik, angka, logis, dan jenis. Mendapatkan ${t[0].type.description}.`)}},[[null]],h,!0));return e.member.define("PLUS",y([h,h],h,(e,[t,i])=>new c(h,i.data+t.data))),e.member.define("MINUS",y([h,h],h,(e,[t,i])=>new c(h,i.data-t.data))),e.member.define("BINTANG",y([h,h],h,(e,[t,i])=>new c(h,i.data*t.data))),e.member.define("GARIS_MIRING",y([h,h],h,(e,[t,i])=>new c(h,i.data/t.data))),e.member.define("MODULUS",y([h,h],h,(e,[t,i])=>new c(h,i.data%t.data))),e.member.define("LEBIH",y([h,h],l,(e,[t,i])=>new c(l,i.data>t.data))),e.member.define("KURANG",y([h,h],l,(e,[t,i])=>new c(l,i.data<t.data))),e.member.define("SAMA_SAMA",y([h,h],l,(e,[t,i])=>new c(l,i.data===t.data))),e.member.define("LEBIH_SAMA",y([h,h],l,(e,[t,i])=>new c(l,i.data>=t.data))),e.member.define("KURANG_SAMA",y([h,h],l,(e,[t,i])=>new c(l,i.data<=t.data))),e.member.define("SERU_SAMA",y([h,h],l,(e,[t,i])=>new c(l,i.data!==t.data))),e.member.define("AMPERSAN",y([h,h],l,(e,[t,i])=>new c(l,i.data&&t.data))),e.member.define("PIPA",y([h,h],l,(e,[t,i])=>new c(l,i.data||t.data))),e.member.define("SERU_UNER",y([h],l,(e,[t])=>new c(l,!Boolean(t.data)))),e.member.define("PLUS_UNER",y([h],h,(e,[t])=>new c(h,+t.data))),e.member.define("MINUS_UNER",y([h],h,(e,[t])=>new c(h,-t.data))),e.member.define("kePetik",y([h],r,(e,[t])=>new c(r,f(e,t)))),e.member.define("bulat",y([h],h,(e,[t])=>new c(h,Math.round(t.data)))),e.member.define("bulatAtas",y([h],h,(e,[t])=>new c(h,Math.ceil(t.data)))),e.member.define("bulatBawah",y([h],h,(e,[t])=>new c(h,Math.floor(t.data)))),e})(),E=(()=>{let e=new b(l,new g(null,(e,t)=>t[0].type===o&&0===t[0].data.length?new c(l,!1):new c(l,Boolean(t[0].data)||Boolean(t[0].data?.member?.size)),[[null]],l,!0));return e.member.define("SAMA_SAMA",y([l,l],l,(e,[t,i])=>new c(l,i.data===t.data))),e.member.define("SERU_SAMA",y([l,l],l,(e,[t,i])=>new c(l,i.data!==t.data))),e.member.define("AMPERSAN",y([l,l],l,(e,[t,i])=>new c(l,i.data&&t.data))),e.member.define("PIPA",y([l,l],l,(e,[t,i])=>new c(l,i.data||t.data))),e.member.define("SERU_UNER",y([l],l,(e,[t])=>new c(l,!Boolean(t.data)))),e.member.define("kePetik",y([l],r,(e,[t])=>new c(r,f(e,t)))),e})(),T=(()=>{let e=new b(o);const t=e=>{let t=new k(e.type,!1,e.data);return t.member=e.member,t.isDatum=!0,t};return e.member.define("PLUS",y([o,o],o,(e,[t,i])=>new c(o,Array(...i.data,...t.data)))),e.member.define("MINUS_UNER",y([o],o,(e,[t])=>new c(o,t.data.slice(0,t.length)))),e.member.define("SAMA_SAMA",y([o,o],l,(e,[t,i])=>new c(l,((e,t)=>{if(e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(e[i].data!==t[i].data)return!1;return!0})(i.data,t.data)))),e.member.define("SERU_SAMA",y([o,o],l,(e,[t,i])=>new c(l,((e,t)=>{if(e.length!==t.length)return!0;for(let i=0;i<e.length;i++)if(e[i].data!==t[i].data)return!0;return!1})(i.data,t.data)))),e.member.define("AMPERSAN",y([o,o],l,(e,[t,i])=>new c(l,i.data&&t.data))),e.member.define("PIPA",y([o,o],l,(e,[t,i])=>new c(l,i.data||t.data))),e.member.define("SERU_UNER",y([o],l,(e,[t])=>new c(l,!Boolean(t.data)))),e.member.define("kePetik",y([o],r,(e,[t])=>new c(r,f(e,t)))),e.member.define("hapus",y([o,h],o,(e,[t,i])=>{for(t.data.length<=i.data&&e.error(`Indeks tidak boleh lebih besar atau sama dengan ukuran baris, ${i.data} >= ${t.data.length}`);i.data<0;)i.data+=t.data.length;return t.data=t.data.filter((e,t)=>t!==i.data),t})),e.member.define("potongan",y([o,h,h],o,(e,[t,i,a])=>((i.data>=t.data.length||i.data<0||a.data<=i.data||a.data>t.data.length)&&e.error(`Indeks tidak valid, ${i.data} sampai ${a.data}, dengan ukuran baris ${t.data.length}`),new c(o,t.data.slice(i.data,a.data))))),e.member.define("tumpuk",y([o,null],null,(e,[i,a])=>(i.data.push(t(a)),i))),e.member.define("tumpah",y([o],null,(e,[t])=>(t.data.pop(),t))),e.member.define("masuk",y([o,null,h],null,(e,[i,a,s])=>(s.data>i.data.length&&e.error(`Indeks tidak valid, ${s.data}, dengan ukuran baris ${i.data.length}`),i.data.splice(s.data,0,t(a)),i))),e.member.define("petakan",y([o,m],o,(e,[i,a])=>{let s=new c(o,[]);for(let n of i.data){let i=e.callFunc(a.data,[n]);s.data.push(t(i))}return s})),e.member.define("saring",y([o,m],o,(e,[i,a])=>{let s=new c(o,[]);for(let n of i.data){!0===e.callFunc(a.data,[n]).data&&s.data.push(t(n))}return s})),e.member.define("reduksi",y([o,m,null],null,(e,[t,i,a])=>{for(let s of t.data){a=e.callFunc(i.data,[a,s])}return a})),e.member.define("punya?",y([o,null],l,(e,[t,i])=>{let a,s=e.environment.get(i.type?.description);s||e.error("Tipe tidak ditemukan atau tidak valid"),s.member?.has("SAMA_SAMA")?a=s.member.get("SAMA_SAMA"):e.error(`model ${i.type.description} tidak mempunyai mesin SAMA_SAMA di dalam modulnya.`);for(let s of t.data){if(s.type!==i.type)continue;if(e.callFunc(a.data,[s,i]).data)return new c(l,!0)}return new c(l,!1)})),e})(),I=(()=>{let e=new b(m);return e.member.define("kePetik",y([m],r,(e,[t])=>new c(r,f(e,t)))),e})(),N=(()=>{let e=new s;e.define("petik",x),e.define("angka",M),e.define("logis",E),e.define("baris",T),e.define("mesin",I),e.define("jarak",y([h,h],o,(e,[t,i])=>new c(o,Array(Math.abs(Math.floor(i.data-t.data))).fill(0).map((e,a)=>new c(h,t.data+(i.data>t.data?1:-1)*a))))),e.define("nihil?",y([null],l,(e,[t])=>new c(l,null===t.data))),e.define("ukuran",y([null],h,(e,[t])=>t.type===o||t.type===r?new c(h,t.data.length):v.error(`Ukuran hanya terdapat untuk tipe petik atau baris. Menemukan tipe ${t.type.description}.`))),e.define("salin",y([null],null,(e,[t])=>A(t))),e.define("tipe",y([null],r,(e,[t])=>t.type?.description?new c(r,t.type.description):new c(r,"datum")));let t=new k(u,!0,null);t.member=new s,t.member.define("acak",y([h,h],h,(e,[t,i])=>{let a=Math.abs(t.data-i.data),s=Math.random()*a+Math.min(t.data,i.data);return new c(h,s)})),t.member.define("akar2",y([h],h,(e,[t])=>new c(h,Math.sqrt(t.data)))),t.member.define("min",y([h,h],h,(e,[t,i])=>new c(h,Math.min(t.data,i.data)))),t.member.define("maks",y([h,h],h,(e,[t,i])=>new c(h,Math.max(t.data,i.data))));const i=(e,t)=>{for([e,t]=[Math.max(e,t),Math.min(e,t)];t>0;)[e,t]=[t,e%t];return e};return t.member.define("fpb",y([h,h],h,(e,[t,a])=>{let s=i(t.data,a.data);return new c(h,s)})),t.member.define("kpk",y([h,h],h,(e,[t,a])=>{let s=i(t.data,a.data);return new c(h,t.data*a*data/s)})),e.define("mtk",t),e})(),L=["rubah","kalau","namun","slagi","untuk","cetak","henti","lewat","dalam","hasil","kerja","datum","jenis","model","tetap","modul","lihat","kasus","jatuh"],U=11,$=20,R=21,P=26,_=27,B=37,C=["RUBAH","KALAU","NAMUN","SLAGI","UNTUK","CETAK","HENTI","LEWAT","DALAM","HASIL","KERJA","DATUM","JENIS","MODEL","TETAP","MODUL","LIHAT","KASUS","JATUH","EOF","ID","LITERAL","PLUS","MINUS","BINTANG","GARIS_MIRING","LPAREN","RPAREN","LEBIH","LEBIH_SAMA","KURANG","KURANG_SAMA","SAMA","SAMA_SAMA","DOT","LCURLY","RCURLY","COMMA","LSQUARE","RSQUARE","PIPA","AMPERSAN","SERU","ARROW","SERU_SAMA","MODULUS","PIPELINE","COLON","DOLLAR"];let j=class{},G=class{},K=class{},H=class{constructor(e){this.value=e}};class O{constructor(){this.globalEnvironment=N,this.location={GLOBAL:1,SLAGI:2,UNTUK:3,MESIN:4,LIHAT:5},this.MAX_STACK_SIZE=500,this.init()}init(){this.line=0,this.environment=new s(this.globalEnvironment),this.tree=null,this.state=this.location.GLOBAL,this.stack=[],this.output=[],this.objectStack=null,this.exprWillBeCalled=!1,this.pipeStack=[]}interpret(e){return this.line=0,this.output=[],this.tree=e,e.accept(this),this.output}visitLiteralExpr(e){let t=e.token;switch(this.line=t.line,typeof t.value){case"string":return new c(r,t.value);case"number":return new c(h,t.value);case"boolean":return new c(l,t.value);default:return p}}visitArrayExpr(e){let t=new c(o,[]);for(let i of e.contents){let e=i.accept(this),a=new k(e.type,!1,e.data);a.member=e.member,a.isDatum=!0,t.data.push(a)}return t}visitIndexExpr(e){let t=e.iterable.accept(this);t.type===r&&(t=new c(o,t.data.split("").map(e=>new c(r,e)))),t.type!==o&&this.error(`'${t.type.description}' bukan baris/petik, tidak bisa di-indeks`);let i=e.index.accept(this);for(i.type!==h&&this.error(`Ekspresi di dalam indeks harus bertipe angka. Menemukan ${i.type.description}`),i.data>=t.data.length&&this.error(`Indeks tidak boleh lebih besar atau sama dengan ukuran baris: ${i.data} >= ${t.data.length}`);i.data<0;)i.data+=t.data.length;return t.data[i.data]}visitLambdaExpr(e){let t=e.params.map(e=>[e[0].accept(this),e[0].tetap,e[1].lexeme]);t.length>1&&(e=>{let t=new Map;for(let i of e){if(t.has(i))return!0;t.set(i,!0)}return!1})(t.map(e=>e[2]))&&this.error("Parameter mesin tidak boleh mempunyai nama yang sama.");let i=null;e.returnType&&(i=e.returnType.accept(this));let a=new g(this.environment,e.block,t,i);return new c(m,a)}visitCallExpr(e){this.exprWillBeCalled=!0;let t=e.callable.accept(this);this.exprWillBeCalled=!1,t.type!==m&&t.type!==d&&this.error(`Hanya bisa 'memanggil' mesin atau model, malah menemukan ${t.type.description}. `),t?.data?.block||this.error("Mesin tidak terdefinisi, tidak bisa dipanggil.");let i=[];return this.objectStack&&(i=[this.objectStack],this.objectStack=null),i=[...i,...e.args.map(e=>e.accept(this))],this.callFunc(t.data,i)}callFunc(e,t){e||this.error("Mesin tidak terdefinisi, tidak bisa dipanggil."),this.stack.push(this.line),this.stack.length>this.MAX_STACK_SIZE&&this.error(`Rekursi melebihi batas: Lebih dari ${this.MAX_STACK_SIZE}`);let i=this.state;this.line=this.stack[this.stack.length-1],this.state=this.location.MESIN,t.length!==e.parameters.length&&this.error(`Jumlah argumen tidak sama dengan parameter mesin. Menemukan ${t.length}, harusnya ${e.parameters.length}.`);let a=this.line;for(let i=0;i<t.length;i++){let s=e.parameters[i][0];null!==s&&(t[i].type!==s&&(this.line=a,this.error(`Tipe argumen tidak sama dengan parameter. Menemukan ${t[i].type.description}, harusnya ${s.description}`)))}if(e.isBuiltIn)return this.stack.pop(),this.state=i,e.block(this,t);let n=this.environment,r=new s(e.closure);this.environment=r;for(let i=0;i<t.length;i++){let[a,s,n]=e.parameters[i];null===a&&(a=t[i].type);let r=new k(a,s,t[i].data);r.member=t[i].member,this.environment.define(n,r)}let h=p;for(let t of e.block.statements)try{t.accept(this)}catch(e){if(e instanceof H){h=e.value;break}if(!(e instanceof j||e instanceof K))throw e;this.error("Tidak bisa menghentikan atau melewatkan mesin. ")}return this.stack.pop(),this.state=i,this.environment=n,h}visitBinaryExpr(e){let t=e.left.accept(this),i=e.right.accept(this);this.line=e.op.line,this.nullCheck(t,i)&&this.error("Tidak bisa mengoperasikan nilai Nihil."),this.typeCheck(t,i,`Pada operasi biner ${e.op.lexeme}`);let a=this.environment.get(t.type.description);return this.operate(a,e.op.type,i,t)}visitUnaryExpr(e){let t=e.right.accept(this);this.line=e.op.line,this.nullCheck(t)&&this.error("Tidak bisa mengoperasikan nilai Nihil.");let i=this.environment.get(t.type.description);return this.operate(i,e.op.type,t)}operate(e,t,i,a){let s=C[t]+(a?"":"_UNER"),n=e.member.get(s);n||this.error(`operator ${s} tidak terdefinisi untuk Model ${i.type.description}.`);let r=null;return r=a?this.callFunc(n.data,[i,a]):this.callFunc(n.data,[i]),r}visitGroupingExpr(e){return e.expr.accept(this)}visitIdentifierExpr(e){if("$"===e.token.lexeme){if(this.line=e.token.line,!(this.pipeStack.length<=0))return this.pipeStack[this.pipeStack.length-1];this.error("$ hanya ada dalam ekspresi saluran.")}let t=this.environment.get(e.token.lexeme);return this.line=e.token.line,t||this.error(`'${e.token.lexeme}' tidak dapat ditemukan.`),t}visitMemberExpr(e){let t=this.exprWillBeCalled;this.exprWillBeCalled=!1;let i=e.main.accept(this),a=e.member.token.lexeme;if(this.line=e.member.token.line,i?.member&&i.member.has(a))return i.member.get(a);{const e=this.environment.get(i.type.description);if(e||this.error(`nama .${a} tidak ditemukan.`),e.member?.has(a)){if(t)return this.objectStack=i,e.member.get(a);this.error("akses titik . dari objek ke model harus berupa panggilan/penggunaaan mesin.")}this.error(`nama .${a} tidak ditemukan dalam tipe ${i.type.description}`)}}visitPipeLineExpr(e){let t=e.expr.accept(this);this.pipeStack.push(t);let i=e.pipeTo.accept(this);return this.pipeStack.pop(),i}visitTypeStmt(e){if(null===e.type)return null;let t=e.type.accept(this);return t.type===d&&t.symbol||this.error(`'${t.type.description}' bukan sebuah Model/Tipe Valid.`),t.symbol}visitCetakStmt(e){let t=e.expr.accept(this);this.output.push(f(this,t))}visitKerjaStmt(e){e.expr.accept(this)}visitDatumStmt(e){let t=e.type.accept(this),i=this.validName(e.name.lexeme);this.line=e.name.line;let a=new k(t,e.type.tetap),s=e.expr.accept(this);null===s.data&&(s.type=a.type),null===t?(a.isDatum=!0,a.type=s.type):this.typeCheck(a,s,`Pada pembuatan variabel '${i}'`),a.data=s.data,a.member=s.member,this.environment.define(i,a)}visitRubahStmt(e){let t=e.variable.accept(this);void 0===t.tetap&&this.error("Pe-rubah-an hanya dapat dilakukan kepada Variabel!"),t.tetap&&this.error("Variabel tetap tidak dapat di-rubah.");let i=e.value.accept(this);null===i.data&&(i.type=t.type),t.isDatum?t.type=i.type:this.typeCheck(t,i,"Pada perubahan variabel."),t.data=i.data,t.member=i.member}visitBlockStmt(e){let t=new s(this.environment);this.environment=t;try{for(let t of e.statements)t.accept(this)}catch(e){throw this.environment=t.enclosing,e}this.environment=t.enclosing}visitKalauStmt(e){let t=e.condition?.accept(this);t?.type&&t?.type!==l&&this.error(`Ekspresi dalam 'kalau' harus bertipe logis, menemukan ${t.type?t.type.description:"nihil"}`),null==t||t.data?e.thenBlock.accept(this):e.elseKalau?.accept(this)}visitHentiStmt(){if(this.state===this.location.UNTUK||this.state===this.location.SLAGI)throw new j;this.error("Tidak ada pengulangan untuk dihentikan.")}visitLewatStmt(){if(this.state===this.location.UNTUK||this.state===this.location.SLAGI)throw new K;this.error("Tidak ada pengulangan untuk dilewatkan.")}visitJatuhStmt(){if(this.state===this.location.LIHAT)throw new G;this.error("Tidak bisa jatuh di luar blok kasus.")}visitHasilStmt(e){throw 0==this.stack.length&&this.error("Tidak bisa menghasilkan diluar blok mesin."),new H(e.expr.accept(this))}visitSlagiStmt(e){const t=e=>(e.type!==l&&this.error(`Ekspresi dalam 'slagi' harus bertipe 'logis', menemukan ${e.type?e.type.description:"nihil"}`),e.data);let i=this.environment;for(;t(e.condition.accept(this));){this.environment=new s(i);try{for(let t of e.block.statements)this.state=this.location.SLAGI,t.accept(this),this.state=this.location.SLAGI}catch(e){if(e instanceof j)break;if(e instanceof K)continue;throw e}}this.environment=i,0!==this.stackNum?this.state=this.location.MESIN:this.state=this.location.GLOBAL}visitUntukStmt(e){let t=this.validName(e.varName.lexeme,!1),i=e.varType.accept(this),a=e.iterable.accept(this);a.type===r&&(a=new c(o,a.data.split("").map(e=>new c(r,e)))),a.type!==o&&this.error(`Pernyataan 'untuk' harus mengiterasi sebuah baris atau petik, bukan ${a.type.description}`);for(let n=0;n<a.data.length;n++){let r=a.data[n],h=new k(r.type,!!e.type?.tetap,r.data);null===i?h.isDatum=!0:r.type!==i&&this.error(`Tipe data tidak sama pada indeks ke-${n}: ${r.type.description} != ${i.description}.`);let l=new s(this.environment);l.define(t,h),this.environment=l;try{for(let t of e.block.statements)this.state=this.location.UNTUK,t.accept(this),this.state=this.location.UNTUK}catch(e){if(this.environment=l.enclosing,e instanceof K)continue;if(e instanceof j)break;throw e}this.environment=l.enclosing}0!==this.stackNum?this.state=this.location.MESIN:this.state=this.location.GLOBAL}visitJenisStmt(e){let t=this.validName(e.name.lexeme);this.line=e.name.line,this.environment.define(t,new S(t,e.enums))}visitLihatStmt(e){let t=e.expr.accept(this),i=this.environment.get(t?.type?.description);i?.member?.has("SAMA_SAMA")||this.error(`tipe ${i?t.type.description:"nihil"} tidak mempunyai mesin SAMA_SAMA.`);let a=i.member.get("SAMA_SAMA");const s=t=>{for(;t<e.cases.length;){try{this.state=this.location.LIHAT,e.cases[t][1].accept(this),this.state=this.location.LIHAT}catch(e){if(e instanceof G){t++;continue}throw e}break}0!==this.stackNum?this.state=this.location.MESIN:this.state=this.location.GLOBAL};for(let i=0;i<e.cases.length;i++){let n=e.cases[i];if(!n[0])return s(i);let r=n[0].accept(this);if(this.callFunc(a.data,[t,r]).data)return s(i)}}visitSimplStmt(e){for(let t of e.statements)t.accept(this)}visitModelStmt(e){let t=this.validName(e.name.lexeme);this.line=e.name.line,this.environment.define(t,new w(t,e.contents))}visitModulStmt(e){let t=this.validName(e.name.lexeme,!1);this.line=e.name.line;let i=this.environment.get(t);i?(i.type!==d&&this.error(`Modul hanya bisa _ditambahkan_ pada tipe. '${t}' bukan merupakan tipe.`),i.member.memory.size>1&&this.error(`Tipe '${t}' sudah memiliki modul sendiri, tidak bisa definisi ulang.`)):(i=new k(u,!0,null),i.member=new s,this.environment.define(t,i));let a=this.environment;i.member.enclosing=this.environment,this.environment=i.member;for(let t of e.statements)t.accept(this);[this.environment,i.member]=[a,this.environment]}typeCheck(e,t,i){e.type!==t.type&&(console.log(e,t),this.error(`Tipe data tidak sama: ${e.type.description} != ${t.type.description}. `+i))}nullCheck(...e){for(let t of e)if(null===t.data||null===t.type)return t;return!1}validName(e,t=!0){return n.some(t=>t===e)?this.error(`Nama sistem (${e}) tidak boleh didefinisi ulang.`):t&&this.environment.has(e)&&this.error(`Variabel dengan nama '${e}' sudah ada. Tidak bisa didefinisi ulang.`),e}error(e){throw new t(`Error Eksekusi => ${e}`,this.line,this.output.join("\n"))}}class D{constructor(e,t,i,a){this.type=e,this.lexeme=t,this.value=i,this.line=a}toString(){return`< [${this.line}] ${C[this.type]}, ${this.lexeme} >`}}class F{constructor(){this.init()}init(){this.text=null,this.charStart=0,this.charIndex=0,this.lineIndex=1,this.tokens=[],this.errors=[]}scanTokens(e){this.init(),this.text=e;let t=[];for(;!this.isAtEnd();){let e=this.scan();this.charStart=this.charIndex,e&&t.push(e)}return t.push(new D(19,"Akhir dokumen",null,this.lineIndex)),this.tokens=t,this.tokens}isAtEnd(){return this.charIndex>=this.text.length}advance(){this.isAtEnd()||("\n"===this.see()&&this.lineIndex++,this.charIndex++)}see(){return this.isAtEnd()?"EOF":this.text[this.charIndex]}peek(e=1){return this.isAtEnd()?null:this.text[this.charIndex+e]}isAlpha(e){return/^[a-zA-Z_]$/.test(e)}isNumeric(e){return/^[0-9]$/.test(e)}isAlphaNumeric(e){return this.isAlpha(e)||this.isNumeric(e)||"?"===e}skipWhitespaces(){for(;!this.isAtEnd()&&/\s/.test(this.see());)this.advance(),this.charStart++}parseLexeme(){return this.text.slice(this.charStart,this.charIndex)}id(){for(;!this.isAtEnd()&&this.isAlphaNumeric(this.see());)this.advance();let e=this.parseLexeme(),t=L.findIndex(t=>t===e);return-1!=t?new D(t,e,null,this.lineIndex):["benar","salah"].some(t=>t===e)?new D(R,e,"benar"===e,this.lineIndex):new D("nihil"===e?R:$,e,null,this.lineIndex)}number(){let e=!1;for(;!this.isAtEnd()&&this.isNumeric(this.see());)if(this.advance(),"."===this.see()){if(e)break;e=!0,this.advance()}let t=parseFloat(e?this.parseLexeme():this.parseLexeme()+".");return new D(R,this.parseLexeme(),t,this.lineIndex)}string(){for(this.advance();!this.isAtEnd()&&'"'!==this.see();)this.advance();this.isAtEnd()&&this.error("Petik tidak tertutup."),this.advance();let e=this.parseLexeme();return new D(R,e,e.slice(1,e.length-1),this.lineIndex)}comment(){for(;!this.isAtEnd()&&"\n"!==this.see();)this.advance(),this.charStart++;this.advance(),this.charStart++}multilineComment(){for(this.advance(),this.advance(),this.charStart=this.charStart+2;!this.isAtEnd()&&("*"!==this.see()||"/"!==this.peek());)this.advance(),this.charStart++;this.advance(),this.advance(),this.charStart=this.charStart+2}makeToken(e){return this.advance(),new D(e,this.parseLexeme(),null,this.lineIndex)}scan(){for(this.skipWhitespaces();"#"===this.see()||"/"===this.see()&&"*"===this.peek();)"#"===this.see()?this.comment():this.multilineComment(),this.skipWhitespaces();if(this.isAlpha(this.see()))return this.id();if(this.isNumeric(this.see()))return this.number();switch(this.see()){case"$":return this.makeToken(48);case":":return this.makeToken(47);case"+":return this.makeToken(22);case"-":return this.makeToken(23);case"/":return this.makeToken(25);case"*":return this.makeToken(24);case"(":return this.makeToken(P);case")":return this.makeToken(_);case".":return this.makeToken(34);case",":return this.makeToken(B);case"{":return this.makeToken(35);case"}":return this.makeToken(36);case"[":return this.makeToken(38);case"]":return this.makeToken(39);case"|":return">"===this.peek()?(this.advance(),this.makeToken(46)):this.makeToken(40);case"&":return this.makeToken(41);case"%":return this.makeToken(45);case"!":return"="===this.peek()?(this.advance(),this.makeToken(44)):this.makeToken(42);case">":return"="===this.peek()?(this.advance(),this.makeToken(29)):this.makeToken(28);case"<":return"="===this.peek()?(this.advance(),this.makeToken(31)):this.makeToken(30);case"=":return"="===this.peek()&&">"===this.peek(2)?this.makeToken(32):"="===this.peek()?(this.advance(),this.makeToken(33)):">"===this.peek()?(this.advance(),this.makeToken(43)):this.makeToken(32);case'"':return this.string()}this.isAtEnd()||this.error(`karakter tidak valid: Menemukan '${this.see()}'.`)}error(e){throw new a("Error Tulisan => "+e,this.see().line)}debugPrintTokens(e){for(let t of e)console.log(t.toString())}}class J{accept(e){return this.visit(e)}}class W extends J{constructor(e,t,i){super(),this.left=e,this.op=t,this.right=i}visit(e){return e.visitBinaryExpr(this)}}class q extends J{constructor(e,t){super(),this.op=e,this.right=t}visit(e){return e.visitUnaryExpr(this)}}class V extends J{constructor(e){super(),this.token=e}visit(e){return e.visitLiteralExpr(this)}}class Z extends J{constructor(e){super(),this.expr=e}visit(e){return e.visitGroupingExpr(this)}}class z extends J{constructor(e,t){super(),this.main=e,this.member=t}visit(e){return e.visitMemberExpr(this)}}class X extends J{constructor(e){super(),this.token=e}visit(e){return e.visitIdentifierExpr(this)}}class Q extends J{constructor(e,t,i){super(),this.params=e,this.returnType=t,this.block=i}visit(e){return e.visitLambdaExpr(this)}}class Y extends J{constructor(e,t){super(),this.callable=e,this.args=t}visit(e){return e.visitCallExpr(this)}}let ee=class extends J{constructor(e){super(),this.contents=e}visit(e){return e.visitArrayExpr(this)}};class te extends J{constructor(e,t){super(),this.iterable=e,this.index=t}visit(e){return e.visitIndexExpr(this)}}class ie extends J{constructor(e,t){super(),this.expr=e,this.pipeTo=t}visit(e){return e.visitPipeLineExpr(this)}}class ae{accept(e){return this.visit(e)}}class se extends ae{constructor(e){super(),this.expr=e}visit(e){return e.visitCetakStmt(this)}}class ne extends ae{constructor(e,t,i){super(),this.type=e,this.name=t,this.expr=i}visit(e){return e.visitDatumStmt(this)}}class re extends ae{constructor(e,t,i){super(),this.type=e,this.tetap=t,this.contents=i}visit(e){return e.visitTypeStmt(this)}}class he extends ae{constructor(e){super(),this.expr=e}visit(e){return e.visitKerjaStmt(this)}}class le extends ae{constructor(e){super(),this.statements=e}visit(e){return e.visitBlockStmt(this)}}class me extends ae{constructor(e,t,i){super(),this.condition=e,this.thenBlock=t,this.elseKalau=i}visit(e){return e.visitKalauStmt(this)}}class oe extends ae{constructor(e,t,i,a){super(),this.varType=e,this.varName=t,this.iterable=i,this.block=a}visit(e){return e.visitUntukStmt(this)}}class de extends ae{constructor(e,t){super(),this.condition=e,this.block=t}visit(e){return e.visitSlagiStmt(this)}}class ue extends ae{constructor(){super()}visit(e){return e.visitHentiStmt(this)}}class ce extends ae{constructor(){super()}visit(e){return e.visitLewatStmt(this)}}class pe extends ae{constructor(){super()}visit(e){return e.visitJatuhStmt(this)}}class ke extends ae{constructor(e,t){super(),this.variable=e,this.value=t}visit(e){return e.visitRubahStmt(this)}}class be extends ae{constructor(e){super(),this.expr=e}visit(e){return e.visitHasilStmt(this)}}class fe extends ae{constructor(e,t){super(),this.name=e,this.enums=t}visit(e){return e.visitJenisStmt(this)}}class we extends ae{constructor(e,t){super(),this.expr=e,this.cases=t}visit(e){return e.visitLihatStmt(this)}}class ve extends ae{constructor(e,t){super(),this.name=e,this.contents=t}visit(e){return e.visitModelStmt(this)}}let Se=class extends ae{constructor(e){super(),this.statements=e}visit(e){return e.visitSimplStmt(this)}};class ge extends ae{constructor(e,t){super(),this.name=e,this.statements=t}visit(e){return e.visitModulStmt(this)}}class ye{constructor(){this.init()}init(){this.tokens=[],this.tokenIndex=0,this.tree=null}parse(e){this.init(),this.tokens=e;let t=[];for(;!this.match(19);)t.push(this.statement());return this.tree=new Se(t),this.tree}see(){return this.tokens[this.tokenIndex]}peek(){return this.tokenIndex+1>=this.tokens.length?null:this.tokens[this.tokenIndex+1]}check(e){return this.tokens[this.tokenIndex].type===e}isAtEnd(){return this.tokenIndex>=this.tokens.length}match(...e){if(this.isAtEnd())return!1;for(let t of e)if(this.check(t))return this.tokenIndex++,!0;return!1}eat(e,t){this.match(e)||this.error(t)}previous(){return this.tokens[this.tokenIndex-1]}blockStmt(){if(this.match(47))return new le([this.statement()]);this.eat(35,"Mengharapkan sebuah blok.");let e=[];for(;!this.match(36);)e.push(this.statement());return new le(e)}functionCallExpr(e){let t=[];if(this.check(_));else do{let e=this.expression();t.push(e)}while(this.match(B));return this.eat(_,"Mengharapkan ')' setelah penggunaan mesin."),new Y(e,t)}lambda(){let e=[];if(this.eat(P,"Mengharapkan '(' setelah '=>' untuk deklarasi objek `mesin`."),this.match($,U)){let t=this.typeStmt();this.eat($,"Mengharapkan Nama parameter setelah deklarasi Tipe parameter dalam objek `mesin`.");let i=this.previous();for(e.push([t,i]);this.match(B);){this.match($,U)||this.error("Mengharapkan Tipe parameter setelah koma dalam objek `mesin`.");let t=this.typeStmt();this.eat($,"Mengharapkan Nama parameter setelah deklarasi Tipe parameter dalam objek `mesin`.");let i=this.previous();e.push([t,i])}}this.eat(_,"Mengharapkan ')' setelah deklarasi parameter objek `mesin`.");let t=null;this.match($,U)&&(t=this.typeStmt()),this.match(R)&&(null!==this.previous().value&&this.error("Mengharapkan Tipe Hasil yang valid."),t=null);let i=this.blockStmt();return new Q(e,t,i)}arrayExpr(){if(this.match(39))return new ee([]);let e=[];do{if(this.check(39))break;let t=this.expression();e.push(t)}while(this.match(B));return this.eat(39,"Mengharapkan ']' untuk menutup 'baris'."),new ee(e)}arrayIndex(e){let t=this.expression();return this.eat(39,"Mengharapkan ']' untuk menutup indeks."),new te(e,t)}primary(){if(this.match(P)){let e=this.expression();return this.eat(_,"Mengharapkan ')' untuk mengakhiri ekspresi kurung"),new Z(e)}return this.match(R)?new V(this.previous()):this.match($,48)?this.identifier():this.match(43)?this.lambda():this.match(38)?this.arrayExpr():void this.error("Mengharapkan Ekspresi valid.")}valuable(){let e=this.primary();for(;;)if(this.match(P))e=this.functionCallExpr(e);else if(this.match(38))e=this.arrayIndex(e);else{if(!this.match(34))break;e=this.member(e)}return e}unary(){if(this.match(22,23,42)){let e=this.previous(),t=this.unary();return new q(e,t)}return this.valuable()}identifier(){return new X(this.previous())}member(e){this.eat($,"Mengharapkan Nama variabel setelah '.'.");let t=this.identifier();return new z(e,t)}factor(){let e=this.unary();for(;this.match(45,24,25);){let t=this.previous(),i=this.unary();e=new W(e,t,i)}return e}term(){let e=this.factor();for(;this.match(22,23);){let t=this.previous(),i=this.factor();e=new W(e,t,i)}return e}equality(){let e=this.term();if(this.match(28,29,30,31,33,44)){let t=this.previous(),i=this.term();e=new W(e,t,i)}return e}andTerm(){let e=this.equality();for(;this.match(41);){let t=this.previous(),i=this.equality();e=new W(e,t,i)}return e}orTerm(){let e=this.andTerm();for(;this.match(40);){let t=this.previous(),i=this.andTerm();e=new W(e,t,i)}return e}pipeLine(){let e=this.orTerm();for(;this.match(46);){let t=this.orTerm();e=new ie(e,t)}return e}expression(){return this.pipeLine()}cetakStmt(){let e=this.expression();return new se(e)}typeStmt(){if(this.previous().type===U){let e=!1;return this.match(14)&&(e=!0),new re(null,e,null)}let e=this.identifier(),t=!1;return this.match(14)&&(t=!0),new re(e,t,null)}datumStmt(){let e=this.typeStmt();this.eat($,"Mengharapkan Nama setelah Tipe pada deklarasi variabel.");let t=this.previous();this.eat(32,"Mengharapkan '=' setelah Nama variabel.");let i=this.expression();return new ne(e,t,i)}kalauStmt(){this.check(35)&&this.error("Mengharapkan ekspresi setelah 'kalau'.");let e=this.expression(),t=this.blockStmt(),i=null;if(this.match(2))if(this.match(1))i=this.kalauStmt();else{let e=null,t=this.blockStmt();i=new me(e,t)}return new me(e,t,i)}untukStmt(){this.match($,U)||this.error("Mengharapkan Tipe variabel untuk diinisialisasi setelah 'untuk'.");let e=this.typeStmt();this.eat($,"Mengharapkan Nama variabel setelah Tipe dalam pernyataan 'untuk'.");let t=this.previous();this.eat(8,"Mengharapkan 'dalam' setelah deklarasi variabel pada pernyataan 'untuk'.");let i=this.expression(),a=this.blockStmt();return new oe(e,t,i,a)}slagiStmt(){let e=this.expression(),t=this.blockStmt();return new de(e,t)}rubahStmt(){let e=this.valuable(),t=null;this.match(22,23,24,25,41,40,45)&&(t=new W(e,this.previous(),null)),this.eat(32,"Mengharapkan '=' setelah variable yang ingin di-'rubah'.");let i=this.expression();return t&&(t.right=i,i=t),new ke(e,i)}jenisStmt(){this.eat($,"Mengharapkan Nama Jenis setelah 'jenis'.");let e=this.previous();this.eat(P,"Mengharapkan '(' setelah deklarasi Nama Jenis."),this.check(_)&&this.error("Isian Jenis tidak boleh kosong.",!1);let t=[];do{this.eat($,"Mengharapkan macam jenis dalam 'jenis'.");let e=this.previous();t.push(e)}while(this.match(B));return this.eat(_,"Mengharapkan ')' untuk mengakhiri deklarasi 'jenis'."),new fe(e,t)}lihatStmt(){let e=this.expression(),t=[];for(this.check(17)||this.error("Mengharapkan `kasus` setelah ekspresi dalam `lihat`.");this.match(17);)t.push([this.expression(),this.blockStmt()]);return this.match(2)&&t.push([null,this.blockStmt()]),new we(e,t)}modelStmt(){this.eat($,"Mengharapkan Nama Model setelah 'model'.");let e=this.previous();this.eat(P,"Mengharapkan '(' setelah Nama Model dalam 'model'."),this.check(_)&&this.error("Model tidak boleh tanpa isian.",!1);let t=[];do{this.match($,U)||this.error("Mengharapkan Tipe variabel dalam deklarasi 'Model'.");let e=this.typeStmt();this.eat($,"Mengharapkan Nama variabel dalam deklarasi 'model'.");let i=this.previous();t.push([e,i])}while(this.match(B));return this.eat(_,"Mengharapkan ')' untuk mengakhiri deklarasi 'model'."),new ve(e,t)}modulStmt(){this.eat($,"Mengharapkan Nama modul setelah deklarasi.");let e=this.previous(),t=this.blockStmt();return new ge(e,t.statements)}statement(){return this.match(5)?this.cetakStmt():this.match($,U)?this.datumStmt():this.match(10)?new he(this.expression()):this.match(1)?this.kalauStmt():this.check(35)?this.blockStmt():this.match(4)?this.untukStmt():this.match(3)?this.slagiStmt():this.match(6)?new ue:this.match(7)?new ce:this.match(18)?new pe:this.match(0)?this.rubahStmt():this.match(9)?new be(this.expression()):this.match(12)?this.jenisStmt():this.match(16)?this.lihatStmt():this.match(13)?this.modelStmt():this.match(15)?this.modulStmt():void this.error(`Pernyataan tidak bisa diawali '${this.see().lexeme}'.`,!1)}error(e,t=!0){throw new i("Error Struktur => "+e+(t?` Menemukan '${this.see().lexeme}'.`:""),this.see().line)}}class Ae{constructor(e={keepMemory:!1}){this.lexer=new F,this.parser=new ye,this.interpreter=new O,this.keepMemory=!!e?.keepMemory&&e.keepMemory}runCode(i){this.keepMemory||this.interpreter.init();const a=i.split("\n");try{let e=this.lexer.scanTokens(i),t=this.parser.parse(e);return this.interpreter.interpret(t).join("\n")}catch(i){if(i instanceof e){const e=a[i.line-1];let s=(e?`ERROR! Pada baris ke-${i.line}\n>> `+e+"\n":"")+i.message;return i instanceof t&&(s+=(i.output?"\nOutput dari kode:\n":"")+i.output),s}return`[Pada baris ke-${this.interpreter.line}] Uh Oh, ini error sistem. Mohon laporkan agar diperbaiki. [ ${i} ]`}}}export{Ae as Simpl};
|