vladx 1.3.2 → 1.5.1

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.
Files changed (43) hide show
  1. package/bin/vladx +4 -1
  2. package/examples/stdlib/ambiente.vx +8 -0
  3. package/examples/stdlib/archivio_extra.vx +11 -0
  4. package/examples/stdlib/asserzione.vx +11 -0
  5. package/examples/stdlib/client_web.vx +7 -0
  6. package/examples/stdlib/codifica.vx +8 -0
  7. package/examples/stdlib/collezioni.vx +11 -0
  8. package/examples/stdlib/compressione.vx +10 -0
  9. package/examples/stdlib/console.vx +14 -0
  10. package/examples/stdlib/cripto.vx +8 -0
  11. package/examples/stdlib/dati.vx +21 -0
  12. package/examples/stdlib/eventi.vx +10 -0
  13. package/examples/stdlib/json_extra.vx +7 -0
  14. package/examples/stdlib/matematica.vx +9 -0
  15. package/examples/stdlib/percorso.vx +9 -0
  16. package/examples/stdlib/processo.vx +9 -0
  17. package/examples/stdlib/server_web.vx +10 -0
  18. package/examples/stdlib/sql_helper.vx +7 -0
  19. package/examples/stdlib/tempo.vx +9 -0
  20. package/examples/stdlib/testo.vx +10 -0
  21. package/examples/stdlib/url.vx +11 -0
  22. package/examples/stdlib/validazione.vx +5 -0
  23. package/package.json +6 -2
  24. package/programs/1/index.vx +16 -4
  25. package/programs/main/index.vx +11 -8
  26. package/programs/main/passports/Alina.json +1 -0
  27. package/programs/main/passports/Tanya.json +1 -0
  28. package/programs/main/passports/vlad.json +1 -0
  29. package/programs/main/test_async.vx +25 -0
  30. package/programs/main/test_async_advanced.vx +35 -0
  31. package/programs/main/test_backend.vx +33 -0
  32. package/programs/tests/test_new_features.vx +53 -0
  33. package/programs/tests/test_stdlib.vx +26 -0
  34. package/programs/tests/test_templates.vx +8 -0
  35. package/src/cli/cli.js +8 -6
  36. package/src/interpreter/interpreter.js +388 -170
  37. package/src/lexer/lexer.js +5 -1
  38. package/src/lexer/tokens.js +9 -1
  39. package/src/parser/ast.js +59 -4
  40. package/src/parser/parser.js +152 -18
  41. package/src/repl/repl.js +5 -5
  42. package/src/stdlib/registry.js +301 -0
  43. /package/programs/main/passports/{Vlad.txt → Vlad.json} +0 -0
package/bin/vladx CHANGED
@@ -7,4 +7,7 @@
7
7
 
8
8
  const { run } = require('../src/cli/cli.js');
9
9
 
