Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Diversas correções no tradutor Python. #690

Merged
merged 4 commits into from
Nov 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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