Skip to content

Commit d0eac28

Browse files
Atualização do núcleo de Delégua para a versão 1, e colaterais.
1 parent edc859b commit d0eac28

14 files changed

Lines changed: 102 additions & 112 deletions

fontes/avaliador-sintatico/avaliador-sintatico-com-importacao.ts

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
4141
this.importador = importador;
4242
}
4343

44-
override finalizarChamada(entidadeChamada: Construto, tipoPrimitiva?: string | undefined): Chamada {
45-
const chamadaResolvida = super.finalizarChamada(entidadeChamada, tipoPrimitiva);
44+
override async finalizarChamada(entidadeChamada: Construto, tipoPrimitiva?: string | undefined): Promise<Chamada> {
45+
const chamadaResolvida = await super.finalizarChamada(entidadeChamada, tipoPrimitiva);
4646
if (chamadaResolvida.entidadeChamada instanceof AcessoMetodo && chamadaResolvida.entidadeChamada.objeto.tipo === 'módulo') {
4747
// Espera-se que o módulo esteja devidamente registrado.
4848
const entidadeChamadaResolvida = chamadaResolvida.entidadeChamada as AcessoMetodo;
@@ -138,11 +138,12 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
138138
};
139139

140140
protected importarBibliotecaNode(literalCaminho: Literal): ImportarBiblioteca {
141-
const bibliotecaResolvida = verificarModulosDelegua(literalCaminho.valor);
141+
const caminhoTexto = String(literalCaminho.valor);
142+
const bibliotecaResolvida = verificarModulosDelegua(caminhoTexto);
142143
if (bibliotecaResolvida) {
143144
const moduloResolvido = carregarBibliotecaDelegua(bibliotecaResolvida as string);
144145

145-
this.primitivasConhecidas[literalCaminho.valor] = {};
146+
this.primitivasConhecidas[caminhoTexto] = {};
146147
for (const [nomeComponente, dadosComponente] of Object.entries(moduloResolvido.componentes)) {
147148
// TODO: Verificar se sempre é o caso de ser função padrão.
148149
let componente;
@@ -151,11 +152,11 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
151152
} else if (dadosComponente instanceof ClasseDeModulo) {
152153
const classeModulo = dadosComponente as ClasseDeModulo;
153154

154-
componente = this.criarComponenteDeClasse(literalCaminho.valor, nomeComponente, classeModulo);
155+
componente = this.criarComponenteDeClasse(caminhoTexto, nomeComponente, classeModulo);
155156
// Registrar também a própria classe (a atribuição ao mapa acontece mais adiante,
156157
// mas garantir que exista agora caso recursão precise dela)
157-
this.primitivasConhecidas[literalCaminho.valor] = this.primitivasConhecidas[literalCaminho.valor] || {};
158-
this.primitivasConhecidas[literalCaminho.valor][nomeComponente] = componente;
158+
this.primitivasConhecidas[caminhoTexto] = this.primitivasConhecidas[caminhoTexto] || {};
159+
this.primitivasConhecidas[caminhoTexto][nomeComponente] = componente;
159160
this.tiposDefinidosPorBibliotecas[nomeComponente] = classeModulo;
160161

161162
} else {
@@ -166,20 +167,21 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
166167
);
167168
}
168169

169-
this.primitivasConhecidas[literalCaminho.valor][nomeComponente] = componente;
170+
this.primitivasConhecidas[caminhoTexto][nomeComponente] = componente;
170171
}
171172
}
172173

173174
return new ImportarBiblioteca(
174175
literalCaminho.hashArquivo,
175176
literalCaminho.linha,
176-
literalCaminho.valor
177+
caminhoTexto
177178
);
178179
}
179180