10
- run(process.argv.slice(2));
10
+ run(process.argv.slice(2)).catch(err => {
11
+ console.error(err);
12
+ process.exit(1);
13
+ });
@@ -0,0 +1,8 @@
1
+ importa { prendi } da "@std/Ambiente";
2
+
3
+ variabile path = prendi("PATH");
4
+ stampa("Tuo percorso di sistema (PATH):");
5
+ stampa(path);
6
+
7
+ variabile user = prendi("USER") ?? prendi("USERNAME");
8
+ stampa("\nUtente corrente: " + user);
@@ -0,0 +1,11 @@
1
+ importa { elencaTutto } da "@std/ArchivioExtra";
2
+
3
+ stampa("Analisi completa cartella 'src':");
4
+ variabile fileSrc = elencaTutto("src");
5
+
6
+ // Mostro solo i primi 5 per brevità
7
+ variabile i = 0;
8
+ per (variabile f di fileSrc) {
9
+ se (i < 5) stampa("- " + f);
10
+ i++;
11
+ }
@@ -0,0 +1,11 @@
1
+ importa { uguale, vero } da "@std/Asserzione";
2
+
3
+ stampa("Esecuzione test unitari...");
4
+
5
+ prova {
6
+ uguale(10 + 10, 20);
7
+ vero(5 > 0);
8
+ stampa("Test passati!");
9
+ } cattura (e) {
10
+ stampa("Errore asserzione: " + e);
11
+ }
@@ -0,0 +1,7 @@
1
+ importa { get } da "@std/ClientWeb";
2
+
3
+ stampa("Recupero dati da API esterna...");
4
+ variabile dati = get("https://jsonplaceholder.typicode.com/todos/1");
5
+
6
+ stampa("Risposta ricevuta:");
7
+ stampa(dati);
@@ -0,0 +1,8 @@
1
+ importa { base64, daBase64, hex, uri } da "@std/Codifica";
2
+
3
+ variabile t = "VladX Core";
4
+
5
+ stampa("Testo: " + t);
6
+ stampa("Base64: " + base64(t));
7
+ stampa("Hex: " + hex(t));
8
+ stampa("URI encoded: " + uri("https://vlad.it?n=vlad x"));
@@ -0,0 +1,11 @@
1
+ importa { CreaMappa, CreaInsieme, chiavi, valori } da "@std/Collezioni";
2
+
3
+ stampa("--- MAPPA ---");
4
+ variabile m = CreaMappa();
5
+ m.set("chiave", "valore");
6
+ stampa("Contenuto mappa: " + m.get("chiave"));
7
+
8
+ stampa("\n--- OGGETTI ---");
9
+ variabile obj = { nome: "Vlad", versione: 1.4 };
10
+ stampa("Chiavi: " + chiavi(obj));
11
+ stampa("Valori: " + valori(obj));
@@ -0,0 +1,10 @@
1
+ importa { comprimi, decomprimi } da "@std/Compressione";
2
+
3
+ variabile segreto = "Questo è un messaggio molto lungo che vogliamo comprimere.";
4
+ stampa("Originale (" + lunghezza(segreto) + " byte): " + segreto);
5
+
6
+ variabile compresso = comprimi(segreto);
7
+ stampa("Compresso (Base64): " + compresso);
8
+
9
+ variabile decompresso = decomprimi(compresso);
10
+ stampa("Decompresso: " + decompresso);
@@ -0,0 +1,14 @@
1
+ importa { log, errore, avviso, successo, tabella } da "@std/Console";
2
+
3
+ log("Semplice log di sistema");
4
+ successo("Operazione completata con successo!");
5
+ avviso("Attenzione: valore instabile.");
6
+ errore("Errore critico rilevato!");
7
+
8
+ variabile dati = [
9
+ { id: 1, nome: "Vlad" },
10
+ { id: 2, nome: "Rex" }
11
+ ];
12
+
13
+ stampa("\nVisualizzazione tabella:");
14
+ tabella(dati);
@@ -0,0 +1,8 @@
1
+ importa { sha256, md5, uuid, casuale } da "@std/Cripto";
2
+
3
+ stampa("Generazione UUID: " + uuid());
4
+ stampa("Token casuale (Hex): " + casuale(32));
5
+
6
+ variabile password = "vlad_password_sicura";
7
+ stampa("SHA256: " + sha256(password));
8
+ stampa("MD5: " + md5(password));
@@ -0,0 +1,21 @@
1
+ importa { clona, fondi, raggruppa } da "@std/Dati";
2
+
3
+ stampa("--- CLONE ---");
4
+ variabile a = { x: 1 };
5
+ variabile b = clona(a);
6
+ b.x = 2;
7
+ stampa("a.x (dovrebbe essere 1): " + a.x);
8
+
9
+ stampa("\n--- MERGE ---");
10
+ variabile base = { nome: "Vlad" };
11
+ variabile extra = { eta: 25 };
12
+ fondi(base, extra);
13
+ stampa(base);
14
+
15
+ stampa("\n--- GROUP BY ---");
16
+ variabile persone = [
17
+ { nome: "Luca", citta: "Roma" },
18
+ { nome: "Sara", citta: "Milano" },
19
+ { nome: "Marco", citta: "Roma" }
20
+ ];
21
+ stampa(raggruppa(persone, "citta"));
@@ -0,0 +1,10 @@
1
+ importa { CreaEmitter } da "@std/Eventi";
2
+
3
+ variabile bus = CreaEmitter();
4
+
5
+ bus.su("benvenuto", (dati) => {
6
+ stampa("Evento ricevuto! Dati: " + dati);
7
+ });
8
+
9
+ stampa("Lancio evento...");
10
+ attendi bus.lancia("benvenuto", "Ciao da VladX");
@@ -0,0 +1,7 @@
1
+ importa { codifica, analizzaSicuro } da "@std/JsonExtra";
2
+
3
+ variabile dati = { api: "vladx", opzioni: [1, 2, 3] };
4
+ stampa(codifica(dati));
5
+
6
+ variabile str = '{"valido": vero}';
7
+ stampa("Safe Parse: " + analizzaSicuro(str).valido);
@@ -0,0 +1,9 @@
1
+ importa { piGreco, radice, casuale, rotonda, max } da "@std/Matematica";
2
+
3
+ stampa("Valore di PI: " + piGreco);
4
+ stampa("Radice di 144: " + radice(144));
5
+ stampa("Arrotonda 4.7: " + rotonda(4.7));
6
+ stampa("Massimo tra 10, 50, 20: " + max(10, 50, 20));
7
+
8
+ variabile n = casuale() * 10;
9
+ stampa("Numero casuale 0-10: " + rotonda(n));
@@ -0,0 +1,9 @@
1
+ importa { unisci, base, cartella, estensione, assoluto } da "@std/Percorso";
2
+
3
+ variabile mioFile = "/home/utente/progetti/test.vx";
4
+
5
+ stampa("File: " + mioFile);
6
+ stampa("Base: " + base(mioFile));
7
+ stampa("Cartella: " + cartella(mioFile));
8
+ stampa("Estensione: " + estensione(mioFile));
9
+ stampa("Percorso assoluto di 'src': " + assoluto("src"));
@@ -0,0 +1,9 @@
1
+ importa { id, memoria, piattaforma, versioneNode } da "@std/Processo";
2
+
3
+ stampa("--- INFO PROCESSO ---");
4
+ stampa("ID: " + id);
5
+ stampa("Piattaforma: " + piattaforma);
6
+ stampa("Node Version: " + versioneNode);
7
+
8
+ stampa("\nUso memoria:");
9
+ stampa(memoria());
@@ -0,0 +1,10 @@
1
+ importa { rispondiJson, errore } da "@std/ServerWeb";
2
+
3
+ // Esempio d'uso teorico con Rete.server (vedi documentazione)
4
+ // gestore = (richiesta) => {
5
+ // ritorna rispondiJson({ stato: "ok", msg: "Ciao da VladX" });
6
+ // };
7
+
8
+ variabile resp = rispondiJson({ id: 1 });
9
+ stampa("Esempio risposta JSON:");
10
+ stampa(resp);
@@ -0,0 +1,7 @@
1
+ importa { generaInsert } da "@std/SqlHelper";
2
+
3
+ variabile utente = { nome: "Vlad", eta: 25, ruolo: "Admin" };
4
+ variabile sql = generaInsert("utenti", utente);
5
+
6
+ stampa("SQL generato:");
7
+ stampa(sql);
@@ -0,0 +1,9 @@
1
+ importa { data, ora, pausa, timestamp } da "@std/Tempo";
2
+
3
+ stampa("Oggi è il: " + data());
4
+ stampa("Ora attuale: " + ora());
5
+ stampa("Timestamp: " + timestamp());
6
+
7
+ stampa("\nAttendo 1 secondo...");
8
+ attendi pausa(1000);
9
+ stampa("Fine attesa.");
@@ -0,0 +1,10 @@
1
+ importa { maiuscolo, minuscolo, capitalizza, slugify, pulisci } da "@std/Testo";
2
+
3
+ variabile testo = " vladx è fantastico ";
4
+
5
+ stampa("Originale: '" + testo + "'");
6
+ stampa("Pulisci: '" + pulisci(testo) + "'");
7
+ stampa("Maiuscolo: " + maiuscolo(testo));
8
+ stampa("Minuscolo: " + minuscolo(testo));
9
+ stampa("Capitalizza: " + capitalizza("vlad"));
10
+ stampa("Slugify: " + slugify("Benvenuti su VladX 2.0!"));
@@ -0,0 +1,11 @@
1
+ importa { analizza, componi } da "@std/Url";
2
+
3
+ variabile link = "https://vladx.org/search?q=syntax&lang=it#top";
4
+ variabile info = analizza(link);
5
+
6
+ stampa("Host: " + info.host);
7
+ stampa("Protocollo: " + info.protocollo);
8
+ stampa("Query: " + info.query.q);
9
+
10
+ variabile nuovoLink = componi("https://api.test.com", { chiave: "123", utente: "vlad" });
11
+ stampa("Nuovo URL: " + nuovoLink);
@@ -0,0 +1,5 @@
1
+ importa { email, url, ip } da "@std/Validazione";
2
+
3
+ stampa("Email valida? " + email("test@vladx.it")); // vero
4
+ stampa("URL valido? " + url("httttp://errore")); // falso
5
+ stampa("IP valido? " + ip("192.168.1.1")); // vero
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vladx",
3
- "version": "1.3.2",
3
+ "version": "1.5.1",
4
4
  "description": "VladX - Linguaggio di programmazione con sintassi italiana",
