@yakuzaa/jade-compiler 0.1.2 → 0.1.3
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/dist/cli.js +201 -23
- package/dist/cli.js.map +1 -1
- package/dist/codegen/ir_generator.d.ts +13 -0
- package/dist/codegen/ir_generator.d.ts.map +1 -1
- package/dist/codegen/ir_generator.js +167 -6
- package/dist/codegen/ir_generator.js.map +1 -1
- package/dist/codegen/ir_nodes.d.ts +19 -0
- package/dist/codegen/ir_nodes.d.ts.map +1 -1
- package/dist/codegen/wasm_generator.d.ts.map +1 -1
- package/dist/codegen/wasm_generator.js +0 -1
- package/dist/codegen/wasm_generator.js.map +1 -1
- package/dist/formatter/formatter.d.ts +48 -0
- package/dist/formatter/formatter.d.ts.map +1 -0
- package/dist/formatter/formatter.js +280 -0
- package/dist/formatter/formatter.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/lexer/lexer.d.ts.map +1 -1
- package/dist/lexer/lexer.js +15 -7
- package/dist/lexer/lexer.js.map +1 -1
- package/dist/lexer/token_type.d.ts +3 -1
- package/dist/lexer/token_type.d.ts.map +1 -1
- package/dist/lexer/token_type.js +2 -0
- package/dist/lexer/token_type.js.map +1 -1
- package/dist/linter/linter.d.ts +46 -0
- package/dist/linter/linter.d.ts.map +1 -0
- package/dist/linter/linter.js +166 -0
- package/dist/linter/linter.js.map +1 -0
- package/dist/parser/parse_result.d.ts +2 -0
- package/dist/parser/parse_result.d.ts.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +117 -21
- package/dist/parser/parser.js.map +1 -1
- package/dist/semantic/symbol_table.d.ts +1 -0
- package/dist/semantic/symbol_table.d.ts.map +1 -1
- package/dist/semantic/symbol_table.js +11 -0
- package/dist/semantic/symbol_table.js.map +1 -1
- package/dist/semantic/type_checker.d.ts +7 -0
- package/dist/semantic/type_checker.d.ts.map +1 -1
- package/dist/semantic/type_checker.js +187 -72
- package/dist/semantic/type_checker.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
* jadec --version → exibe versão
|
|
11
11
|
* jadec --help → exibe ajuda
|
|
12
12
|
*/
|
|
13
|
-
import { writeFileSync } from 'fs';
|
|
13
|
+
import { readFileSync, writeFileSync } from 'fs';
|
|
14
14
|
import { resolve, basename, dirname, join } from 'path';
|
|
15
15
|
import { compileFile } from './index.js';
|
|
16
|
-
|
|
16
|
+
import { Lexer } from './lexer/lexer.js';
|
|
17
|
+
import { Parser } from './parser/parser.js';
|
|
18
|
+
import { Formatter } from './formatter/formatter.js';
|
|
19
|
+
import { Linter } from './linter/linter.js';
|
|
20
|
+
const VERSION = '0.1.2';
|
|
17
21
|
const HELP = `
|
|
18
22
|
jadec ${VERSION} — Compilador JADE
|
|
19
23
|
|
|
@@ -24,6 +28,10 @@ Opções:
|
|
|
24
28
|
-o <prefixo> Define prefixo dos arquivos de saída (padrão: mesmo nome do fonte)
|
|
25
29
|
--wat-only Gera apenas WAT (WebAssembly Text Format), sem binário .wasm
|
|
26
30
|
--check Verifica erros sem gerar arquivos de saída
|
|
31
|
+
--format Formata o arquivo .jd e exibe na saída (não compila)
|
|
32
|
+
--format-write Formata e sobrescreve o arquivo .jd
|
|
33
|
+
--lint Analisa o arquivo e reporta avisos de qualidade
|
|
34
|
+
--no-color Desativa cores na saída
|
|
27
35
|
--version Exibe a versão do compilador
|
|
28
36
|
--help Exibe esta ajuda
|
|
29
37
|
|
|
@@ -31,7 +39,64 @@ Exemplos:
|
|
|
31
39
|
jadec estoque.jd
|
|
32
40
|
jadec estoque.jd -o dist/estoque
|
|
33
41
|
jadec estoque.jd --check
|
|
42
|
+
jadec estoque.jd --format
|
|
43
|
+
jadec estoque.jd --format-write
|
|
34
44
|
`;
|
|
45
|
+
// ── Cores ANSI ────────────────────────────────────────────────────────────────
|
|
46
|
+
const useColor = process.stderr.isTTY && !process.env.NO_COLOR && !process.argv.includes('--no-color');
|
|
47
|
+
const c = {
|
|
48
|
+
bold: (s) => useColor ? `\x1b[1m${s}\x1b[0m` : s,
|
|
49
|
+
red: (s) => useColor ? `\x1b[1;31m${s}\x1b[0m` : s,
|
|
50
|
+
yellow: (s) => useColor ? `\x1b[1;33m${s}\x1b[0m` : s,
|
|
51
|
+
blue: (s) => useColor ? `\x1b[34m${s}\x1b[0m` : s,
|
|
52
|
+
cyan: (s) => useColor ? `\x1b[36m${s}\x1b[0m` : s,
|
|
53
|
+
dim: (s) => useColor ? `\x1b[2m${s}\x1b[0m` : s,
|
|
54
|
+
green: (s) => useColor ? `\x1b[1;32m${s}\x1b[0m` : s,
|
|
55
|
+
};
|
|
56
|
+
const e = (s) => process.stderr.write(s + '\n');
|
|
57
|
+
// ── Renderização de erro estilo Rust ──────────────────────────────────────────
|
|
58
|
+
function renderError(err, sourceLines, inputFile) {
|
|
59
|
+
const fase = err.phase === 'parse' ? 'sintaxe'
|
|
60
|
+
: err.phase === 'semantic' ? 'semântica'
|
|
61
|
+
: 'codegen';
|
|
62
|
+
// Cabeçalho: erro[sintaxe]: mensagem
|
|
63
|
+
e(c.red(`erro[${fase}]`) + c.bold(`: ${err.message}`));
|
|
64
|
+
if (err.line > 0) {
|
|
65
|
+
const lineIdx = err.line - 1;
|
|
66
|
+
const col = Math.max(0, (err.column ?? 1) - 1);
|
|
67
|
+
const lineNumStr = String(err.line);
|
|
68
|
+
const pad = lineNumStr.length;
|
|
69
|
+
const bar = c.blue('|');
|
|
70
|
+
const linePrefix = c.blue(lineNumStr.padStart(pad) + ' |');
|
|
71
|
+
const emptyPrefix = c.blue(' '.repeat(pad) + ' |');
|
|
72
|
+
// --> arquivo:linha:coluna
|
|
73
|
+
e(c.blue(`${''.padStart(pad)} --> `) + `${inputFile}:${err.line}:${err.column}`);
|
|
74
|
+
e(emptyPrefix);
|
|
75
|
+
if (lineIdx >= 0 && lineIdx < sourceLines.length) {
|
|
76
|
+
const sourceLine = sourceLines[lineIdx];
|
|
77
|
+
// Determina comprimento do token sublinhado: até o próximo espaço/paren/EOF
|
|
78
|
+
const rest = sourceLine.slice(col);
|
|
79
|
+
const tokenLen = Math.max(1, rest.match(/^[\w\u00C0-\u024F"']+/)?.[0].length ?? 1);
|
|
80
|
+
const underline = c.red('^'.repeat(tokenLen));
|
|
81
|
+
const spaces = ' '.repeat(col);
|
|
82
|
+
// Linha de código
|
|
83
|
+
e(`${linePrefix} ${sourceLine}`);
|
|
84
|
+
// Seta apontando para o token
|
|
85
|
+
e(`${emptyPrefix} ${spaces}${underline}`);
|
|
86
|
+
}
|
|
87
|
+
e(emptyPrefix);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Sem posição — só referência ao arquivo
|
|
91
|
+
e(c.blue(` --> `) + inputFile);
|
|
92
|
+
}
|
|
93
|
+
// Dica
|
|
94
|
+
if (err.hint) {
|
|
95
|
+
e(c.blue(' = ') + c.yellow('dica') + `: ${err.hint}`);
|
|
96
|
+
}
|
|
97
|
+
e('');
|
|
98
|
+
}
|
|
99
|
+
// ── Main ──────────────────────────────────────────────────────────────────────
|
|
35
100
|
async function main() {
|
|
36
101
|
const args = process.argv.slice(2);
|
|
37
102
|
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
@@ -45,55 +110,168 @@ async function main() {
|
|
|
45
110
|
// Encontrar arquivo de entrada (primeiro arg que não é flag)
|
|
46
111
|
const inputFile = args.find(a => !a.startsWith('-'));
|
|
47
112
|
if (!inputFile) {
|
|
48
|
-
|
|
49
|
-
|
|
113
|
+
e(c.red('erro') + ': nenhum arquivo de entrada especificado.');
|
|
114
|
+
e(c.dim('dica: jadec --help para ver as opções disponíveis.'));
|
|
50
115
|
process.exit(1);
|
|
51
116
|
}
|
|
52
117
|
const watOnly = args.includes('--wat-only');
|
|
53
118
|
const checkOnly = args.includes('--check');
|
|
54
|
-
|
|
119
|
+
const formatPrint = args.includes('--format');
|
|
120
|
+
const formatWrite = args.includes('--format-write');
|
|
121
|
+
const lintOnly = args.includes('--lint');
|
|
122
|
+
// ── Modo format ──────────────────────────────────────────────────────────
|
|
123
|
+
if (formatPrint || formatWrite) {
|
|
124
|
+
let source;
|
|
125
|
+
try {
|
|
126
|
+
source = readFileSync(resolve(inputFile), 'utf-8');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
e(c.red('erro') + `: não foi possível ler '${inputFile}'.`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const tokens = new Lexer(source).tokenize();
|
|
133
|
+
const parseResult = new Parser(tokens).parse();
|
|
134
|
+
if (!parseResult.success || !parseResult.program) {
|
|
135
|
+
e('');
|
|
136
|
+
for (const err of parseResult.errors) {
|
|
137
|
+
renderError({ phase: 'parse', message: err.message, hint: err.dica, line: err.line, column: err.column }, source.split('\n'), inputFile);
|
|
138
|
+
}
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const formatted = new Formatter().format(parseResult.program);
|
|
142
|
+
if (formatWrite) {
|
|
143
|
+
writeFileSync(resolve(inputFile), formatted, 'utf-8');
|
|
144
|
+
console.log(c.green('ok') + ` — ${inputFile} formatado.`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
process.stdout.write(formatted);
|
|
148
|
+
}
|
|
149
|
+
process.exit(0);
|
|
150
|
+
}
|
|
151
|
+
// ── Modo lint ────────────────────────────────────────────────────────────
|
|
152
|
+
if (lintOnly) {
|
|
153
|
+
let source;
|
|
154
|
+
try {
|
|
155
|
+
source = readFileSync(resolve(inputFile), 'utf-8');
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
e(c.red('erro') + `: não foi possível ler '${inputFile}'.`);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
const tokens = new Lexer(source).tokenize();
|
|
162
|
+
const parseResult = new Parser(tokens).parse();
|
|
163
|
+
if (!parseResult.success || !parseResult.program) {
|
|
164
|
+
e('');
|
|
165
|
+
for (const err of parseResult.errors) {
|
|
166
|
+
renderError({ phase: 'parse', message: err.message, hint: err.dica, line: err.line, column: err.column }, source.split('\n'), inputFile);
|
|
167
|
+
}
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
const avisos = new Linter().lint(parseResult.program);
|
|
171
|
+
if (avisos.length === 0) {
|
|
172
|
+
console.log(c.green('ok') + ` — nenhum aviso encontrado em ${inputFile}.`);
|
|
173
|
+
process.exit(0);
|
|
174
|
+
}
|
|
175
|
+
const sourceLines = source.split('\n');
|
|
176
|
+
for (const aviso of avisos) {
|
|
177
|
+
const icon = aviso.severity === 'error' ? c.red('erro') : c.yellow('aviso');
|
|
178
|
+
e(`${icon}[${aviso.code}]` + c.bold(`: ${aviso.message}`));
|
|
179
|
+
if (aviso.line > 0) {
|
|
180
|
+
const lineIdx = aviso.line - 1;
|
|
181
|
+
const pad = String(aviso.line).length;
|
|
182
|
+
const bar = c.blue('|');
|
|
183
|
+
e(c.blue(`${''.padStart(pad)} --> `) + `${inputFile}:${aviso.line}:${aviso.column}`);
|
|
184
|
+
e(c.blue(' '.repeat(pad) + ' |'));
|
|
185
|
+
if (lineIdx < sourceLines.length) {
|
|
186
|
+
e(c.blue(String(aviso.line).padStart(pad) + ' |') + ` ${sourceLines[lineIdx]}`);
|
|
187
|
+
e(c.blue(' '.repeat(pad) + ' |'));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
e('');
|
|
191
|
+
}
|
|
192
|
+
const erros = avisos.filter(a => a.severity === 'error').length;
|
|
193
|
+
const warnings = avisos.filter(a => a.severity === 'warning').length;
|
|
194
|
+
const resumo = [
|
|
195
|
+
warnings > 0 ? c.yellow(`${warnings} aviso${warnings > 1 ? 's' : ''}`) : '',
|
|
196
|
+
erros > 0 ? c.red(`${erros} erro${erros > 1 ? 's' : ''}`) : ''
|
|
197
|
+
].filter(Boolean).join(', ');
|
|
198
|
+
e(resumo);
|
|
199
|
+
process.exit(erros > 0 ? 1 : 0);
|
|
200
|
+
}
|
|
201
|
+
// Prefixo de saída — com proteção contra path traversal
|
|
55
202
|
const oIdx = args.indexOf('-o');
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
203
|
+
let outputPrefix;
|
|
204
|
+
if (oIdx !== -1 && args[oIdx + 1]) {
|
|
205
|
+
const raw = args[oIdx + 1];
|
|
206
|
+
const resolved = resolve(raw);
|
|
207
|
+
// Bloquear escrita em diretórios críticos do sistema
|
|
208
|
+
const sensivel = ['/etc', '/usr', '/bin', '/sbin', '/root', '/sys', '/proc', '/boot'];
|
|
209
|
+
if (sensivel.some(d => resolved === d || resolved.startsWith(d + '/'))) {
|
|
210
|
+
e(c.red('erro') + `: caminho de saída '${raw}' aponta para diretório do sistema`);
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
outputPrefix = resolved;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
outputPrefix = join(dirname(resolve(inputFile)), basename(inputFile, '.jd'));
|
|
217
|
+
}
|
|
218
|
+
// Lê o fonte para exibir trechos nos erros
|
|
219
|
+
let sourceLines = [];
|
|
220
|
+
try {
|
|
221
|
+
sourceLines = readFileSync(resolve(inputFile), 'utf-8').split('\n');
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Se não conseguir ler, erros serão exibidos sem snippet
|
|
225
|
+
}
|
|
226
|
+
process.stderr.write(c.dim(`jadec ${VERSION} — compilando ${inputFile}...\n\n`));
|
|
60
227
|
const result = await compileFile(resolve(inputFile), basename(inputFile, '.jd'));
|
|
61
228
|
if (!result.success) {
|
|
62
|
-
|
|
229
|
+
e('');
|
|
63
230
|
for (const err of result.errors) {
|
|
64
|
-
|
|
65
|
-
: err.phase === 'semantic' ? 'Semântica'
|
|
66
|
-
: 'CodeGen';
|
|
67
|
-
const pos = err.line > 0 ? ` [linha ${err.line}, col ${err.column}]` : '';
|
|
68
|
-
console.error(` [${fase}]${pos} ${err.message}`);
|
|
231
|
+
renderError(err, sourceLines, inputFile);
|
|
69
232
|
}
|
|
70
|
-
|
|
233
|
+
const n = result.errors.length;
|
|
234
|
+
e(c.red(`${n} erro${n > 1 ? 's' : ''} encontrado${n > 1 ? 's' : ''}`) + c.bold('. Compilação interrompida.'));
|
|
71
235
|
process.exit(1);
|
|
72
236
|
}
|
|
73
237
|
if (checkOnly) {
|
|
74
|
-
console.log('
|
|
238
|
+
console.log(c.green('ok') + ' — nenhum erro encontrado.');
|
|
75
239
|
process.exit(0);
|
|
76
240
|
}
|
|
241
|
+
// Escrever descritores de tela (UI declarativa)
|
|
242
|
+
if (result.telas && result.telas.length > 0) {
|
|
243
|
+
const uiPath = `${outputPrefix}.jade-ui.json`;
|
|
244
|
+
writeFileSync(uiPath, JSON.stringify(result.telas, null, 2), 'utf-8');
|
|
245
|
+
console.log(` ${c.cyan('UI')} → ${uiPath} ${c.dim(`(${result.telas.length} tela${result.telas.length > 1 ? 's' : ''})`)}`);
|
|
246
|
+
}
|
|
77
247
|
// Escrever WAT
|
|
78
248
|
if (result.wat) {
|
|
79
249
|
const watPath = `${outputPrefix}.wat`;
|
|
80
250
|
writeFileSync(watPath, result.wat, 'utf-8');
|
|
81
|
-
console.log(` WAT → ${watPath}`);
|
|
251
|
+
console.log(` ${c.cyan('WAT')} → ${watPath}`);
|
|
82
252
|
}
|
|
83
253
|
// Escrever WASM
|
|
84
254
|
if (!watOnly && result.wasm) {
|
|
85
255
|
const wasmPath = `${outputPrefix}.wasm`;
|
|
86
256
|
writeFileSync(wasmPath, result.wasm);
|
|
87
|
-
console.log(` WASM → ${wasmPath} (${result.wasm.byteLength} bytes)`);
|
|
257
|
+
console.log(` ${c.cyan('WASM')} → ${wasmPath} ${c.dim(`(${result.wasm.byteLength} bytes)`)}`);
|
|
88
258
|
}
|
|
89
259
|
else if (!watOnly && !result.wasm) {
|
|
90
|
-
|
|
91
|
-
|
|
260
|
+
if (result.errors.length > 0) {
|
|
261
|
+
for (const err of result.errors) {
|
|
262
|
+
e(c.red('erro') + `: ${err}`);
|
|
263
|
+
}
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
e(c.yellow('aviso') + ': binário WASM não gerado (wabt não disponível).');
|
|
268
|
+
e(c.dim(' instale com: npm install wabt'));
|
|
269
|
+
}
|
|
92
270
|
}
|
|
93
|
-
console.log('\
|
|
271
|
+
console.log('\n' + c.green('compilação concluída com sucesso.'));
|
|
94
272
|
}
|
|
95
273
|
main().catch(err => {
|
|
96
|
-
|
|
274
|
+
e(c.red('erro interno do compilador') + `: ${err?.message ?? err}`);
|
|
97
275
|
process.exit(2);
|
|
98
276
|
});
|
|
99
277
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,18 @@ export declare class IRGenerator {
|
|
|
6
6
|
private currentBlock;
|
|
7
7
|
private tempCounter;
|
|
8
8
|
private blockCounter;
|
|
9
|
+
/** Mapeia nome de variável local → nome do tipo JADE (entidade/classe) para resolução de campos */
|
|
10
|
+
private localEntityTypeMap;
|
|
9
11
|
constructor(moduleName: string);
|
|
10
12
|
generate(program: N.ProgramaNode): IR.IRModule;
|
|
13
|
+
private flattenDeclarations;
|
|
11
14
|
private generateEntidade;
|
|
15
|
+
private generateEvento;
|
|
12
16
|
private generateClasse;
|
|
13
17
|
private generateFuncao;
|
|
18
|
+
private generateOuvinte;
|
|
19
|
+
private generateRegra;
|
|
20
|
+
private generateTela;
|
|
14
21
|
private generateServico;
|
|
15
22
|
private generateBloco;
|
|
16
23
|
private generateInstrucao;
|
|
@@ -29,6 +36,12 @@ export declare class IRGenerator {
|
|
|
29
36
|
private generateUnario;
|
|
30
37
|
private generateChamadaFuncao;
|
|
31
38
|
private generateAcessoMembro;
|
|
39
|
+
/**
|
|
40
|
+
* Resolve o IR type de um campo de acesso a membro.
|
|
41
|
+
* Usa localEntityTypeMap para encontrar o tipo da entidade e busca o campo
|
|
42
|
+
* nas typeDefinitions registradas.
|
|
43
|
+
*/
|
|
44
|
+
private resolveFieldType;
|
|
32
45
|
private newTemp;
|
|
33
46
|
private newBlockLabel;
|
|
34
47
|
private emit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir_generator.d.ts","sourceRoot":"","sources":["../../codegen/ir_generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;
|
|
1
|
+
{"version":3,"file":"ir_generator.d.ts","sourceRoot":"","sources":["../../codegen/ir_generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;IACjC,mGAAmG;IACnG,OAAO,CAAC,kBAAkB,CAAkC;gBAEhD,UAAU,EAAE,MAAM;IAW9B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,QAAQ;IA8B9C,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IA6CtB,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,aAAa;IAkDrB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,eAAe;IA8CvB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,YAAY;IAgHpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,oBAAoB;IAsB5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,YAAY;IAyBpB,OAAO,CAAC,WAAW;CAiBpB"}
|
|
@@ -4,38 +4,61 @@ export class IRGenerator {
|
|
|
4
4
|
currentBlock = null;
|
|
5
5
|
tempCounter = 0;
|
|
6
6
|
blockCounter = 0;
|
|
7
|
+
/** Mapeia nome de variável local → nome do tipo JADE (entidade/classe) para resolução de campos */
|
|
8
|
+
localEntityTypeMap = new Map();
|
|
7
9
|
constructor(moduleName) {
|
|
8
10
|
this.module = {
|
|
9
11
|
name: moduleName,
|
|
10
12
|
typeDefinitions: [],
|
|
11
13
|
globals: [],
|
|
12
|
-
functions: []
|
|
14
|
+
functions: [],
|
|
15
|
+
eventHandlers: [],
|
|
16
|
+
telas: []
|
|
13
17
|
};
|
|
14
18
|
}
|
|
15
19
|
generate(program) {
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
const allDecls = this.flattenDeclarations(program.declaracoes);
|
|
21
|
+
// Passo 1: registrar todos os tipos (entidades/classes/eventos)
|
|
22
|
+
for (const declaracao of allDecls) {
|
|
18
23
|
if (declaracao.kind === 'Entidade') {
|
|
19
24
|
this.generateEntidade(declaracao);
|
|
20
25
|
}
|
|
21
26
|
else if (declaracao.kind === 'Classe') {
|
|
22
27
|
this.generateClasse(declaracao);
|
|
23
28
|
}
|
|
29
|
+
else if (declaracao.kind === 'Evento') {
|
|
30
|
+
this.generateEvento(declaracao);
|
|
31
|
+
}
|
|
24
32
|
}
|
|
25
33
|
// Passo 2: gerar funções
|
|
26
|
-
for (const declaracao of
|
|
34
|
+
for (const declaracao of allDecls) {
|
|
27
35
|
if (declaracao.kind === 'Funcao') {
|
|
28
36
|
this.generateFuncao(declaracao);
|
|
29
37
|
}
|
|
30
38
|
else if (declaracao.kind === 'Servico') {
|
|
31
39
|
this.generateServico(declaracao);
|
|
32
40
|
}
|
|
41
|
+
else if (declaracao.kind === 'Regra') {
|
|
42
|
+
this.generateRegra(declaracao);
|
|
43
|
+
}
|
|
33
44
|
else if (declaracao.kind === 'Tela') {
|
|
34
|
-
|
|
45
|
+
this.generateTela(declaracao);
|
|
35
46
|
}
|
|
36
47
|
}
|
|
37
48
|
return this.module;
|
|
38
49
|
}
|
|
50
|
+
flattenDeclarations(decls) {
|
|
51
|
+
const result = [];
|
|
52
|
+
for (const decl of decls) {
|
|
53
|
+
if (decl.kind === 'Modulo') {
|
|
54
|
+
result.push(...this.flattenDeclarations(decl.declaracoes));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result.push(decl);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
39
62
|
// ── Geradores de declaração ──────────────────────────────
|
|
40
63
|
generateEntidade(node) {
|
|
41
64
|
const fields = node.campos.map(campo => ({
|
|
@@ -47,6 +70,17 @@ export class IRGenerator {
|
|
|
47
70
|
fields
|
|
48
71
|
});
|
|
49
72
|
}
|
|
73
|
+
generateEvento(node) {
|
|
74
|
+
// Eventos são tipos compostos (assim como entidades)
|
|
75
|
+
const fields = node.campos.map(campo => ({
|
|
76
|
+
name: campo.nome,
|
|
77
|
+
type: this.jadeTypeToIR(campo.tipo)
|
|
78
|
+
}));
|
|
79
|
+
this.module.typeDefinitions.push({
|
|
80
|
+
name: node.nome,
|
|
81
|
+
fields
|
|
82
|
+
});
|
|
83
|
+
}
|
|
50
84
|
generateClasse(node) {
|
|
51
85
|
const fields = node.campos.map(campo => ({
|
|
52
86
|
name: campo.nome,
|
|
@@ -71,6 +105,16 @@ export class IRGenerator {
|
|
|
71
105
|
locals: []
|
|
72
106
|
};
|
|
73
107
|
this.currentFunction = func;
|
|
108
|
+
this.localEntityTypeMap = new Map();
|
|
109
|
+
// Registrar parâmetros de tipo entidade para resolução de campos
|
|
110
|
+
for (const param of node.parametros) {
|
|
111
|
+
if (param.tipo.kind === 'TipoSimples') {
|
|
112
|
+
const nomeTipo = param.tipo.nome;
|
|
113
|
+
if (!['numero', 'decimal', 'moeda', 'booleano', 'texto', 'id', 'data', 'hora'].includes(nomeTipo)) {
|
|
114
|
+
this.localEntityTypeMap.set(param.nome, nomeTipo);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
74
118
|
this.module.functions.push(func);
|
|
75
119
|
// Criar bloco entry
|
|
76
120
|
const entryBlock = this.createBlock('entry');
|
|
@@ -84,7 +128,90 @@ export class IRGenerator {
|
|
|
84
128
|
this.currentFunction = null;
|
|
85
129
|
this.currentBlock = null;
|
|
86
130
|
}
|
|
131
|
+
generateOuvinte(servicoNome, node) {
|
|
132
|
+
// Nome da função handler: '@NomeServico_on_NomeEvento'
|
|
133
|
+
const funcName = `@${servicoNome}_on_${node.evento}`;
|
|
134
|
+
const func = {
|
|
135
|
+
name: funcName,
|
|
136
|
+
parameters: [{ name: '%evento', type: 'ptr' }],
|
|
137
|
+
returnType: 'void',
|
|
138
|
+
blocks: [],
|
|
139
|
+
locals: []
|
|
140
|
+
};
|
|
141
|
+
this.currentFunction = func;
|
|
142
|
+
this.module.functions.push(func);
|
|
143
|
+
const entryBlock = this.createBlock('entry');
|
|
144
|
+
this.switchToBlock(entryBlock);
|
|
145
|
+
this.generateBloco(node.corpo);
|
|
146
|
+
if (this.currentBlock && !this.currentBlock.terminator) {
|
|
147
|
+
this.setTerminator({ kind: 'Return' });
|
|
148
|
+
}
|
|
149
|
+
this.currentFunction = null;
|
|
150
|
+
this.currentBlock = null;
|
|
151
|
+
// Registrar no metadata de event handlers
|
|
152
|
+
this.module.eventHandlers.push({
|
|
153
|
+
eventName: node.evento,
|
|
154
|
+
functionName: funcName
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
generateRegra(node) {
|
|
158
|
+
// Regra vira função WASM chamável: @regra_NomeRegra()
|
|
159
|
+
const func = {
|
|
160
|
+
name: '@regra_' + node.nome,
|
|
161
|
+
parameters: [],
|
|
162
|
+
returnType: 'void',
|
|
163
|
+
blocks: [],
|
|
164
|
+
locals: []
|
|
165
|
+
};
|
|
166
|
+
this.currentFunction = func;
|
|
167
|
+
this.module.functions.push(func);
|
|
168
|
+
const entryBlock = this.createBlock('entry');
|
|
169
|
+
this.switchToBlock(entryBlock);
|
|
170
|
+
// Gera condicional: se condicao → entao, senao → senao (se existir)
|
|
171
|
+
const thenBlock = this.createBlock(this.newBlockLabel('regra_entao'));
|
|
172
|
+
const elseBlock = node.senao ? this.createBlock(this.newBlockLabel('regra_senao')) : null;
|
|
173
|
+
const mergeBlock = this.createBlock(this.newBlockLabel('regra_fim'));
|
|
174
|
+
const condition = this.generateExpressao(node.condicao);
|
|
175
|
+
this.setTerminator({
|
|
176
|
+
kind: 'CondBranch',
|
|
177
|
+
condition,
|
|
178
|
+
trueBlock: thenBlock.label,
|
|
179
|
+
falseBlock: elseBlock ? elseBlock.label : mergeBlock.label
|
|
180
|
+
});
|
|
181
|
+
this.switchToBlock(thenBlock);
|
|
182
|
+
this.generateBloco(node.entao);
|
|
183
|
+
if (this.currentBlock && !this.currentBlock.terminator) {
|
|
184
|
+
this.setTerminator({ kind: 'Branch', target: mergeBlock.label });
|
|
185
|
+
}
|
|
186
|
+
if (elseBlock && node.senao) {
|
|
187
|
+
this.switchToBlock(elseBlock);
|
|
188
|
+
this.generateBloco(node.senao);
|
|
189
|
+
if (this.currentBlock && !this.currentBlock.terminator) {
|
|
190
|
+
this.setTerminator({ kind: 'Branch', target: mergeBlock.label });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.switchToBlock(mergeBlock);
|
|
194
|
+
this.setTerminator({ kind: 'Return' });
|
|
195
|
+
this.currentFunction = null;
|
|
196
|
+
this.currentBlock = null;
|
|
197
|
+
}
|
|
198
|
+
generateTela(node) {
|
|
199
|
+
const descriptor = {
|
|
200
|
+
nome: node.nome,
|
|
201
|
+
titulo: node.titulo,
|
|
202
|
+
elementos: node.elementos.map(el => ({
|
|
203
|
+
tipo: el.tipo,
|
|
204
|
+
nome: el.nome,
|
|
205
|
+
propriedades: el.propriedades
|
|
206
|
+
}))
|
|
207
|
+
};
|
|
208
|
+
this.module.telas.push(descriptor);
|
|
209
|
+
}
|
|
87
210
|
generateServico(node) {
|
|
211
|
+
// Gera cada ouvinte como função handler + registra no eventHandlers
|
|
212
|
+
for (const ouvinte of node.ouvintes) {
|
|
213
|
+
this.generateOuvinte(node.nome, ouvinte);
|
|
214
|
+
}
|
|
88
215
|
// Gera cada método como função independente
|
|
89
216
|
// Nome: '@NomeServico_nomeFuncao'
|
|
90
217
|
for (const metodo of node.metodos) {
|
|
@@ -154,6 +281,13 @@ export class IRGenerator {
|
|
|
154
281
|
}
|
|
155
282
|
generateVariavel(node) {
|
|
156
283
|
const type = node.tipo ? this.jadeTypeToIR(node.tipo) : 'void';
|
|
284
|
+
// Rastrear tipo de entidade para resolução de campos em AcessoMembro
|
|
285
|
+
if (node.tipo?.kind === 'TipoSimples') {
|
|
286
|
+
const nomeTipo = node.tipo.nome;
|
|
287
|
+
if (!['numero', 'decimal', 'moeda', 'booleano', 'texto', 'id', 'data', 'hora'].includes(nomeTipo)) {
|
|
288
|
+
this.localEntityTypeMap.set(node.nome, nomeTipo);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
157
291
|
if (node.inicializador) {
|
|
158
292
|
const value = this.generateExpressao(node.inicializador);
|
|
159
293
|
this.emit({
|
|
@@ -547,7 +681,7 @@ export class IRGenerator {
|
|
|
547
681
|
const object = this.generateExpressao(node.objeto);
|
|
548
682
|
// Emite GetField
|
|
549
683
|
const result = this.newTemp();
|
|
550
|
-
const type =
|
|
684
|
+
const type = this.resolveFieldType(node.objeto, node.membro);
|
|
551
685
|
this.emit({
|
|
552
686
|
kind: 'GetField',
|
|
553
687
|
result,
|
|
@@ -561,6 +695,32 @@ export class IRGenerator {
|
|
|
561
695
|
type
|
|
562
696
|
};
|
|
563
697
|
}
|
|
698
|
+
/**
|
|
699
|
+
* Resolve o IR type de um campo de acesso a membro.
|
|
700
|
+
* Usa localEntityTypeMap para encontrar o tipo da entidade e busca o campo
|
|
701
|
+
* nas typeDefinitions registradas.
|
|
702
|
+
*/
|
|
703
|
+
resolveFieldType(objeto, campo) {
|
|
704
|
+
let entityName;
|
|
705
|
+
if (objeto.kind === 'Identificador') {
|
|
706
|
+
entityName = this.localEntityTypeMap.get(objeto.nome);
|
|
707
|
+
}
|
|
708
|
+
if (entityName) {
|
|
709
|
+
const typeDef = this.module.typeDefinitions.find(t => t.name === entityName);
|
|
710
|
+
if (typeDef) {
|
|
711
|
+
const field = typeDef.fields.find(f => f.name === campo);
|
|
712
|
+
if (field)
|
|
713
|
+
return field.type;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
// Fallback: tentar buscar o campo em todos os tipos conhecidos
|
|
717
|
+
for (const typeDef of this.module.typeDefinitions) {
|
|
718
|
+
const field = typeDef.fields.find(f => f.name === campo);
|
|
719
|
+
if (field)
|
|
720
|
+
return field.type;
|
|
721
|
+
}
|
|
722
|
+
return 'i32'; // fallback seguro — ponteiros e inteiros são i32
|
|
723
|
+
}
|
|
564
724
|
// ── Utilitários ──────────────────────────────────────────
|
|
565
725
|
newTemp() {
|
|
566
726
|
return `%t${this.tempCounter++}`;
|
|
@@ -655,6 +815,7 @@ export class IRGenerator {
|
|
|
655
815
|
switch (nome) {
|
|
656
816
|
case 'numero': return 'i32';
|
|
657
817
|
case 'decimal': return 'f64';
|
|
818
|
+
case 'moeda': return 'f64'; // moeda usa centavos internamente como f64
|
|
658
819
|
case 'booleano': return 'i1';
|
|
659
820
|
case 'texto': return 'ptr';
|
|
660
821
|
case 'id': return 'ptr';
|