Skip to content

Commit

Permalink
esboço das funçoes nativas
Browse files Browse the repository at this point in the history
  • Loading branch information
Aristidescosta committed Apr 6, 2024
1 parent ff6e5c1 commit ea7fae7
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 5 deletions.
30 changes: 28 additions & 2 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,10 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
return this.simbolos[this.atual];
}

simboloAnterior(): SimboloInterface {
return this.simbolos[this.atual - 1];
}

estaNoFinal(): boolean {
return this.atual === this.simbolos.length;
}
Expand Down Expand Up @@ -316,7 +320,29 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
case tiposDeSimbolos.TIPO:
this.avancarEDevolverAnterior();
this.consumir(tiposDeSimbolos.DE, "Esperado 'de' após 'tipo'.");
const _expressao = this.expressao() as any;
let _expressao;
if (this.verificarSeSimboloAtualEIgualA(
tiposDeSimbolos.ESCREVA,
tiposDeSimbolos.LEIA,
tiposDeSimbolos.FUNCAO,
tiposDeSimbolos.FUNÇÃO,
tiposDeSimbolos.SE,
tiposDeSimbolos.ENQUANTO,
tiposDeSimbolos.PARA,
tiposDeSimbolos.RETORNA,
tipoDeDadosDelegua.INTEIRO,
tipoDeDadosDelegua.TEXTO,
tipoDeDadosDelegua.VETOR,
tipoDeDadosDelegua.LOGICO,
tipoDeDadosDelegua.LÓGICO,
tipoDeDadosDelegua.VAZIO,
)
) {
_expressao = this.simboloAnterior()
} else {
_expressao = this.expressao() as any;
}

return new TipoDe(
this.hashArquivo,
simboloAtual,
Expand All @@ -329,7 +355,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
let eParExpressaoRegular =
this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === tiposDeSimbolos.EXPRESSAO_REGULAR)
.length %
2 ===
2 ===
0;
if (eParExpressaoRegular) {
this.avancarEDevolverAnterior();
Expand Down
7 changes: 5 additions & 2 deletions fontes/interfaces/variavel-interface.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { TIPO_NATIVO } from "../interpretador";

export interface VariavelInterface {
valor: any;
tipo:
Expand All @@ -11,8 +13,9 @@ export interface VariavelInterface {
| 'função'
| 'símbolo'
| 'objeto'
| 'módulo';
subtipo?: 'texto' | 'número' | 'longo' | 'lógico';
| 'módulo'
| TIPO_NATIVO
subtipo?: 'texto' | 'número' | 'longo' | 'lóg ico';
imutavel: boolean;
nomeReferencia?: string;
}
35 changes: 34 additions & 1 deletion fontes/interpretador/inferenciador.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
import { Simbolo } from "../lexador";
import tipoDeDadosPrimitivos from '../tipos-de-dados/primitivos';
import tipoDeDadosDelegua from '../tipos-de-dados/delegua';
import tiposDeSimbolos from '../tipos-de-simbolos/delegua';
export type TipoInferencia = "texto" | "número" | "longo" | "vetor" | "dicionário" | "nulo" | "lógico" | "função" | "símbolo" | "objeto" | "módulo";

export function inferirTipoVariavel(variavel: string | number | Array<any> | boolean | null | undefined): TipoInferencia {
export enum TIPO_NATIVO {
ESCREVA = '<palavra reservada escreva ajuda="palavra reservada usada para apresentar informações">',
LEIA = '<palavra reservada leia ajuda="palavra reservada usada para entrada de dados">',
FUNCAO = '<palavra reservada funcao ajuda="palavra reservada usada para criar funções">',
SE = '<palavra reservada se ajuda="palavra reservada usada para estruturas condicionais">',
ENQUANTO = '<palavra reservada enquanto ajuda="palavra reservada usada para loops enquanto">',
PARA = '<palavra reservada para ajuda="palavra reservada usada para loops para">',
RETORNA = '<palavra reservada retornar ajuda="palavra reservada usada para retornar valores em funções">',
INTEIRO = '<palavra reservada inteiro ajuda="palavra reservada usada para definir variáveis do tipo inteiro">',
TEXTO = '<palavra reservada texto ajuda="palavra reservada usada para definir variáveis do tipo texto">',
BOOLEANO = '<palavra reservada booleano ajuda="palavra reservada usada para definir variáveis do tipo booleano">',
VAZIO = '<palavra reservada vazio ajuda="palavra reservada usada para definir funções que não retornam valores">'
}

export function inferirTipoVariavel(variavel: string | number | Array<any> | boolean | null | undefined): TipoInferencia | TIPO_NATIVO {
const tipo = typeof variavel;
switch (tipo) {
case 'string':
Expand All @@ -19,6 +37,21 @@ export function inferirTipoVariavel(variavel: string | number | Array<any> | boo
if (variavel.constructor.name === 'DeleguaFuncao') return 'função';
if (variavel.constructor.name === 'DeleguaModulo') return 'módulo';
if (variavel.constructor.name === 'Classe') return 'objeto';
if (variavel.constructor.name === 'Simbolo') {
if (typeof variavel === "object") {
const simbolo = variavel as Simbolo;
if (simbolo.tipo === tiposDeSimbolos.ESCREVA) return TIPO_NATIVO.ESCREVA
if (simbolo.tipo === tiposDeSimbolos.FUNCAO || simbolo.tipo === tiposDeSimbolos.FUNÇÃO) return TIPO_NATIVO.FUNCAO
if (simbolo.tipo === tiposDeSimbolos.LEIA) return TIPO_NATIVO.LEIA
if (simbolo.tipo === tiposDeSimbolos.SE) return TIPO_NATIVO.SE
if (simbolo.tipo === tiposDeSimbolos.ENQUANTO) return TIPO_NATIVO.ENQUANTO
if (simbolo.tipo === tiposDeSimbolos.PARA) return TIPO_NATIVO.PARA
if (simbolo.tipo === tiposDeSimbolos.RETORNA) return TIPO_NATIVO.RETORNA
if (simbolo.tipo === tipoDeDadosPrimitivos.TEXTO) return TIPO_NATIVO.TEXTO
if (simbolo.tipo === tipoDeDadosPrimitivos.BOOLEANO) return TIPO_NATIVO.BOOLEANO
if (simbolo.tipo === tipoDeDadosDelegua.VAZIO) return TIPO_NATIVO.VAZIO
}
}
return 'dicionário';
case 'function':
return 'função';
Expand Down

0 comments on commit ea7fae7

Please sign in to comment.