5
5
  "main": "src/index.js",
6
6
  "type": "commonjs",
@@ -19,5 +19,9 @@
19
19
  "interpreter"
20
20
  ],
21
21
  "author": "VladX Team",
22
- "license": "MIT"
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "better-sqlite3": "^12.6.2",
25
+ "mysql2": "^3.16.2"
26
+ }
23
27
  }
@@ -1,4 +1,16 @@
1
- stampa("Ciao dal programma 1!");
2
- costante saluti = { matteo: "Ciao!", vlad: "Ehilà!" };
3
- stampa("Matteo dice: " + saluti.matteo);
4
- stampa("Vlad dice: " + saluti.vlad);
1
+ classe Persona {
2
+ funzione costruttore(nome, eta) {
3
+ questo.nome = nome;
4
+ questo.eta = eta;
5
+ }
6
+
7
+ funzione saluta() {
8
+ stampa("Ciao, sono " + questo.nome + " e ho " + questo.eta + " anni");
9
+ }
10
+ }
11
+
12
+ variabile p1 = nuovo Persona("Mario", 25);
13
+ p1.saluta();
14
+
15
+ variabile p2 = nuovo Persona("Luigi", 30);
16
+ p2.saluta();
@@ -1,12 +1,15 @@
1
1
  variabile passport = {}
