Skip to content

Commit

Permalink
Correções em tradutor para JavaScript. (#691)
Browse files Browse the repository at this point in the history
* Correções em tradutor para JavaScript.
* Correções para testes unitários.
  • Loading branch information
leonelsanchesdasilva authored Nov 28, 2024
1 parent ce2262f commit 381142a
Show file tree
Hide file tree
Showing 3 changed files with 417 additions and 107 deletions.
62 changes: 32 additions & 30 deletions fontes/tradutores/tradutor-javascript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
return 'toLowerCase';
case 'substituir':
return 'replace';
case 'texto':
return 'String';
default:
return metodo;
}
Expand Down Expand Up @@ -155,25 +157,6 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
return resultado;
}

traduzirConstrutoDefinirValor(definirValor: DefinirValor): string {
let resultado = '';
if (definirValor.objeto instanceof Isto) {
resultado = 'this.' + definirValor.nome.lexema + ' = ';
}

resultado += definirValor.valor.simbolo.lexema;
return resultado;
}

traduzirConstrutoLiteral(literal: Literal): string {
if (typeof literal.valor === 'string') return `'${literal.valor}'`;
return literal.valor;
}

traduzirConstrutoVariavel(variavel: Variavel): string {
return variavel.simbolo.lexema;
}

traduzirConstrutoChamada(chamada: Chamada): string {
let resultado = '';

Expand Down Expand Up @@ -223,7 +206,26 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
return resultado;
}

logicaComumBlocoEscopo(declaracoes: Declaracao[]): string {
traduzirConstrutoDefinirValor(definirValor: DefinirValor): string {
let resultado = '';
if (definirValor.objeto instanceof Isto) {
resultado = 'this.' + definirValor.nome.lexema + ' = ';
}

resultado += definirValor.valor.simbolo.lexema;
return resultado;
}

traduzirConstrutoLiteral(literal: Literal): string {
if (typeof literal.valor === 'string') return `'${literal.valor}'`;
return literal.valor;
}

traduzirConstrutoVariavel(variavel: Variavel): string {
return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
}

protected logicaComumBlocoEscopo(declaracoes: Declaracao[]): string {
let resultado = '{\n';
this.indentacao += 4;

Expand Down Expand Up @@ -411,17 +413,15 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
if (declaracaoPara.inicializador.constructor.name === 'Array') {
resultado +=
this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](
declaracaoPara.inicializador[0]
) + ' ';
declaracaoPara.inicializador[0], false
) + '; ';
} else {
resultado +=
this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](
declaracaoPara.inicializador
) + ' ';
declaracaoPara.inicializador, false
) + '; ';
}

resultado += !resultado.includes(';') ? ';' : '';

resultado +=
this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao) + '; ';
resultado +=
Expand Down Expand Up @@ -531,10 +531,10 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
return resultado;
}

traduzirDeclaracaoVar(declaracaoVar: Var): string {
traduzirDeclaracaoVar(declaracaoVar: Var, adicionarPontoEVirgula: boolean = true): string {
let resultado = 'let ';
resultado += declaracaoVar.simbolo.lexema;
if (!declaracaoVar?.inicializador) resultado += ';';
if (!declaracaoVar?.inicializador && adicionarPontoEVirgula) resultado += ';';
else {
resultado += ' = ';
if (this.dicionarioConstrutos[declaracaoVar.inicializador.constructor.name]) {
Expand All @@ -546,8 +546,9 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
declaracaoVar.inicializador
);
}
resultado += ';';
if (adicionarPontoEVirgula) resultado += ';';
}

return resultado;
}

Expand Down Expand Up @@ -647,7 +648,8 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
}

traduzirDeclaracaoFalhar(falhar: Falhar) {
return `throw '${falhar.explicacao.valor}'`;
const explicacao = this.dicionarioConstrutos[falhar.explicacao.constructor.name](falhar.explicacao);
return `throw ${explicacao}`;
}

traduzirConstrutoUnario(unario: Unario): string {
Expand Down
3 changes: 2 additions & 1 deletion testes/tradutores/tradutor-assemblyscript.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Lexador, Simbolo } from "../../fontes/lexador";
import { AvaliadorSintatico } from "../../fontes/avaliador-sintatico";
import tiposDeSimbolos from '../../fontes/tipos-de-simbolos/delegua';
import { TradutorAssemblyScript } from '../../fontes/tradutores/tradutor-assemblyscript';
import { Bloco, Escreva, Se } from "../../fontes/declaracoes";
import { Binario, Literal, Variavel } from "../../fontes/construtos";

import tiposDeSimbolos from '../../fontes/tipos-de-simbolos/delegua';

describe('Tradutor Delégua -> AssemblyScript', () => {
const tradutor: TradutorAssemblyScript = new TradutorAssemblyScript();

Expand Down
Loading

0 comments on commit 381142a

Please sign in to comment.