diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts index de99d509..319c98a5 100644 --- a/fontes/avaliador-sintatico/avaliador-sintatico.ts +++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts @@ -147,6 +147,10 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface l.linha === linhaAtual && l.tipo === tiposDeSimbolos.EXPRESSAO_REGULAR) .length % - 2 === + 2 === 0; if (eParExpressaoRegular) { this.avancarEDevolverAnterior(); diff --git a/fontes/interfaces/variavel-interface.ts b/fontes/interfaces/variavel-interface.ts index d9fe4b3b..cc055a43 100644 --- a/fontes/interfaces/variavel-interface.ts +++ b/fontes/interfaces/variavel-interface.ts @@ -1,3 +1,5 @@ +import { TIPO_NATIVO } from "../interpretador"; + export interface VariavelInterface { valor: any; tipo: @@ -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; } diff --git a/fontes/interpretador/inferenciador.ts b/fontes/interpretador/inferenciador.ts index 894a776c..f871217b 100644 --- a/fontes/interpretador/inferenciador.ts +++ b/fontes/interpretador/inferenciador.ts @@ -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 | boolean | null | undefined): TipoInferencia { +export enum TIPO_NATIVO { + ESCREVA = '', + LEIA = '', + FUNCAO = '', + SE = '', + ENQUANTO = '', + PARA = '', + RETORNA = '', + INTEIRO = '', + TEXTO = '', + BOOLEANO = '', + VAZIO = '' +} + +export function inferirTipoVariavel(variavel: string | number | Array | boolean | null | undefined): TipoInferencia | TIPO_NATIVO { const tipo = typeof variavel; switch (tipo) { case 'string': @@ -19,6 +37,21 @@ export function inferirTipoVariavel(variavel: string | number | Array | 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';