2
2
  passport.nome = chiedi("Come ti chiami? ")
3
- passport.eta = chiedi("Quanti anni hai? ")
4
-
5
- se(passport.eta >= 18) {
6
- stampa("Sei maggiorenne")
3
+ se(Archivio.esiste(`passports/${passport.nome}.json`)) {
4
+ stampa("GIA ESISTE, VATTENE!!")
7
5
  } altrimenti {
8
- stampa("Sei minorenne")
9
- }
10
- stampa(passport)
6
+ passport.eta = chiedi("Quanti anni hai? ")
7
+
8
+ se(passport.eta >= 18) {
9
+ stampa("Sei maggiorenne")
10
+ } altrimenti {
11
+ stampa("Sei minorenne")
12
+ }
11
13
 
12
- Archivio.scrivi(`passports/${passport.nome}.txt`, JSON.stringify(passport))
14
+ Archivio.scrivi(`passports/${passport.nome}.json`, JSON.stringify(passport))
15
+ }
@@ -0,0 +1 @@
1
+ {"nome":"Alina","eta":"39"}
@@ -0,0 +1 @@
1
+ {"nome":"Tanya","eta":"70"}
@@ -0,0 +1 @@
1
+ {"nome":"vlad","eta":"13"}
@@ -0,0 +1,25 @@
1
+ stampa("--- Test Async/Await ---")
2
+
3
+ asincrono funzione aspetta_e_ritorna(ms, val) {
4
+ stampa(`Attendo ${ms}ms...`)
5
+ aspetta(ms) // Nota: 'aspetta' è sincrono bloccante nella mia implementazione attuale, ma simula lavoro.
6
+ // Per testare await vero, avrei bisogno di funzioni async native che ritornano promise.
7
+ // Ma 'asincrono' funzione ritorna Promise, quindi 'attendi' dovrebbe funzionare su di essa.
8
+ stampa("Fatto!")
9
+ ritorna val
10
+ }
11
+
12
+ asincrono funzione main() {
13
+ stampa("Inizio main")
14
+ variabile p = aspetta_e_ritorna(500, 42)
15
+ stampa(`P è una Promise? ${tipo(p) == 'promessa'}`) // Dovrebbe essere vero (promessa)
16
+
17
+ variabile risultato = attendi p
18
+ stampa(`Risultato: ${risultato}`)
19
+
20
+ variabile diretto = attendi aspetta_e_ritorna(200, 100)
21
+ stampa(`Diretto: ${diretto}`)
22
+ }
23
+
24
+ attendi main()
25
+ stampa("Fine script")
@@ -0,0 +1,35 @@
1
+ stampa("--- Test Async Advanced ---")
2
+
3
+ // 1. Async Arrow Function
4
+ variabile saluta = asincrono (nome) => {
5
+ aspetta(100)
6
+ ritorna `Ciao, ${nome}!`
7
+ }
8
+
9
+ // 2. Async Class Method
10
+ classe Lavoratore {
11
+ funzione costruttore(nome) {
12
+ questo.nome = nome
13
+ }
14
+
15
+ asincrono funzione lavora(compito) {
16
+ stampa(`${questo.nome} sta lavorando a: ${compito}...`)
17
+ aspetta(300)
18
+ ritorna `${compito} completato`
19
+ }
20
+ }
21
+
22
+ asincrono funzione test() {
23
+ stampa("Test Arrow Function...")
24
+ variabile promessa = saluta("Vlad")
25
+ stampa(`Tipo: ${tipo(promessa)}`)
26
+ stampa(attendi promessa)
27
+
28
+ stampa("\nTest Class Method...")
29
+ variabile v = nuovo Lavoratore("Vlado")
30
+ variabile res = attendi v.lavora("Refactoring")
31
+ stampa(res)
32
+ }
33
+
34
+ attendi test()
35
+ stampa("\nFine Test Advanced")
@@ -0,0 +1,33 @@
1
+ stampa("--- Test Base64 ---")
2
+ variabile testo = "Ciao VladX"
3
+ variabile enc = Base64.codifica(testo)
4
+ stampa(`Encoded: ${enc}`)
5
+ variabile dec = Base64.decodifica(enc)
6
+ stampa(`Decoded: ${dec}`)
7
+
8
+ stampa("\n--- Test Buffer ---")
9
+ variabile buf = Buffer.from("Hello", "utf8")
10
+ stampa(`Is Buffer: ${Buffer.isBuffer(buf)}`)
11
+
12
+ stampa("\n--- Test SQLite ---")
13
+ variabile db = SQLite.apri("test.db")
14
+ db.esegui("CREATE TABLE IF NOT EXISTS utenti (id INTEGER PRIMARY KEY, nome TEXT)")
15
+ variabile result = db.esegui("INSERT INTO utenti (nome) VALUES ('Marco')")
16
+ stampa(`Inserito ID: ${result.ultimoId}`)
17
+ variabile utenti = db.interroga("SELECT * FROM utenti")
18
+ stampa(`Utenti: ${JSON.stringify(utenti)}`)
19
+ db.chiudi()
20
+ Archivio.elimina("test.db")
21
+
22
+ stampa("\n--- Test MySQL (connection failure expected) ---")
23
+ prova {
24
+ variabile conn = MySQL.connetti({
25
+ host: "127.0.0.1",
26
+ user: "root",
27
+ password: "wrong_password",
28
+ connectTimeout: 2000
29
+ })
30
+ conn.chiudi()
31
+ } cattura (err) {
32
+ stampa(`Errore catturato correttamente: ${err}`)
33
+ }
@@ -0,0 +1,53 @@
1
+ // Test Nuove Funzionalità VladX
2
+
3
+ stampa("--- TEST SCEGLI-CASO ---");
4
+ variabile colore = "verde";
5
+ scegli (colore) {
6
+ caso "rosso":
7
+ stampa("Alt!");
8
+ interrompi;
9
+ caso "verde":
10
+ stampa("Vai!");
11
+ interrompi;
12
+ predefinito:
13
+ stampa("Colore ignoto");
14
+ }
15
+
16
+ stampa("\n--- TEST DESTRUTTURAZIONE ---");
17
+ variabile [a, b] = [10, 20];
18
+ stampa("a: " + a + ", b: " + b); // 10, 20
19
+
20
+ variabile { nome, eta } = { nome: "Vlad", eta: 25, citta: "Roma" };
21
+ stampa("Nome: " + nome + ", Eta: " + eta); // Vlad, 25
22
+
23
+ stampa("\n--- TEST OPERATORE TERNARIO ---");
24
+ variabile x = 10;
25
+ variabile risultato = x > 5 ? "Maggiore" : "Minore";
26
+ stampa("Risultato: " + risultato); // Maggiore
27
+
28
+ stampa("\n--- TEST NULLISH COALESCING ---");
29
+ variabile n = nullo;
30
+ variabile val = n ?? "Default";
31
+ stampa("Valore: " + val); // Default
32
+
33
+ stampa("\n--- TEST OPTIONAL CHAINING ---");
34
+ variabile utente = { info: { nome: "Luca" } };
35
+ stampa("Nome utente: " + utente?.info?.nome); // Luca
36
+ stampa("Cognome utente: " + (utente?.info?.cognome ?? "N/A")); // N/A
37
+
38
+ stampa("\n--- TEST METODI ARRAY ---");
39
+ variabile numeri = [1, 2, 3, 4, 5];
40
+ variabile raddoppiati = attendi numeri.mappa((n) => n * 2);
41
+ stampa("Raddoppiati: " + raddoppiati); // [2, 4, 6, 8, 10]
42
+
43
+ variabile pari = attendi numeri.filtra((n) => n % 2 == 0);
44
+ stampa("Pari: " + pari); // [2, 4]
45
+
46
+ stampa("\n--- TEST MATEMATICA ---");
47
+ stampa("PI: " + Matematica.piGreco);
48
+ stampa("Radice di 16: " + Matematica.radice(16));
49
+ stampa("Casuale (0-1): " + Matematica.casuale());
50
+
51
+ stampa("\n--- TEST TEMPO ---");
52
+ stampa("Data oggi: " + Tempo.data());
53
+ stampa("Ora attuale: " + Tempo.ora());
@@ -0,0 +1,26 @@
1
+ // Test Integrazione Standard Library VladX
2
+
3
+ importa { maiuscolo, slugify } da "@std/Testo";
4
+ importa { sha256, uuid } da "@std/Cripto";
5
+ importa { log, successo, avviso } da "@std/Console";
6
+ importa { data, ora } da "@std/Tempo"; // Modulo integrato precendente (ora anche in @std/Cronometro)
7
+ importa { media, somma } da "@std/Calcolo";
8
+
9
+ stampa("--- TEST @std/Testo ---");
10
+ stampa("Maiuscolo: " + maiuscolo("vladx"));
11
+ stampa("Slug: " + slugify("Questo è un test!"));
12
+
13
+ stampa("\n--- TEST @std/Cripto ---");
14
+ stampa("SHA256: " + sha256("segreto"));
15
+ stampa("UUID: " + uuid());
16
+
17
+ stampa("\n--- TEST @std/Calcolo ---");
18
+ variabile voti = [10, 8, 9, 7];
19
+ stampa("Media: " + media(voti));
20
+ stampa("Somma: " + somma(voti));
21
+
22
+ stampa("\n--- TEST @std/Console ---");
23
+ successo("Questo è un messaggio di successo!");
24
+ avviso("Attenzione: questo è un avviso.");
25
+
26
+ stampa("\n--- FINE TEST ---");
@@ -0,0 +1,8 @@
1
+ // Test Template Strings
2
+ variabile nome = "Vlad";
3
+ variabile eta = 25;
4
+ variabile messaggio = `Ciao, mi chiamo ${nome} e ho ${eta} anni.`;
5
+ stampa(messaggio);
6
+
7
+ variabile calc = `Il doppio di ${eta} è ${eta * 2}.`;
8
+ stampa(calc);
package/src/cli/cli.js CHANGED
@@ -52,7 +52,7 @@ function showVersion() {
52
52
  console.log(`VladX v${VERSION}`);
53
53
  }
