treste 2.4.4 → 2.4.6
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/INSTALL.md +2 -2
- package/README.md +22 -4
- package/dist/ast.d.ts +44 -4
- package/dist/ast.d.ts.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/compiler.js +1 -1
- package/dist/interpreter.d.ts +8 -0
- package/dist/interpreter.d.ts.map +1 -1
- package/dist/interpreter.js +279 -2
- package/dist/interpreter.js.map +1 -1
- package/dist/lexer.d.ts +1 -0
- package/dist/lexer.d.ts.map +1 -1
- package/dist/lexer.js +50 -11
- package/dist/lexer.js.map +1 -1
- package/dist/parser.d.ts +5 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +232 -5
- package/dist/parser.js.map +1 -1
- package/package.json +12 -14
package/INSTALL.md
CHANGED
|
@@ -59,7 +59,7 @@ Se você quer contribuir ou customizar o Trest:
|
|
|
59
59
|
|
|
60
60
|
```bash
|
|
61
61
|
# Clone o repositório
|
|
62
|
-
|
|
62
|
+
# Baixar o código-fonte do projeto
|
|
63
63
|
cd trest
|
|
64
64
|
|
|
65
65
|
# Instale as dependências
|
|
@@ -255,7 +255,7 @@ Veja [CONTRIBUTING.md](CONTRIBUTING.md) para informações sobre como contribuir
|
|
|
255
255
|
Se você encontrar problemas:
|
|
256
256
|
|
|
257
257
|
1. Verifique a seção de resolução de problemas acima
|
|
258
|
-
2. Consulte
|
|
258
|
+
2. Consulte a documentação em https://trest-site.vercel.app
|
|
259
259
|
3. Abra uma nova issue se necessário
|
|
260
260
|
|
|
261
261
|
## 📄 Licença
|
package/README.md
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
# Trest - Linguagem de Programação com Suporte a Cirílico
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/treste)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org/)
|
|
6
|
+
[](https://trest-site.vercel.app)
|
|
7
|
+
|
|
3
8
|
Linguagem de programação moderna e profissional, estruturalmente organizada e compilável para **Web** e **Desktop (.exe)** com suporte completo a cirílico (alfabeto russo).
|
|
4
9
|
|
|
5
10
|
> **🎯 Característica Única:** Trest permite programar usando palavras-chave em cirílico ou latino, mantendo a mesma sintaxe e funcionalidades.
|
|
6
11
|
|
|
12
|
+
> **🔒 Segurança:** Versão 2.4.4 inclui correções de segurança da cadeia de suprimentos. Veja [SECURITY.md](./SECURITY.md) para detalhes.
|
|
13
|
+
|
|
7
14
|
## 🚀 Principais Funcionalidades
|
|
8
15
|
|
|
9
16
|
- ✅ **Execução Inline** - Execute código direto na linha de comando com `-e`
|
|
@@ -47,9 +54,8 @@ npx trestc programa.trest --mode web
|
|
|
47
54
|
Se você quiser instalar a partir do código-fonte ou fazer modificações:
|
|
48
55
|
|
|
49
56
|
```bash
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
cd trest
|
|
57
|
+
# Baixar o código-fonte
|
|
58
|
+
cd treste
|
|
53
59
|
|
|
54
60
|
# Instalar dependências
|
|
55
61
|
npm install
|
|
@@ -461,6 +467,18 @@ Veja a pasta `exemplos/` para programas completos demonstrando:
|
|
|
461
467
|
- `exemplos/filesystem_demo.trest` - Operações de arquivo
|
|
462
468
|
- `exemplos/todas_funcionalidades.trest` - Exemplo completo
|
|
463
469
|
|
|
470
|
+
## 🔒 Segurança
|
|
471
|
+
|
|
472
|
+
**Versão 2.4.4** inclui correções de segurança da cadeia de suprimentos:
|
|
473
|
+
- ✅ Scripts de instalação removidos
|
|
474
|
+
- ✅ Sem acesso ao shell durante instalação
|
|
475
|
+
- ✅ Acesso à rede controlado e documentado
|
|
476
|
+
|
|
477
|
+
**Documentação de Segurança:**
|
|
478
|
+
- **[SECURITY.md](./SECURITY.md)** - Política de segurança completa
|
|
479
|
+
- **[SOCKET_ALERTS.md](./SOCKET_ALERTS.md)** - Resposta aos alertas do Socket
|
|
480
|
+
- **[CHANGELOG_SECURITY.md](./CHANGELOG_SECURITY.md)** - Changelog de segurança
|
|
481
|
+
|
|
464
482
|
## 📚 Documentação Completa
|
|
465
483
|
|
|
466
484
|
Para mais informações, consulte a documentação completa em `docs/`:
|
|
@@ -470,6 +488,7 @@ Para mais informações, consulte a documentação completa em `docs/`:
|
|
|
470
488
|
- **[API.md](docs/api.md)** - Referência da API
|
|
471
489
|
- **[ARCHITECTURE.md](docs/ARCHITECTURE.md)** - Arquitetura técnica
|
|
472
490
|
- **[WHY_TREST.md](docs/WHY_TREST.md)** - Por que usar Trest
|
|
491
|
+
- **[DOCUMENTACAO_COMPLETA.md](./DOCUMENTACAO_COMPLETA.md)** - Documentação completa unificada
|
|
473
492
|
|
|
474
493
|
Ou visite o site oficial: [https://trest-site.vercel.app](https://trest-site.vercel.app)
|
|
475
494
|
|
|
@@ -482,7 +501,6 @@ MIT
|
|
|
482
501
|
**PoktWeb**
|
|
483
502
|
|
|
484
503
|
- Site de documentação: [https://trest-site.vercel.app](https://trest-site.vercel.app)
|
|
485
|
-
- GitHub: [@poktweb](https://github.com/poktweb)
|
|
486
504
|
|
|
487
505
|
## 🤝 Contribuições
|
|
488
506
|
|
package/dist/ast.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ASTNode = Program | VariableDeclaration | FunctionDeclaration | BlockStatement | IfStatement | SwitchStatement | CaseClause | DefaultClause | WhileStatement | ForStatement | ReturnStatement | ExpressionStatement | PrintStatement | ImportStatement | ExportStatement | BreakStatement | ContinueStatement | TryStatement | ThrowStatement | AssignmentExpression | BinaryExpression | UnaryExpression | TernaryExpression | CallExpression | Identifier | Literal | ArrayLiteral | IndexExpression | ObjectLiteral | MemberExpression;
|
|
1
|
+
export type ASTNode = Program | VariableDeclaration | FunctionDeclaration | ClassDeclaration | BlockStatement | IfStatement | SwitchStatement | CaseClause | DefaultClause | WhileStatement | ForStatement | ForOfStatement | ForInStatement | ReturnStatement | ExpressionStatement | PrintStatement | ImportStatement | ExportStatement | BreakStatement | ContinueStatement | TryStatement | ThrowStatement | AssignmentExpression | BinaryExpression | UnaryExpression | TernaryExpression | CallExpression | NewExpression | Identifier | Literal | ArrayLiteral | IndexExpression | ObjectLiteral | MemberExpression | FunctionExpression;
|
|
2
2
|
export interface Program {
|
|
3
3
|
type: 'Program';
|
|
4
4
|
body: ASTNode[];
|
|
@@ -15,6 +15,29 @@ export interface FunctionDeclaration {
|
|
|
15
15
|
params: string[];
|
|
16
16
|
body: BlockStatement;
|
|
17
17
|
}
|
|
18
|
+
export interface FunctionExpression {
|
|
19
|
+
type: 'FunctionExpression';
|
|
20
|
+
name?: string;
|
|
21
|
+
params: string[];
|
|
22
|
+
body: BlockStatement;
|
|
23
|
+
}
|
|
24
|
+
export interface ClassDeclaration {
|
|
25
|
+
type: 'ClassDeclaration';
|
|
26
|
+
name: string;
|
|
27
|
+
superClass?: Identifier;
|
|
28
|
+
body: ClassBody;
|
|
29
|
+
}
|
|
30
|
+
export interface ClassBody {
|
|
31
|
+
type: 'ClassBody';
|
|
32
|
+
body: ClassMethod[];
|
|
33
|
+
}
|
|
34
|
+
export interface ClassMethod {
|
|
35
|
+
type: 'ClassMethod';
|
|
36
|
+
key: string;
|
|
37
|
+
kind: 'constructor' | 'method';
|
|
38
|
+
params: string[];
|
|
39
|
+
body: BlockStatement;
|
|
40
|
+
}
|
|
18
41
|
export interface BlockStatement {
|
|
19
42
|
type: 'BlockStatement';
|
|
20
43
|
body: ASTNode[];
|
|
@@ -51,6 +74,18 @@ export interface ForStatement {
|
|
|
51
74
|
update?: Expression;
|
|
52
75
|
body: BlockStatement;
|
|
53
76
|
}
|
|
77
|
+
export interface ForOfStatement {
|
|
78
|
+
type: 'ForOfStatement';
|
|
79
|
+
left: VariableDeclaration | Identifier;
|
|
80
|
+
right: Expression;
|
|
81
|
+
body: BlockStatement;
|
|
82
|
+
}
|
|
83
|
+
export interface ForInStatement {
|
|
84
|
+
type: 'ForInStatement';
|
|
85
|
+
left: VariableDeclaration | Identifier;
|
|
86
|
+
right: Expression;
|
|
87
|
+
body: BlockStatement;
|
|
88
|
+
}
|
|
54
89
|
export interface ReturnStatement {
|
|
55
90
|
type: 'ReturnStatement';
|
|
56
91
|
argument?: Expression;
|
|
@@ -96,13 +131,18 @@ export interface ThrowStatement {
|
|
|
96
131
|
type: 'ThrowStatement';
|
|
97
132
|
argument: Expression;
|
|
98
133
|
}
|
|
99
|
-
export type Expression = AssignmentExpression | BinaryExpression | UnaryExpression | TernaryExpression | CallExpression | Identifier | Literal | ArrayLiteral | IndexExpression | ObjectLiteral | MemberExpression;
|
|
134
|
+
export type Expression = AssignmentExpression | BinaryExpression | UnaryExpression | TernaryExpression | CallExpression | NewExpression | FunctionExpression | Identifier | Literal | ArrayLiteral | IndexExpression | ObjectLiteral | MemberExpression;
|
|
100
135
|
export interface AssignmentExpression {
|
|
101
136
|
type: 'AssignmentExpression';
|
|
102
137
|
left: Identifier | IndexExpression;
|
|
103
|
-
operator: '=';
|
|
138
|
+
operator: '=' | '+=' | '-=' | '*=' | '/=' | '%=';
|
|
104
139
|
right: Expression;
|
|
105
140
|
}
|
|
141
|
+
export interface NewExpression {
|
|
142
|
+
type: 'NewExpression';
|
|
143
|
+
callee: Identifier | MemberExpression;
|
|
144
|
+
arguments: Expression[];
|
|
145
|
+
}
|
|
106
146
|
export interface BinaryExpression {
|
|
107
147
|
type: 'BinaryExpression';
|
|
108
148
|
left: Expression;
|
|
@@ -131,7 +171,7 @@ export interface Identifier {
|
|
|
131
171
|
}
|
|
132
172
|
export interface Literal {
|
|
133
173
|
type: 'Literal';
|
|
134
|
-
value: string | number | boolean | null;
|
|
174
|
+
value: string | number | boolean | null | undefined;
|
|
135
175
|
}
|
|
136
176
|
export interface ArrayLiteral {
|
|
137
177
|
type: 'ArrayLiteral';
|
package/dist/ast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GACf,OAAO,GACP,mBAAmB,GACnB,mBAAmB,GACnB,cAAc,GACd,WAAW,GACX,eAAe,GACf,UAAU,GACV,aAAa,GACb,cAAc,GACd,YAAY,GACZ,eAAe,GACf,mBAAmB,GACnB,cAAc,GACd,eAAe,GACf,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,YAAY,GACZ,cAAc,GACd,oBAAoB,GACpB,gBAAgB,GAChB,eAAe,GACf,iBAAiB,GACjB,cAAc,GACd,UAAU,GACV,OAAO,GACP,YAAY,GACZ,eAAe,GACf,aAAa,GACb,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -46,7 +46,8 @@ const interpreter_1 = require("./interpreter");
|
|
|
46
46
|
const errors_1 = require("./errors");
|
|
47
47
|
const module_1 = require("./module");
|
|
48
48
|
const minimist_1 = __importDefault(require("minimist"));
|
|
49
|
-
const
|
|
49
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf-8'));
|
|
50
|
+
const VERSION = packageJson.version;
|
|
50
51
|
function main() {
|
|
51
52
|
const args = (0, minimist_1.default)(process.argv.slice(2));
|
|
52
53
|
// Validação de argumentos
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAyC;AACzC,mCAAgC;AAChC,qCAAkC;AAClC,+CAA4C;AAC5C,qCAAsC;AACtC,qCAAwC;AACxC,wDAAgC;AAEhC,MAAM,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/compiler.js
CHANGED
|
@@ -153,7 +153,7 @@ Examples:
|
|
|
153
153
|
trestc script.trest --mode exe -o app.exe
|
|
154
154
|
trestc app.trest --mode web --minify --expose
|
|
155
155
|
|
|
156
|
-
For more information visit: https://
|
|
156
|
+
For more information visit: https://trest-site.vercel.app
|
|
157
157
|
`);
|
|
158
158
|
}
|
|
159
159
|
async function compileWeb(inputFile, outputFile, options = {}, verbose = false) {
|
package/dist/interpreter.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export declare class Interpreter {
|
|
|
17
17
|
private evaluatePrintStatement;
|
|
18
18
|
private evaluateExpression;
|
|
19
19
|
private evaluateAssignment;
|
|
20
|
+
private evaluateBinaryOperation;
|
|
20
21
|
private evaluateBinaryExpression;
|
|
21
22
|
private evaluateUnaryExpression;
|
|
22
23
|
private evaluateTernaryExpression;
|
|
@@ -34,6 +35,13 @@ export declare class Interpreter {
|
|
|
34
35
|
private evaluateThrowStatement;
|
|
35
36
|
private evaluateWhileStatement;
|
|
36
37
|
private evaluateForStatement;
|
|
38
|
+
private evaluateForOfStatement;
|
|
39
|
+
private evaluateForInStatement;
|
|
40
|
+
private evaluateClassDeclaration;
|
|
41
|
+
private evaluateNewExpression;
|
|
42
|
+
private findClass;
|
|
43
|
+
private instantiateClass;
|
|
44
|
+
private evaluateFunctionExpression;
|
|
37
45
|
/**
|
|
38
46
|
* Avalia import statement
|
|
39
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../src/interpreter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,OAAO,
|
|
1
|
+
{"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../src/interpreter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,OAAO,EA2BR,MAAM,OAAO,CAAC;AAyCf,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAc;;IAc/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2GtB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAMxC,OAAO,CAAC,iBAAiB;IA+DzB,OAAO,CAAC,2BAA2B;IAyBnC,OAAO,CAAC,2BAA2B;IAgBnC,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,uBAAuB;IA+C/B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,kBAAkB;IA4E1B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,wBAAwB;IA4ChC,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,sBAAsB;IAoD9B,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,sBAAsB;IAqB9B,OAAO,CAAC,oBAAoB;IA6C5B,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,CAAC,sBAAsB;IA+C9B,OAAO,CAAC,wBAAwB;IA4ChC,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,gBAAgB;IAsExB,OAAO,CAAC,0BAA0B;IAelC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6H/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,eAAe;CA+BxB"}
|
package/dist/interpreter.js
CHANGED
|
@@ -44,6 +44,8 @@ class Interpreter {
|
|
|
44
44
|
this.globalEnv = {
|
|
45
45
|
variables: new Map(),
|
|
46
46
|
functions: new Map(),
|
|
47
|
+
classes: new Map(),
|
|
48
|
+
constants: new Set(),
|
|
47
49
|
};
|
|
48
50
|
// Registrar módulos nativos
|
|
49
51
|
this.registerNativeModules();
|
|
@@ -168,6 +170,12 @@ class Interpreter {
|
|
|
168
170
|
return this.evaluateWhileStatement(statement, env);
|
|
169
171
|
case 'ForStatement':
|
|
170
172
|
return this.evaluateForStatement(statement, env);
|
|
173
|
+
case 'ForOfStatement':
|
|
174
|
+
return this.evaluateForOfStatement(statement, env);
|
|
175
|
+
case 'ForInStatement':
|
|
176
|
+
return this.evaluateForInStatement(statement, env);
|
|
177
|
+
case 'ClassDeclaration':
|
|
178
|
+
return this.evaluateClassDeclaration(statement, env);
|
|
171
179
|
case 'ReturnStatement':
|
|
172
180
|
return this.evaluateReturnStatement(statement, env);
|
|
173
181
|
case 'PrintStatement':
|
|
@@ -202,9 +210,14 @@ class Interpreter {
|
|
|
202
210
|
if (decl.value) {
|
|
203
211
|
value = this.evaluateExpression(decl.value, env);
|
|
204
212
|
}
|
|
205
|
-
|
|
213
|
+
// Verificar se está tentando reatribuir uma constante
|
|
214
|
+
if (env.constants.has(name)) {
|
|
206
215
|
throw new Error(`Variável constante '${name}' não pode ser reatribuída`);
|
|
207
216
|
}
|
|
217
|
+
// Marcar constantes
|
|
218
|
+
if (decl.kind === 'const') {
|
|
219
|
+
env.constants.add(name);
|
|
220
|
+
}
|
|
208
221
|
env.variables.set(name, value);
|
|
209
222
|
return null;
|
|
210
223
|
}
|
|
@@ -223,6 +236,8 @@ class Interpreter {
|
|
|
223
236
|
const newEnv = {
|
|
224
237
|
variables: new Map(),
|
|
225
238
|
functions: new Map(),
|
|
239
|
+
classes: new Map(),
|
|
240
|
+
constants: new Set(),
|
|
226
241
|
parent: env,
|
|
227
242
|
};
|
|
228
243
|
for (const statement of block.body) {
|
|
@@ -312,6 +327,10 @@ class Interpreter {
|
|
|
312
327
|
return this.evaluateTernaryExpression(expr, env);
|
|
313
328
|
case 'CallExpression':
|
|
314
329
|
return this.evaluateCallExpression(expr, env);
|
|
330
|
+
case 'NewExpression':
|
|
331
|
+
return this.evaluateNewExpression(expr, env);
|
|
332
|
+
case 'FunctionExpression':
|
|
333
|
+
return this.evaluateFunctionExpression(expr, env);
|
|
315
334
|
case 'Identifier':
|
|
316
335
|
return this.evaluateIdentifier(expr, env);
|
|
317
336
|
case 'Literal':
|
|
@@ -329,10 +348,45 @@ class Interpreter {
|
|
|
329
348
|
}
|
|
330
349
|
}
|
|
331
350
|
evaluateAssignment(expr, env) {
|
|
332
|
-
|
|
351
|
+
// Para operadores compostos, calcular o valor primeiro
|
|
352
|
+
let value;
|
|
353
|
+
if (expr.operator !== '=') {
|
|
354
|
+
// Para +=, -=, *=, /=, %=, precisamos do valor atual
|
|
355
|
+
if (expr.left.type === 'Identifier') {
|
|
356
|
+
const name = expr.left.name;
|
|
357
|
+
const currentValue = this.findEnvironment(name, env)?.variables.get(name) || env.variables.get(name);
|
|
358
|
+
if (currentValue === undefined) {
|
|
359
|
+
throw new Error(`Variável '${name}' não definida`);
|
|
360
|
+
}
|
|
361
|
+
// Verificar se é constante
|
|
362
|
+
const targetEnv = this.findEnvironment(name, env) || env;
|
|
363
|
+
if (targetEnv.constants.has(name)) {
|
|
364
|
+
throw new Error(`Não é possível modificar constante '${name}'`);
|
|
365
|
+
}
|
|
366
|
+
// Calcular novo valor baseado no operador
|
|
367
|
+
const rightValue = this.evaluateExpression(expr.right, env);
|
|
368
|
+
const binaryOp = expr.operator.slice(0, -1);
|
|
369
|
+
value = this.evaluateBinaryOperation(binaryOp, currentValue, rightValue);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
// Para arrays, calcular normalmente
|
|
373
|
+
const currentValue = this.evaluateExpression(expr.left, env);
|
|
374
|
+
const rightValue = this.evaluateExpression(expr.right, env);
|
|
375
|
+
const binaryOp = expr.operator.slice(0, -1);
|
|
376
|
+
value = this.evaluateBinaryOperation(binaryOp, currentValue, rightValue);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
value = this.evaluateExpression(expr.right, env);
|
|
381
|
+
}
|
|
333
382
|
if (expr.left.type === 'Identifier') {
|
|
334
383
|
const name = expr.left.name;
|
|
335
384
|
const targetEnv = this.findEnvironment(name, env);
|
|
385
|
+
// Verificar se é constante
|
|
386
|
+
const checkEnv = targetEnv || env;
|
|
387
|
+
if (checkEnv.constants.has(name)) {
|
|
388
|
+
throw new Error(`Não é possível reatribuir constante '${name}'`);
|
|
389
|
+
}
|
|
336
390
|
if (targetEnv) {
|
|
337
391
|
targetEnv.variables.set(name, value);
|
|
338
392
|
}
|
|
@@ -361,6 +415,25 @@ class Interpreter {
|
|
|
361
415
|
}
|
|
362
416
|
return value;
|
|
363
417
|
}
|
|
418
|
+
evaluateBinaryOperation(operator, left, right) {
|
|
419
|
+
switch (operator) {
|
|
420
|
+
case '+':
|
|
421
|
+
if (typeof left === 'string' || typeof right === 'string') {
|
|
422
|
+
return String(left) + String(right);
|
|
423
|
+
}
|
|
424
|
+
return left + right;
|
|
425
|
+
case '-':
|
|
426
|
+
return left - right;
|
|
427
|
+
case '*':
|
|
428
|
+
return left * right;
|
|
429
|
+
case '/':
|
|
430
|
+
return left / right;
|
|
431
|
+
case '%':
|
|
432
|
+
return left % right;
|
|
433
|
+
default:
|
|
434
|
+
throw new Error(`Operador binário não suportado: ${operator}`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
364
437
|
evaluateBinaryExpression(expr, env) {
|
|
365
438
|
const left = this.evaluateExpression(expr.left, env);
|
|
366
439
|
const right = this.evaluateExpression(expr.right, env);
|
|
@@ -378,6 +451,8 @@ class Interpreter {
|
|
|
378
451
|
return left / right;
|
|
379
452
|
case '%':
|
|
380
453
|
return left % right;
|
|
454
|
+
case '**':
|
|
455
|
+
return Math.pow(left, right);
|
|
381
456
|
case '==':
|
|
382
457
|
return left === right;
|
|
383
458
|
case '!=':
|
|
@@ -442,6 +517,8 @@ class Interpreter {
|
|
|
442
517
|
const newEnv = {
|
|
443
518
|
variables: new Map(),
|
|
444
519
|
functions: new Map(),
|
|
520
|
+
classes: new Map(),
|
|
521
|
+
constants: new Set(),
|
|
445
522
|
parent: func.closure,
|
|
446
523
|
};
|
|
447
524
|
for (let i = 0; i < func.params.length; i++) {
|
|
@@ -569,6 +646,8 @@ class Interpreter {
|
|
|
569
646
|
const newEnv = {
|
|
570
647
|
variables: new Map(),
|
|
571
648
|
functions: new Map(),
|
|
649
|
+
classes: new Map(),
|
|
650
|
+
constants: new Set(),
|
|
572
651
|
parent: env,
|
|
573
652
|
};
|
|
574
653
|
if (stmt.handler.param) {
|
|
@@ -609,6 +688,8 @@ class Interpreter {
|
|
|
609
688
|
const newEnv = {
|
|
610
689
|
variables: new Map(),
|
|
611
690
|
functions: new Map(),
|
|
691
|
+
classes: new Map(),
|
|
692
|
+
constants: new Set(),
|
|
612
693
|
parent: env,
|
|
613
694
|
};
|
|
614
695
|
if (stmt.init) {
|
|
@@ -638,6 +719,200 @@ class Interpreter {
|
|
|
638
719
|
}
|
|
639
720
|
return null;
|
|
640
721
|
}
|
|
722
|
+
evaluateForOfStatement(stmt, env) {
|
|
723
|
+
const iterable = this.evaluateExpression(stmt.right, env);
|
|
724
|
+
if (!Array.isArray(iterable)) {
|
|
725
|
+
throw new Error('For...of só funciona com arrays');
|
|
726
|
+
}
|
|
727
|
+
const newEnv = {
|
|
728
|
+
variables: new Map(),
|
|
729
|
+
functions: new Map(),
|
|
730
|
+
classes: new Map(),
|
|
731
|
+
constants: new Set(),
|
|
732
|
+
parent: env,
|
|
733
|
+
};
|
|
734
|
+
for (const item of iterable) {
|
|
735
|
+
if (stmt.left.type === 'VariableDeclaration') {
|
|
736
|
+
const decl = stmt.left;
|
|
737
|
+
newEnv.variables.set(decl.name, item);
|
|
738
|
+
if (decl.kind === 'const') {
|
|
739
|
+
newEnv.constants.add(decl.name);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
newEnv.variables.set(stmt.left.name, item);
|
|
744
|
+
}
|
|
745
|
+
const result = this.evaluateBlockStatement(stmt.body, newEnv);
|
|
746
|
+
if (result !== null) {
|
|
747
|
+
if (this.isReturnValue(result)) {
|
|
748
|
+
return result;
|
|
749
|
+
}
|
|
750
|
+
if (result.type === 'break') {
|
|
751
|
+
break;
|
|
752
|
+
}
|
|
753
|
+
if (result.type === 'continue') {
|
|
754
|
+
continue;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
return null;
|
|
759
|
+
}
|
|
760
|
+
evaluateForInStatement(stmt, env) {
|
|
761
|
+
const object = this.evaluateExpression(stmt.right, env);
|
|
762
|
+
if (typeof object !== 'object' || object === null || Array.isArray(object)) {
|
|
763
|
+
throw new Error('For...in só funciona com objetos');
|
|
764
|
+
}
|
|
765
|
+
const newEnv = {
|
|
766
|
+
variables: new Map(),
|
|
767
|
+
functions: new Map(),
|
|
768
|
+
classes: new Map(),
|
|
769
|
+
constants: new Set(),
|
|
770
|
+
parent: env,
|
|
771
|
+
};
|
|
772
|
+
const obj = object;
|
|
773
|
+
for (const key in obj) {
|
|
774
|
+
if (stmt.left.type === 'VariableDeclaration') {
|
|
775
|
+
const decl = stmt.left;
|
|
776
|
+
newEnv.variables.set(decl.name, key);
|
|
777
|
+
if (decl.kind === 'const') {
|
|
778
|
+
newEnv.constants.add(decl.name);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
else {
|
|
782
|
+
newEnv.variables.set(stmt.left.name, key);
|
|
783
|
+
}
|
|
784
|
+
const result = this.evaluateBlockStatement(stmt.body, newEnv);
|
|
785
|
+
if (result !== null) {
|
|
786
|
+
if (this.isReturnValue(result)) {
|
|
787
|
+
return result;
|
|
788
|
+
}
|
|
789
|
+
if (result.type === 'break') {
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
if (result.type === 'continue') {
|
|
793
|
+
continue;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
return null;
|
|
798
|
+
}
|
|
799
|
+
evaluateClassDeclaration(stmt, env) {
|
|
800
|
+
const methods = new Map();
|
|
801
|
+
let constructor;
|
|
802
|
+
// Avaliar métodos da classe
|
|
803
|
+
for (const method of stmt.body.body) {
|
|
804
|
+
const funcValue = {
|
|
805
|
+
type: 'function',
|
|
806
|
+
name: method.key,
|
|
807
|
+
params: method.params,
|
|
808
|
+
body: method.body,
|
|
809
|
+
closure: env,
|
|
810
|
+
};
|
|
811
|
+
if (method.kind === 'constructor') {
|
|
812
|
+
constructor = funcValue;
|
|
813
|
+
}
|
|
814
|
+
else {
|
|
815
|
+
methods.set(method.key, funcValue);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
const classValue = {
|
|
819
|
+
type: 'class',
|
|
820
|
+
name: stmt.name,
|
|
821
|
+
methods,
|
|
822
|
+
constructor,
|
|
823
|
+
};
|
|
824
|
+
// Se tem superclasse, resolver
|
|
825
|
+
if (stmt.superClass) {
|
|
826
|
+
const superClass = env.classes.get(stmt.superClass.name);
|
|
827
|
+
if (!superClass) {
|
|
828
|
+
throw new Error(`Classe pai '${stmt.superClass.name}' não encontrada`);
|
|
829
|
+
}
|
|
830
|
+
classValue.superClass = superClass;
|
|
831
|
+
}
|
|
832
|
+
env.classes.set(stmt.name, classValue);
|
|
833
|
+
return null;
|
|
834
|
+
}
|
|
835
|
+
evaluateNewExpression(expr, env) {
|
|
836
|
+
const calleeName = expr.callee.name;
|
|
837
|
+
const classValue = this.findClass(calleeName, env);
|
|
838
|
+
if (!classValue) {
|
|
839
|
+
throw new Error(`Classe '${calleeName}' não encontrada`);
|
|
840
|
+
}
|
|
841
|
+
return this.instantiateClass(classValue, expr.arguments, env);
|
|
842
|
+
}
|
|
843
|
+
findClass(name, env) {
|
|
844
|
+
if (env.classes.has(name)) {
|
|
845
|
+
return env.classes.get(name);
|
|
846
|
+
}
|
|
847
|
+
if (env.parent) {
|
|
848
|
+
return this.findClass(name, env.parent);
|
|
849
|
+
}
|
|
850
|
+
return null;
|
|
851
|
+
}
|
|
852
|
+
instantiateClass(classValue, args, env) {
|
|
853
|
+
const instance = {};
|
|
854
|
+
// Se tem superclasse, criar instância pai
|
|
855
|
+
if (classValue.superClass) {
|
|
856
|
+
instance.__proto__ = this.instantiateClass(classValue.superClass, [], env);
|
|
857
|
+
}
|
|
858
|
+
// Executar construtor se existir
|
|
859
|
+
if (classValue.constructor) {
|
|
860
|
+
const constructorEnv = {
|
|
861
|
+
variables: new Map(),
|
|
862
|
+
functions: new Map(),
|
|
863
|
+
classes: new Map(),
|
|
864
|
+
constants: new Set(),
|
|
865
|
+
parent: env,
|
|
866
|
+
};
|
|
867
|
+
// Adicionar 'это' (this) ao ambiente
|
|
868
|
+
constructorEnv.variables.set('это', instance);
|
|
869
|
+
constructorEnv.variables.set('this', instance);
|
|
870
|
+
// Mapear argumentos
|
|
871
|
+
for (let i = 0; i < classValue.constructor.params.length; i++) {
|
|
872
|
+
const paramName = classValue.constructor.params[i];
|
|
873
|
+
const argValue = i < args.length
|
|
874
|
+
? this.evaluateExpression(args[i], env)
|
|
875
|
+
: null;
|
|
876
|
+
constructorEnv.variables.set(paramName, argValue);
|
|
877
|
+
}
|
|
878
|
+
// Executar construtor
|
|
879
|
+
this.evaluateBlockStatement(classValue.constructor.body, constructorEnv);
|
|
880
|
+
}
|
|
881
|
+
// Adicionar métodos ao objeto
|
|
882
|
+
for (const [methodName, method] of classValue.methods) {
|
|
883
|
+
const methodFunc = (...methodArgs) => {
|
|
884
|
+
const methodEnv = {
|
|
885
|
+
variables: new Map(),
|
|
886
|
+
functions: new Map(),
|
|
887
|
+
classes: new Map(),
|
|
888
|
+
constants: new Set(),
|
|
889
|
+
parent: env,
|
|
890
|
+
};
|
|
891
|
+
methodEnv.variables.set('это', instance);
|
|
892
|
+
methodEnv.variables.set('this', instance);
|
|
893
|
+
for (let i = 0; i < method.params.length; i++) {
|
|
894
|
+
methodEnv.variables.set(method.params[i], methodArgs[i] || null);
|
|
895
|
+
}
|
|
896
|
+
const result = this.evaluateBlockStatement(method.body, methodEnv);
|
|
897
|
+
if (result !== null && this.isReturnValue(result)) {
|
|
898
|
+
return result.value;
|
|
899
|
+
}
|
|
900
|
+
return null;
|
|
901
|
+
};
|
|
902
|
+
instance[methodName] = methodFunc;
|
|
903
|
+
}
|
|
904
|
+
return instance;
|
|
905
|
+
}
|
|
906
|
+
evaluateFunctionExpression(expr, env) {
|
|
907
|
+
const funcValue = {
|
|
908
|
+
type: 'function',
|
|
909
|
+
name: expr.name || '<anonymous>',
|
|
910
|
+
params: expr.params,
|
|
911
|
+
body: expr.body,
|
|
912
|
+
closure: env,
|
|
913
|
+
};
|
|
914
|
+
return funcValue;
|
|
915
|
+
}
|
|
641
916
|
/**
|
|
642
917
|
* Avalia import statement
|
|
643
918
|
*/
|
|
@@ -794,6 +1069,8 @@ class Interpreter {
|
|
|
794
1069
|
const moduleEnv = {
|
|
795
1070
|
variables: new Map(),
|
|
796
1071
|
functions: new Map(),
|
|
1072
|
+
classes: new Map(),
|
|
1073
|
+
constants: new Set(),
|
|
797
1074
|
};
|
|
798
1075
|
// Evaluate module statements
|
|
799
1076
|
for (const statement of ast.body) {
|