Skip to content

Commit

Permalink
[potigol] - implementação qual_tipo
Browse files Browse the repository at this point in the history
  • Loading branch information
pablotdv committed Oct 17, 2023
1 parent d5caca3 commit 7803d6a
Show file tree
Hide file tree
Showing 12 changed files with 107 additions and 10 deletions.
1 change: 1 addition & 0 deletions fontes/construtos/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ export * from './tipo-de';
export * from './unario';
export * from './variavel';
export * from './vetor';
export * from './qual-tipo';
22 changes: 22 additions & 0 deletions fontes/construtos/qual-tipo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { VisitanteComumInterface, SimboloInterface, VariavelInterface } from '../interfaces';
import { Construto } from './construto';


export class QualTipo implements Construto {
linha: number;
hashArquivo: number;
valor: any;

simbolo: SimboloInterface;

constructor(hashArquivo: number, simbolo: SimboloInterface, valor: any) {
this.linha = Number(simbolo.linha);
this.hashArquivo = hashArquivo;
this.valor = valor;
this.simbolo = simbolo;
}

async aceitar(visitante: VisitanteComumInterface): Promise<VariavelInterface> {
return Promise.resolve(visitante.visitarExpressaoQualTipo(this));
}
}
1 change: 1 addition & 0 deletions fontes/interfaces/visitante-comum-interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,5 @@ export interface VisitanteComumInterface {
visitarExpressaoTipoDe(expressao: TipoDe): Promise<any>;
visitarExpressaoUnaria(expressao: any): any;
visitarExpressaoVetor(expressao: any): any;
visitarExpressaoQualTipo(expressao: any): Promise<any>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
FimPara,
FormatacaoEscrita,
Literal,
QualTipo,
Super,
TipoDe,
Variavel,
Expand Down Expand Up @@ -94,6 +95,10 @@ export class InterpretadorEguaClassico implements InterpretadorInterface {
throw new Error('Método não implementado.');
}

visitarExpressaoQualTipo(expressao: QualTipo): Promise<any> {
throw new Error('Método não implementado.');
}

visitarExpressaoFalhar(expressao: any): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AcessoMetodo, Construto, FimPara, FormatacaoEscrita, Super, TipoDe, Variavel } from '../../../../construtos';
import { AcessoMetodo, Construto, FimPara, FormatacaoEscrita, QualTipo, Super, TipoDe, Variavel } from '../../../../construtos';
import {
Bloco,
Const,
Expand Down Expand Up @@ -80,6 +80,10 @@ export class ResolvedorEguaClassico implements ResolvedorInterface, Interpretado
throw new Error('Método não implementado.');
}

visitarExpressaoQualTipo(expressao: QualTipo): Promise<any> {
throw new Error('Método não implementado.');
}