54
54
 
55
- function runFile(filePath) {
55
+ async function runFile(filePath) {
56
56
  const absolutePath = path.resolve(filePath);
57
57
 
58
58
  if (!fs.existsSync(absolutePath)) {
@@ -71,7 +71,7 @@ function runFile(filePath) {
71
71
 
72
72
  const interpreter = new Interpreter();
73
73
  interpreter.currentPath = absolutePath;
74
- interpreter.interpret(ast);
74
+ await interpreter.interpret(ast);
75
75
  } catch (error) {
76
76
  console.error(colorize(`✗ Errore: ${error.message}`, 'red'));
77
77
  process.exit(1);
@@ -129,9 +129,11 @@ function showAST(filePath) {
129
129
  }
130
130
  }
131
131
 
132
- function run(args) {
132
+ async function run(args) {
133
133
  if (args.length === 0) {
134
- startREPL();
134
+ startREPL(); // REPL start is synchronous in loop initialization but internal loop is async, it doesn't return promise of completion?
135
+ // startREPL calls repl.start(). repl.start() sets up listeners and returns.
136
+ // It keeps process alive via readline.
135
137
  return;
136
138
  }
137
139
 
@@ -159,7 +161,7 @@ function run(args) {
159
161
  console.error(colorize('✗ Errore: Specificare un file da eseguire', 'red'));
160
162
  process.exit(1);
161
163
  }
162
- runFile(args[1]);
164
+ await runFile(args[1]);
163
165
  break;
164
166
 
165
167
  case 'lex':
@@ -181,7 +183,7 @@ function run(args) {
181
183
  default:
182
184
  // Assume it's a file path
183
185
  if (command.endsWith('.vx') || fs.existsSync(command)) {
184
- runFile(command);
186
+ await runFile(command);
185
187
  } else {
186
188
  console.error(colorize(`✗ Comando sconosciuto: ${command}`, 'red'));
187
189
  console.log('Usa "vladx --help" per vedere i comandi disponibili.');