180-
protected logicaComumImportacaoModulo(literalCaminho: Literal, simboloReferencia: SimboloInterface): ModuloDeclaracoes {
181+
protected async logicaComumImportacaoModulo(literalCaminho: Literal, simboloReferencia: SimboloInterface): Promise<ModuloDeclaracoes> {
182+
const caminhoTexto = String(literalCaminho.valor);
181183
const resultadoImportacao = this.importador.importar(
182-
literalCaminho.valor,
184+
caminhoTexto,
183185
literalCaminho.hashArquivo
184186
);
185187

@@ -188,7 +190,7 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
188190
if (resultadoImportacao.retornoLexador.erros.length > 0) {
189191
throw this.erro(
190192
simboloReferencia,
191-
`Erros encontrados ao importar o arquivo ${literalCaminho.valor
193+
`Erros encontrados ao importar o arquivo ${caminhoTexto
192194
}: ${resultadoImportacao.retornoLexador.erros.reduce(
193195
(acumulado, proximo) =>
194196
(acumulado += proximo.mensagem + "; "),
@@ -201,13 +203,13 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
201203
this.importador
202204
);
203205
const resultadoAvaliacaoSintaticaModulo =
204-
avaliadorSintaticoModulo.analisar(
206+
await avaliadorSintaticoModulo.analisar(
205207
resultadoImportacao.retornoLexador,
206208
resultadoImportacao.hashArquivo,
207209
this.arquivosImportados
208210
);
209211

210-
this.arquivosImportados.push(literalCaminho.valor);
212+
this.arquivosImportados.push(caminhoTexto);
211213

212214
const definicoesClasse =
213215
resultadoAvaliacaoSintaticaModulo.declaracoes.filter(
@@ -259,24 +261,24 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
259261
* Quando válida, devolve a resolução do módulo como construto.
260262
* Normalmente usada na importação dinâmica, ou seja, `var algumaCoisa = importar('caminho')`.
261263
*/
262-
protected override construtoImportar(): any {
264+
protected override async construtoImportar(): Promise<any> {
263265
const simboloAbertura = this.consumir(
264266
tiposDeSimbolos.PARENTESE_ESQUERDO,
265267
"Esperado '(' após declaração."
266268
);
267-
const caminho = this.expressao();
269+
const caminho = await this.expressao();
268270
this.consumir(
269271
tiposDeSimbolos.PARENTESE_DIREITO,
270272
"Esperado ')' após declaração."
271273
);
272274

273275
// Chegando aqui sem erros, a importação é sintaticamente válida.
274276
const literalCaminho = caminho as Literal;
275-
if (!literalCaminho.valor.endsWith('.delegua')) {
277+
if (!String(literalCaminho.valor).endsWith('.delegua')) {
276278
return this.importarBibliotecaNode(literalCaminho);
277279
}
278280

279-
return this.logicaComumImportacaoModulo(literalCaminho, simboloAbertura);
281+
return await this.logicaComumImportacaoModulo(literalCaminho, simboloAbertura);
280282
}
281283

282284
protected localizarDeclaracaoPorNomeEmModulo(
@@ -331,16 +333,16 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
331333
* ou então `importar { algo, outro } de 'caminho'`.
332334
* @returns
333335
*/
334-
override declaracaoImportar(): any {
335-
const declaracaoResolvida = super.declaracaoImportar();
336+
override async declaracaoImportar(): Promise<any> {
337+
const declaracaoResolvida = await super.declaracaoImportar();
336338

337339
const literalCaminho = declaracaoResolvida.caminho as Literal;
338340
if (declaracaoResolvida.simboloTudo !== null && declaracaoResolvida.simboloTudo !== undefined) {
339-
if (!literalCaminho.valor.endsWith('.delegua')) {
341+
if (!String(literalCaminho.valor).endsWith('.delegua')) {
340342
return this.importarBibliotecaNode(literalCaminho);
341343
}
342344

343-
const moduloDeclaracoes = this.logicaComumImportacaoModulo(literalCaminho, declaracaoResolvida.simboloTudo);
345+
const moduloDeclaracoes = await this.logicaComumImportacaoModulo(literalCaminho, declaracaoResolvida.simboloTudo);
344346
this.pilhaEscopos.definirInformacoesVariavel(
345347
declaracaoResolvida.simboloTudo.lexema,
346348
new InformacaoElementoSintatico(declaracaoResolvida.simboloTudo.lexema, 'módulo')
@@ -364,7 +366,7 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
364366

365367
// No caso da desestruturação de valores de módulo, criamos um nome provisório para o módulo
366368
// e uma declaração de constante para cada nome mencionado na desestruturação.
367-
const moduloDeclaracoes = this.logicaComumImportacaoModulo(literalCaminho, declaracaoResolvida.elementosImportacao[0]);
369+
const moduloDeclaracoes = await this.logicaComumImportacaoModulo(literalCaminho, declaracaoResolvida.elementosImportacao[0]);
368370
const constantesImportadas: Const[] = [];
369371
const nomeReservadoModulo = `${literalCaminho.hashArquivo}_${literalCaminho.linha}_modulo`;
370372
const simboloReservadoModulo = { lexema: nomeReservadoModulo, hashArquivo: literalCaminho.hashArquivo, linha: literalCaminho.linha } as SimboloInterface;
@@ -424,11 +426,11 @@ export class AvaliadorSintaticoComImportacao extends AvaliadorSintatico {
424426
super.inicializarPilhaEscopos();
425427
}
426428

427-
override analisar(
429+
override async analisar(
428430
retornoLexador: RetornoLexador<SimboloInterface>,
429431
hashArquivo: number,
430432
arquivosImportados?: string[]
431-
): RetornoAvaliadorSintatico<Declaracao> {
433+
): Promise<RetornoAvaliadorSintatico<Declaracao>> {
432434
this.arquivosImportados = arquivosImportados || [];
433435
return super.analisar(retornoLexador, hashArquivo);
434436
}

fontes/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues-com-importacao.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,30 @@ export class AvaliadorSintaticoPituguesComImportacao extends AvaliadorSintaticoP
2525
this.importador = importador;
2626
}
2727

28-
override declaracaoImportar(): any {
28+
override async declaracaoImportar(): Promise<any> {
2929
this.consumir(
3030
tiposDeSimbolos.PARENTESE_ESQUERDO,
3131
"Esperado '(' após declaração."
3232
);
33-
const caminho = this.expressao();
33+
const caminho = await this.expressao();
3434
const simboloFechamento = this.consumir(
3535
tiposDeSimbolos.PARENTESE_DIREITO,
3636
"Esperado ')' após declaração."
3737
);
3838

3939
// Chegando aqui sem erros, a importação é sintaticamente válida.
4040
const literalCaminho = caminho as Literal;
41-
if (!literalCaminho.valor.endsWith('.delegua')) {
41+
const caminhoTexto = String(literalCaminho.valor);
42+
if (!caminhoTexto.endsWith('.delegua')) {
4243
return new ImportarBiblioteca(
4344
literalCaminho.hashArquivo,
4445
literalCaminho.linha,
45-
literalCaminho.valor
46+
caminhoTexto
4647
);
4748
}
4849

4950
const resultadoImportacao = this.importador.importar(
50-
literalCaminho.valor,
51+
caminhoTexto,
5152
caminho.hashArquivo
5253
);
5354

@@ -70,13 +71,13 @@ export class AvaliadorSintaticoPituguesComImportacao extends AvaliadorSintaticoP
7071
this.importador
7172
);
7273
const resultadoAvaliacaoSintaticaModulo =
73-
avaliadorSintaticoModulo.analisar(
74+
await avaliadorSintaticoModulo.analisar(
7475
resultadoImportacao.retornoLexador,
7576
resultadoImportacao.hashArquivo,
7677
this.arquivosImportados
7778
);
7879

79-
this.arquivosImportados.push(literalCaminho.valor);
80+
this.arquivosImportados.push(caminhoTexto);
8081

8182
const definicoesClasse =
8283
resultadoAvaliacaoSintaticaModulo.declaracoes.filter(
@@ -107,11 +108,11 @@ export class AvaliadorSintaticoPituguesComImportacao extends AvaliadorSintaticoP
107108
super.inicializarPilhaEscopos();
108109
}
109110

110-
override analisar(
111+
override async analisar(
111112
retornoLexador: RetornoLexador<SimboloInterface>,
112113
hashArquivo: number,
113114
arquivosImportados?: string[]
114-
): RetornoAvaliadorSintatico<Declaracao> {
115+
): Promise<RetornoAvaliadorSintatico<Declaracao>> {
115116
this.arquivosImportados = arquivosImportados || [];
116117

117118
return super.analisar(retornoLexador, hashArquivo);

fontes/delegua.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,17 @@ export class Delegua implements DeleguaInterface {
7979
return await nucleoExecucao.iniciarLairDelegua();
8080
}
8181

82-
traduzirArquivo(
82+
async traduzirArquivo(
8383
caminhoRelativoArquivo: string,
8484
comandoTraducao: string,
8585
alvo: string = '',
8686
gerarArquivoSaida: boolean = false
87-
): void {
87+
): Promise<void> {
8888
const nucleoTraducao = new NucleoTraducao(
8989
this.funcaoDeRetorno,
9090
this.funcaoDeRetornoMesmaLinha
9191
);
9292
nucleoTraducao.iniciarTradutor(comandoTraducao, alvo);
93-
nucleoTraducao.traduzirArquivo(caminhoRelativoArquivo, gerarArquivoSaida);
93+
await nucleoTraducao.traduzirArquivo(caminhoRelativoArquivo, gerarArquivoSaida);
9494
}
9595
}

fontes/execucao.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ const principal = async () => {
7171
);
7272
} else if (codigoOuNomeArquivo) {
7373
if (opcoes.traduzir) {
74-
delegua.traduzirArquivo(codigoOuNomeArquivo, opcoes.traduzir, opcoes.alvo, opcoes.saida);
74+
await delegua.traduzirArquivo(codigoOuNomeArquivo, opcoes.traduzir, opcoes.alvo, opcoes.saida);
7575
} else {
7676
if (codigoOuNomeArquivo === '-') {
7777
let codigo = '';

fontes/interfaces/delegua-interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ export interface DeleguaInterface {
1515
comandoTraducao: string,
1616
alvo: string,
1717
gerarArquivoSaida: boolean
18-
): void;
18+
): Promise<void>;
1919
}

fontes/nucleo-execucao.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ export class NucleoExecucao
356356

357357
async executarCodigoComoArgumento(codigo: string): Promise<void> {
358358
const retornoLexador = this.lexador.mapear([codigo], -1);
359-
const retornoAvaliadorSintatico = this.avaliadorSintatico.analisar(
359+
const retornoAvaliadorSintatico = await this.avaliadorSintatico.analisar(
360360
retornoLexador,
361361
-1
362362
);
@@ -391,7 +391,7 @@ export class NucleoExecucao
391391
process.exit(65); // Código para erro de avaliação antes da execução
392392
}
393393

394-
const retornoAvaliadorSintatico = this.avaliadorSintatico.analisar(
394+
const retornoAvaliadorSintatico = await this.avaliadorSintatico.analisar(
395395
retornoImportador.retornoLexador,
396396
retornoImportador.hashArquivo
397397
);
@@ -547,7 +547,7 @@ export class NucleoExecucao
547547
*/
548548
async executarLinhas(linhas: string[]): Promise<RetornoExecucaoInterface> {
549549
const retornoLexador = this.lexador.mapear(linhas, -1);
550-
const retornoAvaliadorSintatico = this.avaliadorSintatico.analisar(
550+
const retornoAvaliadorSintatico = await this.avaliadorSintatico.analisar(
551551
retornoLexador,
552552
-1
553553
);

fontes/nucleo-traducao.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ export class NucleoTraducao
154154
* Se verdadeiro, os arquivos de saída são escritos no mesmo diretório
155155
* do arquivo passado no primeiro parâmetro.
156156
*/
157-
traduzirArquivo(caminhoRelativoArquivo: string, gerarArquivoSaida: boolean): void {
157+
async traduzirArquivo(caminhoRelativoArquivo: string, gerarArquivoSaida: boolean): Promise<void> {
158158
const caminhoAbsolutoPrimeiroArquivo = caminho.resolve(caminhoRelativoArquivo);
159159
const novoDiretorioBase = caminho.dirname(caminhoAbsolutoPrimeiroArquivo);
160160

@@ -170,7 +170,7 @@ export class NucleoTraducao
170170
process.exit(65); // Código para erro de avaliação antes da tradução
171171
}
172172

173-
const retornoAvaliadorSintatico = this.avaliadorSintatico.analisar(
173+
const retornoAvaliadorSintatico = await this.avaliadorSintatico.analisar(
174174
retornoImportador.retornoLexador,
175175
retornoImportador.hashArquivo
176176
);

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
"testes:servidor-depuracao": "yarn ts-node ./fontes/depuracao/servidor-depuracao.ts"
1313
},
1414
"dependencies": {
15-
"@designliquido/birl": "^0.4.2",
16-
"@designliquido/delegua": "^0.73.0",
17-
"@designliquido/mapler": "^0.5.2",
18-
"@designliquido/portugol-studio": "^0.8.2",
19-
"@designliquido/potigol": "^0.7.2",
20-
"@designliquido/visualg": "^0.7.2",
15+
"@designliquido/birl": "^0.5.1",
16+
"@designliquido/delegua": "^1.1.0",
17+
"@designliquido/mapler": "^0.6.1",
18+
"@designliquido/portugol-studio": "^0.9.1",
19+
"@designliquido/potigol": "^0.8.1",
20+
"@designliquido/visualg": "^0.8.1",
2121
"chalk": "4.1.2",
2222
"commander": "^14.0.0",
2323
"json-colorizer": "^3.0.1"

testes/analisadores-semanticos/analisador-semantico-pitugues.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe('Analisador Semântico + Avaliador Sintático com Importação de Pitug
3636
`distancia = mate.raizQuadrada((x2 - x1) ^ 2 + (y2 - y1) ^ 2)`,
3737
`escreva("A distância entre os pontos é: " + distancia)`,
3838
], -1);
39-
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
39+
const retornoAvaliadorSintatico = await avaliadorSintatico.analisar(retornoLexador, -1);
4040
const retornoAnalisadorSemantico = await analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
4141

4242
expect(retornoAnalisadorSemantico).toBeTruthy();

testes/avaliadores-sintaticos/avaliador-sintatico-com-importacao.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ describe('Avaliador Sintático com Importação de Delégua', () => {
2222
avaliadorSintatico = new AvaliadorSintaticoComImportacao(importador);
2323
});
2424

25-
it('Trivial', () => {
25+
it('Trivial', async () => {
2626
const retornoLexador = lexador.mapear([
2727
`var json = importar("json")`,
2828
`const retorno = json.textoParaJson('{"funcionarios":[{"id":0,"nome":"Marcelo","sobrenome":"Silva","salario":3200,"area":"SM"},{"id":1,"nome":"Washington","sobrenome":"Ramos","salario":2700,"area":"UD"},{"id":2,"nome":"Sergio","sobrenome":"Pinheiro","salario":2450,"area":"SD"},{"id":3,"nome":"Bernardo","sobrenome":"Costa","salario":3700,"area":"SM"},{"id":4,"nome":"Cleverton","sobrenome":"Farias","salario":2750,"area":"SD"},{"id":5,"nome":"Abraão","sobrenome":"Campos","salario":2550,"area":"SD"},{"id":6,"nome":"Letícia","sobrenome":"Farias","salario":2450,"area":"UD"},{"id":7,"nome":"Fernando","sobrenome":"Ramos","salario":2450,"area":"SD"},{"id":8,"nome":"Marcelo","sobrenome":"Farias","salario":2550,"area":"UD"},{"id":9,"nome":"Fabio","sobrenome":"Souza","salario":2750,"area":"SD"},{"id":10,"nome":"Clederson","sobrenome":"Oliveira","salario":2500,"area":"SD"}],"areas":[{"codigo":"SD","nome":"Desenvolvimento de Software"},{"codigo":"SM","nome":"Gerenciamento de Software"},{"codigo":"UD","nome":"Designer de UI/UX"}]}')`,
2929
`escreva(retorno["funcionarios"])`
3030
], -1);
31-
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
31+
const retornoAvaliadorSintatico = await avaliadorSintatico.analisar(retornoLexador, -1);
3232

3333
expect(retornoAvaliadorSintatico).toBeTruthy();
3434
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);

0 commit comments

Comments
 (0)