visitarExpressaoFalhar(expressao: any): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Atribuir, Construto, FimPara, FormatacaoEscrita, Literal, Super, TipoDe, Variavel } from '../../../construtos';
import { Atribuir, Construto, FimPara, FormatacaoEscrita, Literal, QualTipo, Super, TipoDe, Variavel } from '../../../construtos';
import {
Bloco,
Classe,
Expand Down Expand Up @@ -78,6 +78,10 @@ export class InterpretadorPortugolIpt implements InterpretadorInterface {
throw new Error('Método não implementado.');
}

visitarExpressaoQualTipo(expressao: QualTipo): Promise<any> {
throw new Error('Método não implementado.');
}

visitarExpressaoFalhar(expressao: any): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
19 changes: 18 additions & 1 deletion fontes/interpretador/dialetos/potigol/interpretador-potigol.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { InterpretadorBase } from '../../interpretador-base';

import { registrarBibliotecaGlobalPotigol } from '../../../bibliotecas/dialetos/potigol/biblioteca-global';
import { AcessoMetodo } from '../../../construtos';
import { AcessoMetodo, Binario, QualTipo, Unario, Variavel } from '../../../construtos';

import * as comum from './comum';
import { ObjetoPadrao } from '../../../estruturas';
import { inferirTipoVariavel } from './inferenciador';

/**
* Uma implementação do interpretador de Potigol.
Expand Down Expand Up @@ -55,4 +56,20 @@ export class InterpretadorPotigol extends InterpretadorBase {
async visitarExpressaoAcessoMetodo(expressao: AcessoMetodo): Promise<any> {
return comum.visitarExpressaoAcessoMetodo(this, expressao);
}

async visitarExpressaoQualTipo(expressao: QualTipo): Promise<string> {
let qualTipo = expressao.valor;

if (
qualTipo instanceof Binario ||
qualTipo instanceof QualTipo ||
qualTipo instanceof Unario ||
qualTipo instanceof Variavel
) {
qualTipo = await this.avaliar(qualTipo);
return qualTipo.tipo || inferirTipoVariavel(qualTipo);
}

return inferirTipoVariavel(qualTipo?.valores || qualTipo);
}
}
5 changes: 5 additions & 0 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import {
FormatacaoEscrita,
Literal,
Logico,
QualTipo,
Super,
TipoDe,
Unario,
Expand Down Expand Up @@ -152,6 +153,10 @@ export class InterpretadorBase implements InterpretadorInterface {
return inferirTipoVariavel(tipoDe?.valores || tipoDe);
}

async visitarExpressaoQualTipo(expressao: QualTipo): Promise<string> {
throw new Error('Método não implementado.');
}

visitarExpressaoFalhar(expressao: Falhar): Promise<any> {
throw new ErroEmTempoDeExecucao(expressao.simbolo, expressao.explicacao, expressao.linha);
}
Expand Down
1 change: 1 addition & 0 deletions fontes/lexador/dialetos/palavras-reservadas/potigol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ export const palavrasReservadas = {
tipo: tiposDeSimbolos.TIPO,
var: tiposDeSimbolos.VARIAVEL,
verdadeiro: tiposDeSimbolos.VERDADEIRO,
qual_tipo: tiposDeSimbolos.QUAL_TIPO,
};
1 change: 1 addition & 0 deletions fontes/tipos-de-simbolos/potigol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,5 @@ export default {
VERDADEIRO: 'VERDADEIRO',
VARIAVEL: 'VARIAVEL',
VIRGULA: 'VIRGULA',
QUAL_TIPO: 'QUAL_TIPO',
};
16 changes: 16 additions & 0 deletions testes/interpretador.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,22 @@ describe('Interpretador', () => {
expect(retornoInterpretador.erros).toHaveLength(0);
});

it('Tipo de número', async () => {
const retornoLexador = lexador.mapear([
"escreva(tipo de 123)",
], -1);

interpretador.funcaoDeRetorno = (saida: any) => {
expect(saida).toEqual("número");
};

const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);

expect(retornoInterpretador.erros).toHaveLength(0);
});

it('Ordem lexicográfica de textos', async () => {
const retornoLexador = lexador.mapear([
"escreva('batata' > 'arroz')",
Expand Down
34 changes: 27 additions & 7 deletions testes/potigol/interpretador.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,24 @@ describe('Interpretador', () => {
});
});

describe('Declaração de lista', () => {
it('Dado em vetor, escreva deve imprirmir o vetor', async () => {
describe('qual_tipo', () => {
it('Dado um inteiro, escreva qual_tipo deve imprirmir Inteiro', async () => {
const retornoLexador = lexador.mapear([
'a = [3, 4]',
'escreva (a)'
'a = 3',
'escreva (a.qual_tipo)'
], -1);

// Substitua a função de saída
interpretador.funcaoDeRetorno = (saida: any) => {
expect(saida).toEqual('[3, 4]');
expect(saida).toEqual("Inteiro");
};

const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
expect(retornoInterpretador.erros).toHaveLength(0);
});
it.skip('WIP: Dado em vetor, escreva qual_tipo deve imprirmir Lista', async () => {

it('Dado um vetor, escreva qual_tipo deve imprirmir Lista', async () => {
const retornoLexador = lexador.mapear([
'a = [3, 4]',
'escreva (a.qual_tipo)'
Expand All @@ -77,6 +77,26 @@ describe('Interpretador', () => {
const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
expect(retornoInterpretador.erros).toHaveLength(0);
});
});

describe('Declaração de lista', () => {
it('Dado um vetor, escreva deve imprirmir o vetor', async () => {
const retornoLexador = lexador.mapear([
'a = [3, 4]',
'escreva (a)'
], -1);

// Substitua a função de saída
interpretador.funcaoDeRetorno = (saida: any) => {
expect(saida).toEqual('[3, 4]');
};

const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
expect(retornoInterpretador.erros).toHaveLength(0);
});


})
});
});

0 comments on commit 7803d6a

Please sign in to comment.