Skip to content

Commit

Permalink
refactor: dando retoques no formatador
Browse files Browse the repository at this point in the history
  • Loading branch information
Aristidescosta committed Feb 21, 2024
1 parent b90c627 commit c9b66c9
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ export class AvaliadorSintaticoPotigol extends AvaliadorSintaticoBase {

tiposPotigolParaDelegua = {
Caractere: 'texto',
Inteiro: 'numero',
Inteiro: 'inteiro',
Logico: 'lógico',
Lógico: 'lógico',
Real: 'numero',
Real: 'real',
Texto: 'texto',
undefined: undefined,
};
Expand Down Expand Up @@ -169,8 +169,7 @@ export class AvaliadorSintaticoPotigol extends AvaliadorSintaticoBase {
this.simbolos[this.atual],
'Esperado tipo válido após dois-pontos como retorno de função.'
);

tipoRetorno = this.simbolos[this.atual - 1];
tipoRetorno = this.simbolos[this.atual];
}

// Se houver símbolo de igual, seja após fechamento de parênteses,
Expand Down Expand Up @@ -984,10 +983,10 @@ export class AvaliadorSintaticoPotigol extends AvaliadorSintaticoBase {
simboloTipo.linha,
propriedades.map(
(p) =>
({
abrangencia: 'padrao',
nome: p.nome,
} as ParametroInterface)
({
abrangencia: 'padrao',
nome: p.nome,
} as ParametroInterface)
),
instrucoesConstrutor
);
Expand Down
98 changes: 58 additions & 40 deletions fontes/formatadores/formatador-potigol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,6 @@ export class FormatadorPotigol implements VisitanteComumInterface {
throw new Error('Método não implementado');
}
visitarDeclaracaoClasse(declaracao: Classe) {
console.log(declaracao);

this.codigoFormatado += `${" ".repeat(this.indentacaoAtual)}tipo ${declaracao.simbolo.lexema}${this.quebraLinha}`
this.formatarBlocoOuVetorDeclaracoes(declaracao.propriedades)
this.formatarBlocoOuVetorDeclaracoes(declaracao.metodos)
Expand All @@ -120,33 +118,43 @@ export class FormatadorPotigol implements VisitanteComumInterface {
}

visitarDeclaracaoConst(declaracao: Const): any {
/* console.log(declaracao);
this.codigoFormatado += `${" ".repeat(this.indentacaoAtual)}${declaracao.simbolo.lexema}: `
let tipo;
if(declaracao.tipo){
tipo = inferirTipoVariavel(declaracao.tipo)
console.log(declaracao);

this.codigoFormatado += `${" ".repeat(this.indentacaoAtual)}${declaracao.simbolo.lexema}`

if (declaracao.tipo) {
this.codigoFormatado += ": "
switch (declaracao.tipo.toUpperCase()) {
case tiposDeSimbolos.TEXTO:
this.codigoFormatado += 'Caractere = '
break;
case "NUMERO":
case tiposDeSimbolos.INTEIRO:
this.codigoFormatado += 'Inteiro = '
break;
case tiposDeSimbolos.REAL:
this.codigoFormatado += 'Real = '
break;
case tiposDeSimbolos.LOGICO:
this.codigoFormatado += 'Logico = '
break;
case tiposDeSimbolos.LÓGICO:
this.codigoFormatado += 'Lógico = '
break;
default:
console.log(declaracao.tipo);
break;
}
}
console.log(tipo, declaracao.tipo);

switch (declaracao.tipo.toUpperCase()) {
case tiposDeSimbolos.TEXTO:
this.codigoFormatado += 'Caractere = '
break;
case "NUMERO":
case tiposDeSimbolos.INTEIRO:
this.codigoFormatado += 'Inteiro = '
break;
case tiposDeSimbolos.LOGICO:
this.codigoFormatado += 'Logico = '
break;
case tiposDeSimbolos.LÓGICO:
this.codigoFormatado += 'Lógico = '
break;
default:
console.log(declaracao.tipo);
break;
if (declaracao.inicializador && !declaracao.tipo) {
this.codigoFormatado += " = "
}

if (declaracao.inicializador) {
this.formatarDeclaracaoOuConstruto(declaracao.inicializador)
}
this.formatarDeclaracaoOuConstruto(declaracao.inicializador) */

}
visitarDeclaracaoConstMultiplo(declaracao: ConstMultiplo): Promise<any> {
throw new Error('Método não implementado');
Expand All @@ -161,7 +169,7 @@ export class FormatadorPotigol implements VisitanteComumInterface {
}

visitarDeclaracaoDeExpressao(declaracao: Expressao) {
// throw new Error("Método não implementado");
this.formatarDeclaracaoOuConstruto(declaracao.expressao)
}

visitarDeclaracaoAleatorio(declaracao: Aleatorio): Promise<any> {
Expand All @@ -173,21 +181,20 @@ export class FormatadorPotigol implements VisitanteComumInterface {
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}${declaracao.simbolo.lexema}(`;

this.visitarExpressaoFuncaoConstruto(declaracao.funcao);
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
}
}

visitarDeclaracaoEnquanto(declaracao: Enquanto) {
this.devePularLinha = false
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}enquanto(`;
this.formatarDeclaracaoOuConstruto(declaracao.condicao);
this.codigoFormatado += ` ) faca`;
this.codigoFormatado += this.quebraLinha;

this.devePularLinha = true
this.formatarDeclaracaoOuConstruto(declaracao.corpo);
this.codigoFormatado += this.quebraLinha;
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}fim`;
this.devePularLinha = true
this.devePularLinha = false
}

private formatarBlocoOuVetorDeclaracoes(declaracoes: Declaracao[]) {
Expand Down Expand Up @@ -236,7 +243,10 @@ export class FormatadorPotigol implements VisitanteComumInterface {
this.formatarDeclaracaoOuConstruto(argumento);
}

this.codigoFormatado += ")"
this.codigoFormatado += `)`
if (this.devePularLinha) {
this.codigoFormatado += this.quebraLinha
}
}

visitarDeclaracaoFazer(declaracao: Fazer) {
Expand Down Expand Up @@ -336,6 +346,7 @@ export class FormatadorPotigol implements VisitanteComumInterface {
throw new Error('Método não implementado');
}
visitarExpressaoBinaria(expressao: Binario) {
/* this.codigoFormatado += `${" ".repeat(this.indentacaoAtual)}` */
this.formatarDeclaracaoOuConstruto(expressao.esquerda);
switch (expressao.operador.tipo) {
case tiposDeSimbolos.ADICAO:
Expand Down Expand Up @@ -431,21 +442,31 @@ export class FormatadorPotigol implements VisitanteComumInterface {
throw new Error('Método não implementado');
}
visitarExpressaoFuncaoConstruto(expressao: FuncaoConstruto) {
console.log(expressao);

this.indentacaoAtual += this.tamanhoIndentacao;

/* if (expressao.parametros.length > 0) {
if (expressao.parametros.length > 0) {
for (let parametro of expressao.parametros) {
if (parametro.tipoDado) {
this.codigoFormatado += `${parametro.tipoDado.nome}: ${parametro.tipoDado.tipo}`
this.codigoFormatado += `${parametro.tipoDado.nome}: `
switch (parametro.tipoDado.tipo.toUpperCase()) {
case tiposDeSimbolos.TEXTO:
this.codigoFormatado += "Caractere"
break;
case tiposDeSimbolos.REAL:
this.codigoFormatado += "Real"
break;
case tiposDeSimbolos.INTEIRO:
this.codigoFormatado += "Inteiro"
break;
default:
break;
}
this.codigoFormatado += `, `
}
}
this.codigoFormatado = `${this.codigoFormatado.slice(0, -2)}): `;
}

this.codigoFormatado = this.codigoFormatado.slice(0, -2); */

for (let declaracaoCorpo of expressao.corpo) {
this.formatarDeclaracaoOuConstruto(declaracaoCorpo);
}
Expand Down Expand Up @@ -542,9 +563,6 @@ export class FormatadorPotigol implements VisitanteComumInterface {

visitarDeclaracaoConstante(expressao: Constante): any {
this.codigoFormatado += `${expressao.simbolo.lexema}`
if (this.devePularLinha) {
this.codigoFormatado += this.quebraLinha
}
}

private formatarDeclaraTuplas(declaracao: Declaracao | Construto) {
Expand Down
73 changes: 28 additions & 45 deletions testes/potigol/formatador-potigol.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,35 +163,28 @@ describe('Avaliador sintático', () => {
});

describe('Atribuição de variáveis', () => {
/*
TODO - Erros com os tipos das constantes
it('Sucesso - Declaração de inteiro constante, inferência', () => {
it('Sucesso - Declaração de inteiro constante, inferência', () => {
const retornoLexador = lexador.mapear(['a = 10'], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const resultado = formatadorPotigol.formatar(retornoAvaliadorSintatico.declaracoes);
const linhasResultado = resultado.split(sistemaOperacional.EOL)

console.log(resultado);
expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
expect(linhasResultado).toHaveLength(1)
});

it('Sucesso - Declaração de caractere constante, dica de tipo', () => {
const retornoLexador = lexador.mapear(["c: Caractere = 'z'"], -1);
const retornoLexador = lexador.mapear(["c: Real = 3.5"], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const resultado = formatadorPotigol.formatar(retornoAvaliadorSintatico.declaracoes);
const linhasResultado = resultado.split(sistemaOperacional.EOL)

console.log(resultado);
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
expect(retornoAvaliadorSintatico).toBeTruthy();
expect(linhasResultado).toHaveLength(1)
});

*/

it('Sucesso - Declaração de inteiro variável, inferência', () => {
const retornoLexador = lexador.mapear(['var a := 10'], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
Expand Down Expand Up @@ -267,10 +260,9 @@ describe('Avaliador sintático', () => {
const resultado = formatadorPotigol.formatar(retornoAvaliadorSintatico.declaracoes);
const linhasResultado = resultado.split(sistemaOperacional.EOL)

console.log(resultado);
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(2);
expect(retornoAvaliadorSintatico).toBeTruthy();
expect(linhasResultado).toHaveLength(4)
expect(linhasResultado).toHaveLength(5)
});

it('Para', () => {
Expand All @@ -291,37 +283,30 @@ describe('Avaliador sintático', () => {
});
});

/*
TODO - Problema da constante afeta aqui também
describe('Declarações de funções', () => {
it('Função de uma linha, argumentos com tipo definido, sem dica de retorno', () => {
const retornoLexador = lexador.mapear([
'soma(x: Inteiro, y: Inteiro) = x + y'
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const resultado = formatadorPotigol.formatar(retornoAvaliadorSintatico.declaracoes);
const linhasResultado = resultado.split(sistemaOperacional.EOL)
console.log(resultado);
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
expect(retornoAvaliadorSintatico).toBeTruthy();
expect(linhasResultado).toHaveLength(5)
});
it('Função de uma linha, argumentos com tipo definido, com dica de retorno', () => {
const retornoLexador = lexador.mapear([
'soma(x: Inteiro, y: Inteiro): Inteiro = x + y'
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const resultado = formatadorPotigol.formatar(retornoAvaliadorSintatico.declaracoes);
const linhasResultado = resultado.split(sistemaOperacional.EOL)
console.log(resultado);
expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
});
}); */
it('Função de uma linha, argumentos com tipo definido, sem dica de retorno', () => {
const retornoLexador = lexador.mapear([
'soma(x: Inteiro, y: Inteiro) = x + y'
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const resultado = formatadorPotigol.formatar(retornoAvaliadorSintatico.declaracoes);
const linhasResultado = resultado.split(sistemaOperacional.EOL)

console.log(resultado);
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
expect(retornoAvaliadorSintatico).toBeTruthy();
expect(linhasResultado).toHaveLength(5)
});
it('Função de uma linha, argumentos com tipo definido, com dica de retorno', () => {
const retornoLexador = lexador.mapear([
'soma(x: Inteiro, y: Inteiro): Inteiro = x + y'
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const resultado = formatadorPotigol.formatar(retornoAvaliadorSintatico.declaracoes);
const linhasResultado = resultado.split(sistemaOperacional.EOL)

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
});

describe('Declarações de tuplas', () => {
it('Dupla', () => {
Expand Down Expand Up @@ -444,9 +429,7 @@ describe('Avaliador sintático', () => {
});
});

/*

TODO - CONSTANTES AFETA AQUI TAMBÉM
describe('Tipos', () => {
it('Trivial', () => {
const retornoLexador = lexador.mapear([
Expand All @@ -465,7 +448,7 @@ describe('Avaliador sintático', () => {
expect(retornoAvaliadorSintatico).toBeTruthy();
expect(linhasResultado).toHaveLength(2)
});
}); */
});
});
});
});

0 comments on commit c9b66c9

Please sign in to comment.