Skip to content

Commit

Permalink
Merge pull request #628 from DesignLiquido/visualg-cabecalho-programa
Browse files Browse the repository at this point in the history
Construto de cabeçalho de programa para o VisuAlg
  • Loading branch information
samuelrvg authored Feb 7, 2024
2 parents 1a1bcec + 38e8550 commit 71e465a
Show file tree
Hide file tree
Showing 21 changed files with 132 additions and 29 deletions.
6 changes: 6 additions & 0 deletions fontes/analisador-semantico/analisador-semantico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Agrupamento, Atribuir, Binario, Chamada, Construto, ExpressaoRegular, F
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Classe,
Const,
ConstMultiplo,
Expand Down Expand Up @@ -60,6 +61,11 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
this.atual = 0;
this.diagnosticos = [];
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
return Promise.resolve();
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
return Promise.resolve();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Atribuir, ExpressaoRegular, FimPara, FormatacaoEscrita, Literal, Super,
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Classe,
Const,
ConstMultiplo,
Expand Down Expand Up @@ -61,6 +62,11 @@ export class AnalisadorSemanticoBirl implements AnalisadorSemanticoInterface {
this.atual = 0;
this.diagnosticos = [];
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
return Promise.resolve();
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
return Promise.resolve();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Atribuir, Binario, Chamada, Construto, ExpressaoRegular, FimPara, Forma
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Classe,
Const,
ConstMultiplo,
Expand Down Expand Up @@ -50,6 +51,11 @@ export class AnalisadorSemanticoMapler implements AnalisadorSemanticoInterface {
this.atual = 0;
this.diagnosticos = [];
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
return Promise.resolve();
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
return Promise.resolve();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Atribuir, Chamada, ExpressaoRegular, FimPara, FormatacaoEscrita, Funcao
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Classe,
Const,
ConstMultiplo,
Expand Down Expand Up @@ -50,6 +51,11 @@ export class AnalisadorSemanticoVisuAlg implements AnalisadorSemanticoInterface
this.atual = 0;
this.diagnosticos = [];
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
return Promise.resolve();
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
return Promise.resolve();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { AvaliadorSintaticoBase } from '../../avaliador-sintatico-base';
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Declaracao,
Enquanto,
Escolha,
Expand Down Expand Up @@ -59,12 +60,14 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
this.blocoPrincipalIniciado = false;
}

private validarSegmentoAlgoritmo(): void {
private validarSegmentoAlgoritmo(): SimboloInterface {
this.consumir(tiposDeSimbolos.ALGORITMO, "Esperada expressão 'algoritmo' para inicializar programa.");

this.consumir(tiposDeSimbolos.CARACTERE, "Esperada cadeia de caracteres após palavra-chave 'algoritmo'.");
const descricaoAlgoritmo = this.consumir(tiposDeSimbolos.CARACTERE, "Esperada cadeia de caracteres após palavra-chave 'algoritmo'.");

this.consumir(tiposDeSimbolos.QUEBRA_LINHA, "Esperado quebra de linha após definição do segmento 'algoritmo'.");

return descricaoAlgoritmo;
}

private criarVetorNDimensional(dimensoes: number[]) {
Expand Down Expand Up @@ -1243,8 +1246,9 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
this.avancarEDevolverAnterior();
}

let declaracoes = [];
this.validarSegmentoAlgoritmo();
let declaracoes: Declaracao[] = [];
const simboloNomeAlgoritmo = this.validarSegmentoAlgoritmo();
declaracoes.push(new CabecalhoPrograma(simboloNomeAlgoritmo.linha, simboloNomeAlgoritmo.hashArquivo, simboloNomeAlgoritmo.literal));

while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== tiposDeSimbolos.FIM_ALGORITMO) {
const declaracao = this.resolverDeclaracaoForaDeBloco();
Expand Down
15 changes: 15 additions & 0 deletions fontes/declaracoes/cabecalho-programa.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { VisitanteComumInterface } from "../interfaces";
import { Declaracao } from "./declaracao";

export class CabecalhoPrograma extends Declaracao {
nomeProgramaAlgoritmo: string;

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

async aceitar(visitante: VisitanteComumInterface): Promise<any> {
return visitante.visitarDeclaracaoCabecalhoPrograma(this);
}
}
1 change: 1 addition & 0 deletions fontes/declaracoes/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export * from './bloco';
export * from './cabecalho-programa';
export * from './classe';
export * from './const';
export * from './const-multiplo';
Expand Down
5 changes: 5 additions & 0 deletions fontes/formatadores/formatador-delegua.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import {
Declaracao,
Falhar,
Aleatorio,
CabecalhoPrograma,
} from '../declaracoes';
import { VisitanteComumInterface } from '../interfaces';

Expand Down Expand Up @@ -77,6 +78,10 @@ export class FormatadorDelegua implements VisitanteComumInterface {
this.deveIndentar = true;
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
throw new Error('Método não implementado.');
}

visitarExpressaoTupla(expressao: Tupla): any {
return "";
}
Expand Down
7 changes: 6 additions & 1 deletion fontes/formatadores/formatador-portugol-studio.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AcessoIndiceVariavel, AcessoMetodoOuPropriedade, Agrupamento, AtribuicaoPorIndice, Atribuir, Binario, Chamada, Construto, DefinirValor, Dicionario, ExpressaoRegular, FimPara, FormatacaoEscrita, FuncaoConstruto, Isto, Literal, Logico, Super, TipoDe, Tupla, Unario, Variavel, Vetor } from "../construtos";
import { Classe, Const, ConstMultiplo, Expressao, FuncaoDeclaracao, Enquanto, Escolha, Escreva, Fazer, Importar, Para, ParaCada, Se, Tente, Var, VarMultiplo, Bloco, Continua, EscrevaMesmaLinha, Leia, LeiaMultiplo, Retorna, Sustar, Declaracao, Falhar, Aleatorio } from "../declaracoes";
import { Classe, Const, ConstMultiplo, Expressao, FuncaoDeclaracao, Enquanto, Escolha, Escreva, Fazer, Importar, Para, ParaCada, Se, Tente, Var, VarMultiplo, Bloco, Continua, EscrevaMesmaLinha, Leia, LeiaMultiplo, Retorna, Sustar, Declaracao, Falhar, Aleatorio, CabecalhoPrograma } from "../declaracoes";
import { VisitanteComumInterface } from "../interfaces";
import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from "../quebras";

Expand All @@ -20,6 +20,11 @@ export class FormatadorPortugolStudio implements VisitanteComumInterface {
this.devePularLinha = true;
this.deveIndentar = true;
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
throw new Error("Método não implementado.");
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
throw new Error("Método não implementado");
}
Expand Down
13 changes: 12 additions & 1 deletion fontes/formatadores/formatador-visualg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import {
Sustar,
Declaracao,
Falhar,
CabecalhoPrograma,
} from '../declaracoes';
import { SimboloInterface, VisitanteComumInterface } from '../interfaces';
import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../quebras';
Expand Down Expand Up @@ -79,6 +80,10 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
this.retornoFuncaoAtual = undefined;
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): any {
this.codigoFormatado += `algoritmo "${declaracao.nomeProgramaAlgoritmo}"${this.quebraLinha}`;
}

