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

Função limpa() #19

Merged
merged 4 commits into from
May 2, 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
23 changes: 20 additions & 3 deletions fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
Literal,
Unario,
Variavel,
Vetor,
} from '@designliquido/delegua/construtos';
import {
Escreva,
Expand Down Expand Up @@ -40,7 +39,7 @@ import { RetornoDeclaracao } from '@designliquido/delegua/avaliador-sintatico/re
import { ErroAvaliadorSintatico } from '@designliquido/delegua/avaliador-sintatico/erro-avaliador-sintatico';
import { TipoDadosElementar } from '@designliquido/delegua/tipo-dados-elementar';

import { Matriz } from '../construtos/matriz';
import { Matriz, Limpa } from '../construtos';
import tiposDeSimbolos from '../tipos-de-simbolos/lexico-regular';

/**
Expand Down Expand Up @@ -139,6 +138,12 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
case tiposDeSimbolos.REAL:
const simboloVariavel: SimboloInterface = this.avancarEDevolverAnterior();
return new Literal(this.hashArquivo, Number(simboloVariavel.linha), simboloVariavel.literal);
case tiposDeSimbolos.FALSO:
this.avancarEDevolverAnterior();
return new Literal(this.hashArquivo, Number(simboloAtual.linha), false);
case tiposDeSimbolos.VERDADEIRO:
this.avancarEDevolverAnterior();
return new Literal(this.hashArquivo, Number(simboloAtual.linha), true);
default:
throw this.erro(simboloAtual, 'Não deveria cair aqui.');
}
Expand Down Expand Up @@ -488,7 +493,10 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
}

declaracaoCadeiasCaracteres(): Var[] {
const simboloCadeia = this.consumir(tiposDeSimbolos.CADEIA, 'Esse erro nunca deve acontecer (declaracaoCadeiasCaracteres).');
const simboloCadeia = this.consumir(
tiposDeSimbolos.CADEIA,
'Esse erro nunca deve acontecer (declaracaoCadeiasCaracteres).'
);

const inicializacoes = [];
do {
Expand Down Expand Up @@ -793,6 +801,13 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
return this.atribuir();
}

expressaoLimpa(): Limpa {
const simboloLimpa = this.avancarEDevolverAnterior();
this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após palavra reservada "limpa".');
this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, 'Esperado parêntese direito após parêntese esquerdo que acompanha palavra reservada "limpa".');
return new Limpa(simboloLimpa.hashArquivo, simboloLimpa.linha);
}

funcao(tipo: string): FuncaoDeclaracao {
const simboloFuncao: SimboloInterface = this.avancarEDevolverAnterior();

Expand Down Expand Up @@ -870,6 +885,8 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
return this.declaracaoInteiros();
case tiposDeSimbolos.LEIA:
return this.declaracaoLeia();
case tiposDeSimbolos.LIMPA:
return this.expressaoLimpa();
case tiposDeSimbolos.LOGICO:
return this.declaracaoLogicos();
case tiposDeSimbolos.PARA:
Expand Down
2 changes: 2 additions & 0 deletions fontes/construtos/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './limpa';
export * from './matriz';
17 changes: 17 additions & 0 deletions fontes/construtos/limpa.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Construto } from "@designliquido/delegua";

import { VisitantePortugolStudioInterface } from "../interfaces";

export class Limpa implements Construto {
linha: number;
hashArquivo: number;

constructor(hashArquivo: number, linha: number) {
this.hashArquivo = hashArquivo;
this.linha = linha;
}

async aceitar(visitante: VisitantePortugolStudioInterface): Promise<any> {
return await visitante.visitarExpressaoLimpa(this);
}
}
1 change: 1 addition & 0 deletions fontes/interfaces/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './visitante-portugol-studio-interface';
7 changes: 7 additions & 0 deletions fontes/interfaces/visitante-portugol-studio-interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { VisitanteComumInterface } from "@designliquido/delegua";

import { Limpa } from "../construtos/limpa";

export interface VisitantePortugolStudioInterface extends VisitanteComumInterface {
visitarExpressaoLimpa(expressao: Limpa): void | Promise<any>;
}
11 changes: 6 additions & 5 deletions fontes/interpretador/comum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ import { Expressao, Importar, Leia } from '@designliquido/delegua/declaracoes';
import { PilhaEscoposExecucaoInterface } from '@designliquido/delegua/interfaces/pilha-escopos-execucao-interface';
import { DeleguaModulo, FuncaoPadrao } from '@designliquido/delegua/estruturas';
import { ErroEmTempoDeExecucao } from '@designliquido/delegua/excecoes';
import { InterpretadorBase } from '@designliquido/delegua';

import { Matriz } from '../construtos/matriz';

import * as calendario from '../bibliotecas/calendario';
import * as matematica from '../bibliotecas/matematica';
import * as texto from '../bibliotecas/texto';
import * as util from '../bibliotecas/util';
import { Matriz } from 'fontes/construtos/matriz';
import { InterpretadorPortugolStudio } from './interpretador-portugol-studio';

function carregarBibliotecaCalendario(): DeleguaModulo {
const metodos: { [nome: string]: FuncaoPadrao } = {
Expand Down Expand Up @@ -89,7 +90,7 @@ function carregarBibliotecaUtil(): DeleguaModulo {
* @param argumentos Os argumentos.
* @returns {string} O texto formatado.
*/
export async function avaliarArgumentosEscreva(interpretador: InterpretadorPortugolStudio, argumentos: Construto[]): Promise<string> {
export async function avaliarArgumentosEscreva(interpretador: InterpretadorBase, argumentos: Construto[]): Promise<string> {
let formatoTexto: string = '';

for (const argumento of argumentos) {
Expand Down Expand Up @@ -146,7 +147,7 @@ export async function visitarExpressaoLeiaComum(
}

export async function visitarExpressaoMatrizComum(
interpretador: InterpretadorPortugolStudio,
interpretador: InterpretadorBase,
expressao: Matriz
): Promise<any> {
return await resolverValoresMatriz(interpretador, expressao.valores);
Expand All @@ -157,7 +158,7 @@ export async function visitarExpressaoMatrizComum(
* @param interpretador A instância do interpretador.
* @param valores A matriz de valores das dimensões ainda não resolvidas.
*/
async function resolverValoresMatriz(interpretador: InterpretadorPortugolStudio, valores: any[]) {
async function resolverValoresMatriz(interpretador: InterpretadorBase, valores: any[]) {
const valoresResolvidos = [];
if (valores && valores.length > 0) {
for (let i = 0; i < valores.length; i++) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
import { Importar, Leia } from '@designliquido/delegua/declaracoes';
import { InterpretadorComDepuracao } from '@designliquido/delegua/interpretador/interpretador-com-depuracao';
import { PilhaEscoposExecucaoPortugolStudio } from './pilha-escopos-execucao-portugol-studio';
import { DeleguaModulo } from '@designliquido/delegua/estruturas';

import { PilhaEscoposExecucaoPortugolStudio } from './pilha-escopos-execucao-portugol-studio';
import { Matriz } from '../construtos/matriz';
import { VisitantePortugolStudioInterface } from '../interfaces';
import { Limpa } from '../construtos';

import * as comum from './comum';

export class InterpretadorPortugolStudioComDepuracao extends InterpretadorComDepuracao {
export class InterpretadorPortugolStudioComDepuracao extends InterpretadorComDepuracao implements VisitantePortugolStudioInterface {
mensagemPrompt: string;
funcaoLimpa: Function = () => { console.log('Função "limpa()" não está ligada a uma interface de entrada e saída.') };

constructor(diretorioBase: string, funcaoDeRetorno: Function = null, funcaoDeRetornoMesmaLinha: Function = null) {
constructor(diretorioBase: string, funcaoDeRetorno: Function = null, funcaoDeRetornoMesmaLinha: Function = null, funcaoLimpa: Function = null) {
super(diretorioBase, funcaoDeRetorno, funcaoDeRetornoMesmaLinha);

if (funcaoLimpa !== null) {
this.funcaoLimpa = funcaoLimpa;
}

this.mensagemPrompt = '> ';
this.pilhaEscoposExecucao = new PilhaEscoposExecucaoPortugolStudio();
}

async visitarExpressaoLimpa(expressao: Limpa): Promise<any> {
this.funcaoLimpa();
return Promise.resolve();
}

async visitarDeclaracaoImportar(declaracao: Importar): Promise<DeleguaModulo> {
return comum.visitarExpressaoImportarComum(declaracao);
}
Expand Down
19 changes: 17 additions & 2 deletions fontes/interpretador/interpretador-portugol-studio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,21 @@ import { DeleguaModulo } from '@designliquido/delegua/estruturas';

import { Matriz } from '../construtos/matriz';
import { PilhaEscoposExecucaoPortugolStudio } from './pilha-escopos-execucao-portugol-studio';
import { VisitantePortugolStudioInterface } from '../interfaces';
import { Limpa } from '../construtos';

import * as comum from './comum';

export class InterpretadorPortugolStudio extends InterpretadorBase {
constructor(diretorioBase: string, performance = false, funcaoDeRetorno: Function = null) {
export class InterpretadorPortugolStudio extends InterpretadorBase implements VisitantePortugolStudioInterface {
funcaoLimpa: Function = () => { console.log('Função "limpa()" não está ligada a uma interface de entrada e saída.') };

constructor(diretorioBase: string, performance = false, funcaoDeRetorno: Function = null, funcaoLimpa: Function = null) {
super(diretorioBase, performance, funcaoDeRetorno);

if (funcaoLimpa !== null) {
this.funcaoLimpa = funcaoLimpa;
}

this.pilhaEscoposExecucao = new PilhaEscoposExecucaoPortugolStudio();
const escopoExecucao: EscopoExecucao = {
declaracoes: [],
Expand All @@ -22,6 +32,11 @@ export class InterpretadorPortugolStudio extends InterpretadorBase {
};
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
}

async visitarExpressaoLimpa(expressao: Limpa): Promise<any> {
this.funcaoLimpa();
return Promise.resolve();
}

async visitarDeclaracaoImportar(declaracao: Importar): Promise<DeleguaModulo> {
return comum.visitarExpressaoImportarComum(declaracao);
Expand Down
1 change: 1 addition & 0 deletions fontes/lexador/palavras-reservadas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export const palavrasReservadas = {
inclua: tiposDeSimbolos.INCLUA,
inteiro: tiposDeSimbolos.INTEIRO,
leia: tiposDeSimbolos.LEIA,
limpa: tiposDeSimbolos.LIMPA,
logico: tiposDeSimbolos.LOGICO,
nao: tiposDeSimbolos.NEGACAO,
ou: tiposDeSimbolos.OU,
Expand Down
1 change: 1 addition & 0 deletions fontes/tipos-de-simbolos/lexico-regular.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default {
INCLUA: 'INCLUA',
INTEIRO: 'INTEIRO',
LEIA: 'LEIA',
LIMPA: 'LIMPA',
LOGICO: 'LOGICO',
MAIOR: 'MAIOR',
MAIOR_IGUAL: 'MAIOR_IGUAL',
Expand Down
49 changes: 37 additions & 12 deletions testes/avaliador-sintatico.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { ErroAvaliadorSintatico } from "@designliquido/delegua/avaliador-sintatico";
import { FuncaoDeclaracao } from "@designliquido/delegua";

import { AvaliadorSintaticoPortugolStudio } from "../fontes";
import { LexadorPortugolStudio } from "../fontes/lexador/lexador-portugol-studio";
import { Limpa } from "../fontes/construtos";


describe('Avaliador sintático (Portugol Studio)', () => {
Expand Down Expand Up @@ -57,7 +59,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThanOrEqual(2);
});

it('Sucesso - Agrupamento', async () => {
Expand All @@ -82,7 +84,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Sucesso - Leia', () => {
Expand All @@ -104,7 +106,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Sucesso - Funções', () => {
Expand Down Expand Up @@ -181,7 +183,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Estruturas de repetição - Enquanto', () => {
Expand Down Expand Up @@ -209,7 +211,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Estruturas de repetição - Faca ... Enquanto', () => {
Expand All @@ -235,7 +237,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Estruturas de repetição - Para', () => {
Expand All @@ -252,7 +254,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Atribuição de Variáveis', () => {
Expand All @@ -269,7 +271,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Atribuição de Vetores', () => {
Expand All @@ -285,7 +287,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('Importação de bibliotecas', () => {
Expand All @@ -303,7 +305,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThanOrEqual(2);
});

it('Importação de bibliotecas, com nome de constante definido', () => {
Expand All @@ -321,7 +323,7 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThanOrEqual(2);
});

it('Matrizes', () => {
Expand All @@ -340,7 +342,30 @@ describe('Avaliador sintático (Portugol Studio)', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
});

it('limpa()', () => {
const retornoLexador = lexador.mapear([
'programa',
'{',
' funcao inicio()',
' {',
` escreva('1, 2, 3')`,
' limpa()',
` escreva('4, 5, 6')`,
' }',
'}'
], -1);

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

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBe(2);
const declaracaoFuncao = retornoAvaliadorSintatico.declaracoes[0];
expect(declaracaoFuncao).toBeInstanceOf(FuncaoDeclaracao);
expect((declaracaoFuncao as FuncaoDeclaracao).funcao.corpo.length).toBe(3);
expect((declaracaoFuncao as FuncaoDeclaracao).funcao.corpo[1]).toBeInstanceOf(Limpa);
});
});

Expand Down
Loading
Loading