Skip to content

Commit

Permalink
Diversas correções no tradutor Python. (#690)
Browse files Browse the repository at this point in the history
* Correção de bugs conforme reportado em #689 (Bháskara).
* Correção de bugs conforme reportado em #689 (nomenclatura de variáveis em Python).
* Diversas correções no tradutor Python.
* Ajustes pós execução de testes unitários.
  • Loading branch information
leonelsanchesdasilva authored Nov 28, 2024
1 parent 0a98e3e commit ce2262f
Show file tree
Hide file tree
Showing 9 changed files with 631 additions and 131 deletions.
16 changes: 11 additions & 5 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -518,17 +518,18 @@ export class AvaliadorSintatico
tiposDeSimbolos.MODULO_IGUAL,
].includes(expressao.operador.tipo)
) {
let simbolo = (expressao.esquerda as Variavel).simbolo;
if (expressao.esquerda instanceof AcessoIndiceVariavel) {
simbolo = (expressao.esquerda.entidadeChamada as Variavel).simbolo;
const entidade = expressao.esquerda as AcessoIndiceVariavel;
const simbolo = (entidade.entidadeChamada as Variavel).simbolo;
return new Atribuir(
this.hashArquivo,
simbolo,
expressao,
(expressao.esquerda as AcessoIndiceVariavel).indice
entidade.indice
);
}

const simbolo = (expressao.esquerda as Variavel).simbolo;
return new Atribuir(this.hashArquivo, simbolo, expressao);
} else if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IGUAL)) {
const igual = this.simbolos[this.atual - 1];
Expand All @@ -537,10 +538,14 @@ export class AvaliadorSintatico
if (expressao instanceof Variavel) {
const simbolo = expressao.simbolo;
return new Atribuir(this.hashArquivo, simbolo, valor);
} else if (expressao instanceof AcessoMetodoOuPropriedade) {
}

if (expressao instanceof AcessoMetodoOuPropriedade) {
const get = expressao;
return new DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
} else if (expressao instanceof AcessoIndiceVariavel) {
}

if (expressao instanceof AcessoIndiceVariavel) {
return new AtribuicaoPorIndice(
this.hashArquivo,
expressao.linha,
Expand All @@ -549,6 +554,7 @@ export class AvaliadorSintatico
valor
);
}

this.erro(igual, 'Tarefa de atribuição inválida');
}

Expand Down
4 changes: 2 additions & 2 deletions fontes/construtos/acesso-indice-variavel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ export class AcessoIndiceVariavel<TTipoSimbolo extends string = string> implemen

entidadeChamada: Construto;
simboloFechamento: SimboloInterface<TTipoSimbolo>;
indice: any;
indice: Construto;

constructor(
hashArquivo: number,
entidadeChamada: Construto,
indice: any,
indice: Construto,
simboloFechamento: SimboloInterface<TTipoSimbolo>
) {
this.linha = entidadeChamada.linha;
Expand Down
8 changes: 4 additions & 4 deletions fontes/construtos/atribuicao-por-indice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ export class AtribuicaoPorIndice implements Construto {
linha: number;
hashArquivo: number;

objeto: any;
valor: any;
indice: any;
objeto: Construto;
valor: Construto;
indice: Construto;

constructor(hashArquivo: number, linha: number, objeto: any, indice: any, valor: any) {
constructor(hashArquivo: number, linha: number, objeto: Construto, indice: Construto, valor: Construto) {
this.linha = linha;
this.hashArquivo = hashArquivo;

Expand Down
7 changes: 3 additions & 4 deletions fontes/construtos/atribuir.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
import { Construto } from './construto';
import { Literal } from './literal';

/**
* Construto de atribuição de um valor a um símbolo.
Expand All @@ -9,7 +8,7 @@ export class Atribuir<TTipoSimbolo extends string = string> implements Construto
linha: number;
hashArquivo: number;

indice?: Literal;
indice?: Construto;

simbolo: SimboloInterface<TTipoSimbolo>;
valor: any;
Expand All @@ -19,8 +18,8 @@ export class Atribuir<TTipoSimbolo extends string = string> implements Construto
simbolo: SimboloInterface<TTipoSimbolo>,
valor: any,
// indice so é usado para variaveis de vetores
// TODO: criar alguma validaçao para garantir que indice so seja passado para variaveis de vetores
indice?: Literal
// TODO: criar alguma validaçao para garantir que `indice` só seja passado para variáveis de vetores
indice?: Construto
) {
this.linha = Number(simbolo.linha);
this.hashArquivo = hashArquivo;
Expand Down
4 changes: 2 additions & 2 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1281,7 +1281,7 @@ export class InterpretadorBase implements InterpretadorInterface {
if (objeto.tipo === tipoDeDadosDelegua.TUPLA) {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.objeto.simbolo.lexema,
(expressao.objeto as any).simbolo.lexema,
'Não é possível modificar uma tupla. As tuplas são estruturas de dados imutáveis.',
expressao.linha
)
Expand Down Expand Up @@ -1314,7 +1314,7 @@ export class InterpretadorBase implements InterpretadorInterface {
} else {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.objeto.nome,
(expressao.objeto as any).nome,
'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.',
expressao.linha
)
Expand Down
7 changes: 4 additions & 3 deletions fontes/tradutores/tradutor-assemblyscript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -627,16 +627,17 @@ export class TradutorAssemblyScript {
return resultado;
}

// TODO: Eliminar o soft cast para `any`.
traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice: AtribuicaoPorIndice): string {
let resultado = '';

resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
resultado += (AtribuicaoPorIndice.objeto as any).simbolo.lexema + '[';
resultado +=
this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
resultado += ' = ';

if (AtribuicaoPorIndice?.valor?.simbolo?.lexema) {
resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
if ((AtribuicaoPorIndice?.valor as any).simbolo?.lexema) {
resultado += `${(AtribuicaoPorIndice.valor as any).simbolo.lexema}`;
} else {
resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](
AtribuicaoPorIndice.valor
Expand Down
8 changes: 4 additions & 4 deletions fontes/tradutores/tradutor-javascript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
}
}

//TODO: @Samuel
traduzirFuncoesNativas(metodo: string): string {
switch (metodo.toLowerCase()) {
case 'adicionar':
Expand Down Expand Up @@ -584,16 +583,17 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
return `${direita} ${operador} ${esquerda}`;
}

// TODO: Eliminar o soft cast para `any`.
traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice: AtribuicaoPorIndice): string {
let resultado = '';

resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
resultado += (AtribuicaoPorIndice.objeto as any).simbolo.lexema + '[';
resultado +=
this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
resultado += ' = ';

if (AtribuicaoPorIndice?.valor?.simbolo?.lexema) {
resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
if ((AtribuicaoPorIndice?.valor as any)?.simbolo?.lexema) {
resultado += `${(AtribuicaoPorIndice.valor as any).simbolo.lexema}`;
} else {
resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](
AtribuicaoPorIndice.valor
Expand Down
Loading

0 comments on commit ce2262f

Please sign in to comment.