visitarDeclaracaoAleatorio(declaracao: Aleatorio): any {
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}aleatorio `;
if (declaracao.argumentos.max > 0 && declaracao.argumentos.min > 0) {
Expand Down Expand Up @@ -551,6 +556,9 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
case 'Bloco':
this.visitarExpressaoBloco(declaracaoOuConstruto as Bloco);
break;
case 'CabecalhoPrograma':
this.visitarDeclaracaoCabecalhoPrograma(declaracaoOuConstruto as CabecalhoPrograma);
break;
case 'Chamada':
this.visitarExpressaoDeChamada(declaracaoOuConstruto as Chamada);
break;
Expand Down Expand Up @@ -590,6 +598,9 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
case 'Fazer':
this.visitarDeclaracaoFazer(declaracaoOuConstruto as Fazer);
break;
case 'FimPara':
// FimPara só existe com um Para, então não é necessário formatá-lo.
break;
case 'FormatacaoEscrita':
this.visitarExpressaoFormatacaoEscrita(declaracaoOuConstruto as FormatacaoEscrita);
break;
Expand Down Expand Up @@ -675,7 +686,7 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {

formatar(declaracoes: Declaracao[]): string {
this.indentacaoAtual = 0;
this.codigoFormatado = `algoritmo ""${this.quebraLinha}`;
this.codigoFormatado = "";
this.devePularLinha = true;
this.deveIndentar = true;
this.indentacaoAtual += this.tamanhoIndentacao;
Expand Down
4 changes: 3 additions & 1 deletion fontes/interfaces/visitante-comum-interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { AcessoMetodoOuPropriedade, Atribuir, ExpressaoRegular, FimPara, Literal
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Classe,
Const,
Continua,
Expand Down Expand Up @@ -30,7 +31,8 @@ import { ConstMultiplo } from '../declaracoes/const-multiplo';
import { VarMultiplo } from '../declaracoes/var-multiplo';

export interface VisitanteComumInterface {
visitarDeclaracaoAleatorio(declaracao: Aleatorio): Promise<any>
visitarDeclaracaoAleatorio(declaracao: Aleatorio): Promise<any>;
visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any>;
visitarDeclaracaoClasse(declaracao: Classe): any;
visitarDeclaracaoConst(declaracao: Const): Promise<any>;
visitarDeclaracaoConstMultiplo(declaracao: ConstMultiplo): Promise<any>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
} from '../../../construtos';
import {
Aleatorio,
CabecalhoPrograma,
Classe,
Const,
ConstMultiplo,
Expand Down Expand Up @@ -99,6 +100,11 @@ export class InterpretadorEguaClassico implements InterpretadorInterface {

carregarBibliotecaGlobal(this, this.pilhaEscoposExecucao);
}

async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
throw new Error('Método não implementado.');
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { AcessoMetodoOuPropriedade, Construto, ExpressaoRegular, FimPara, Format
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Const,
ConstMultiplo,
Declaracao,
Expand Down Expand Up @@ -76,6 +77,11 @@ export class ResolvedorEguaClassico implements ResolvedorInterface, Interpretado
this.classeAtual = TipoClasse.NENHUM;
this.cicloAtual = TipoClasse.NENHUM;
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
throw new Error('Método não implementado.');
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Atribuir, Construto, ExpressaoRegular, FimPara, FormatacaoEscrita, Lite
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Classe,
Const,
ConstMultiplo,
Expand Down Expand Up @@ -74,6 +75,11 @@ export class InterpretadorPortugolIpt implements InterpretadorInterface {
};
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
}

visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
throw new Error('Método não implementado.');
}

visitarExpressaoTupla(expressao: Tupla): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
6 changes: 5 additions & 1 deletion fontes/interpretador/dialetos/visualg/comum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
Unario,
Variavel,
} from '../../../construtos';
import { Aleatorio, Declaracao, Expressao, Leia, Para } from '../../../declaracoes';
import { Aleatorio, CabecalhoPrograma, Declaracao, Expressao, Leia, Para } from '../../../declaracoes';
import { Simbolo } from '../../../lexador';
import { SimboloInterface, VariavelInterface } from '../../../interfaces';
import { inferirTipoVariavel } from '../../inferenciador';
Expand All @@ -19,6 +19,10 @@ import tiposDeSimbolos from '../../../tipos-de-simbolos/visualg';
import { ErroEmTempoDeExecucao } from '../../../excecoes';
import { InterpretadorBase } from '../../interpretador-base';

export async function visitarDeclaracaoCabecalhoPrograma(interpretador: InterpretadorBase, declaracao: CabecalhoPrograma): Promise<any> {
return Promise.resolve();
}

export async function atribuirVariavel(
interpretador: InterpretadorBase,
expressao: Construto,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
registrarBibliotecaCaracteresVisuAlg,
} from '../../../bibliotecas/dialetos/visualg';
import { AcessoElementoMatriz, AtribuicaoPorIndicesMatriz, Binario, Construto, FimPara, Logico } from '../../../construtos';
import { EscrevaMesmaLinha, Escreva, Fazer, Leia, Const, Para, Bloco, Aleatorio } from '../../../declaracoes';
import { EscrevaMesmaLinha, Escreva, Fazer, Leia, Const, Para, Bloco, Aleatorio, CabecalhoPrograma } from '../../../declaracoes';
import { ContinuarQuebra, Quebra, SustarQuebra } from '../../../quebras';
import { InterpretadorComDepuracao } from '../../interpretador-com-depuracao';
import * as comum from './comum';
Expand All @@ -24,6 +24,10 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
}

async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
return comum.visitarDeclaracaoCabecalhoPrograma(this, declaracao);
}

visitarDeclaracaoConst(declaracao: Const): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AcessoElementoMatriz, AtribuicaoPorIndicesMatriz, Binario, Construto, FimPara, Logico, Variavel } from '../../../construtos';
import { Aleatorio, Const, Escreva, EscrevaMesmaLinha, Fazer, Leia, Para } from '../../../declaracoes';
import { Aleatorio, CabecalhoPrograma, Const, Escreva, EscrevaMesmaLinha, Fazer, Leia, Para } from '../../../declaracoes';
import { InterpretadorBase } from '../..';
import { ContinuarQuebra, Quebra, SustarQuebra } from '../../../quebras';
import { registrarBibliotecaNumericaVisuAlg } from '../../../bibliotecas/dialetos/visualg/numerica';
Expand Down Expand Up @@ -28,6 +28,10 @@ export class InterpretadorVisuAlg extends InterpretadorBase {
registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
}

async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
return comum.visitarDeclaracaoCabecalhoPrograma(this, declaracao);
}

visitarDeclaracaoConst(declaracao: Const): Promise<any> {
throw new Error('Método não implementado.');
}
Expand Down
5 changes: 5 additions & 0 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { InterpretadorInterface, ParametroInterface, SimboloInterface, VariavelI
import {
Aleatorio,
Bloco,
CabecalhoPrograma,
Classe,
Const,
ConstMultiplo,
Expand Down Expand Up @@ -161,6 +162,10 @@ export class InterpretadorBase implements InterpretadorInterface {
carregarBibliotecasGlobais(this, this.pilhaEscoposExecucao);
}

async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
throw new Error('Método não implementado.');
}

async visitarExpressaoTupla(expressao: any): Promise<any> {
const chaves = Object.keys(expressao)
const valores = [];
Expand Down
Loading

0 comments on commit 71e465a

Please sign in to comment.