UNPKG

@designliquido/delegua

Version:

Linguagem de programação simples e moderna usando português estruturado.

346 lines 19.2 kB
import { Bloco, CabecalhoPrograma, Classe, Comentario, Const, ConstMultiplo, Continua, Declaracao, Enquanto, Escolha, Escreva, EscrevaMesmaLinha, Expressao, Extensao, Falhar, Fazer, FuncaoDeclaracao, Importar, InicioAlgoritmo, InterfaceDeclaracao, Para, ParaCada, Retorna, Se, TendoComo, Tente, TextoDocumentacao, Var, VarMultiplo } from '../declaracoes'; import { Chamavel, DescritorTipoClasse, DeleguaFuncao, DeleguaModulo } from './estruturas'; import { AcessoIndiceVariavel, AcessoIntervaloVariavel, AcessoMetodo, AcessoMetodoOuPropriedade, AcessoPropriedade, Agrupamento, ArgumentoReferenciaFuncao, AtribuicaoPorIndice, Atribuir, Chamada, ComentarioComoConstruto, Construto, DefinirValor, Dicionario, ExpressaoRegular, FimPara, FormatacaoEscrita, FuncaoConstruto, Leia, Literal, Logico, ReferenciaFuncao, Separador, Super, TipoDe, Tupla, TuplaN, Unario, Variavel, Vetor, Isto, Binario } from '../construtos'; import { ErroInterpretadorInterface } from '../interfaces/erros/erro-interpretador-interface'; import { RetornoInterpretadorInterface } from '../interfaces/retornos/retorno-interpretador-interface'; import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../quebras'; import { PilhaEscoposExecucaoInterface } from '../interfaces/pilha-escopos-execucao-interface'; import { MetodoPrimitiva } from './estruturas/metodo-primitiva'; import { ArgumentoInterface } from './argumento-interface'; import { MicroLexador } from '../lexador'; import { MicroAvaliadorSintaticoBase } from '../avaliador-sintatico/micro-avaliador-sintatico-base'; import { EspacoMemoria } from './espaco-memoria'; import { InterpretadorInterface, ResultadoParcialInterpretadorInterface, SimboloInterface, VariavelInterface } from '../interfaces'; /** * O Interpretador visita todos os elementos complexos gerados pelo avaliador sintático (_parser_), * e de fato executa a lógica de programação descrita no código. Este interpretador base é usado * por Delégua e todos os seus dialetos, contendo somente os pontos em comum entre todas as * linguagens. * * O Interpretador Base não contém dependências com o Node.js. É * recomendado para uso em execuções que ocorrem no navegador de internet. */ export declare class InterpretadorBase implements InterpretadorInterface { diretorioBase: string; erros: ErroInterpretadorInterface[]; declaracoes: Declaracao[]; resultadoInterpretador: ResultadoParcialInterpretadorInterface[]; linhaDeclaracaoAtual: number; hashArquivoDeclaracaoAtual: number; classeAtualEmExecucao: any; expandirPropriedadesDeObjetosEmEspacoMemoria: boolean; requerDeclaracaoPropriedades: boolean; performance: boolean; funcaoDeRetorno: Function; funcaoDeRetornoMesmaLinha: Function; interfaceDeEntrada: any; interfaceEntradaSaida: any; emDeclaracaoTente: boolean; pilhaEscoposExecucao: PilhaEscoposExecucaoInterface; extensoesGlobais: Map<string, Map<string, DeleguaFuncao>>; extensoesModulo: Map<number, Map<string, Map<string, DeleguaFuncao>>>; microLexador: MicroLexador; microAvaliadorSintatico: MicroAvaliadorSintaticoBase; regexInterpolacao: RegExp; private iteracoesParaCederControle; private tiposNumericos; lancarErroPorDivisaoPorZero: boolean; constructor(diretorioBase: string, performance?: boolean, funcaoDeRetorno?: Function, funcaoDeRetornoMesmaLinha?: Function); /** * Cede o controle ao loop de eventos do JavaScript. * Usado em laços de repetição para evitar bloqueio do loop de eventos * em iterações longas ou infinitas. */ protected cederControle(iteracoes: number): Promise<void>; visitarDeclaracaoTextoDocumentacao(declaracao: TextoDocumentacao): Promise<any> | void; visitarExpressaoSeparador(expressao: Separador): Promise<any> | void; visitarExpressaoComentario(expressao: ComentarioComoConstruto): Promise<any> | void; /** * Usado para chamadas de métodos de primitiva. * Sendo uma variável ou constante, a primitiva precisa atualizar a referência * para o objeto que está sendo acessado. * @param {Construto} objetoAcessado O objeto que está sendo acessado. * @returns O nome desse objeto, se ele for uma variável ou constante. * @see resolverValor */ protected resolverNomeObjectoAcessado(objetoAcessado: Construto): string; resolverValor(objeto: any): any; /** * Resolve valores recursivamente, incluindo valores aninhados em arrays e dicionários. * Remove metadados que não devem ser serializados. * @param objeto O objeto a ser resolvido * @returns O valor resolvido sem metadados */ protected resolverValorRecursivo(objeto: any): any; visitarExpressaoArgumentoReferenciaFuncao(expressao: ArgumentoReferenciaFuncao): Promise<any>; visitarExpressaoAcessoMetodo(expressao: AcessoMetodo): Promise<any> | void; visitarExpressaoAcessoPropriedade(expressao: AcessoPropriedade): Promise<any> | void; /** * Construtos de comentários não têm utilidade para o Interpretador. * Apenas retornamos `Promise.resolve()` para não termos erros. * @param declaracao A declaração de comentário. */ visitarDeclaracaoComentario(declaracao: Comentario): Promise<any>; visitarDeclaracaoTendoComo(declaracao: TendoComo): Promise<any>; visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any>; visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any>; visitarExpressaoTupla(expressao: Tupla): Promise<any>; visitarExpressaoTuplaN(expressao: TuplaN): Promise<any>; visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: any): Promise<any>; visitarExpressaoAcessoElementoMatriz(expressao: any): Promise<any>; protected textoParaRegex(texto: string): RegExp; visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<RegExp>; visitarExpressaoTipoDe(expressao: TipoDe): Promise<string>; visitarExpressaoFalhar(expressao: Falhar): Promise<any>; visitarExpressaoFimPara(declaracao: FimPara): Promise<any>; visitarExpressaoReferenciaFuncao(expressao: ReferenciaFuncao): Promise<any>; /** * Chama o método `aceitar` de um construto ou declaração, passando o * próprio interpretador como parâmetro. * * Isto é usado para saber qual método do próprio interpretador chamar * na sequência. * @param expressao A expressão, que pode ser um construto ou declaração. * @returns O retorno da execução do método de visita chamado. */ avaliar(expressao: Construto | Declaracao): Promise<any>; /** * Execução da leitura de valores da entrada configurada no * início da aplicação. * @param expressao Expressão do tipo Leia * @returns Promise com o resultado da leitura. */ visitarExpressaoLeia(expressao: Leia): Promise<any>; /** * Retira a interpolação de um texto. * @param {texto} texto O texto * @param {any[]} interpolacoes A lista de interpolações a serem resolvidas. * @returns O texto com o valor das variáveis. */ protected retirarInterpolacao(texto: string, interpolacoes: { expressaoInterpolacao: string; valor: any; }[]): string; /** * Resolve todas as interpolações em um texto. * @param {texto} textoOriginal O texto original com as variáveis interpoladas. * @returns Uma lista de variáveis interpoladas. */ protected resolverInterpolacoes(textoOriginal: string, linha: number): Promise<any[]>; visitarExpressaoLiteral(expressao: Literal): Promise<any>; /** * Avaliação de agrupamento. Se resultado da avaliação é uma declaração de * função (por exemplo, funções anônimas), a declaração é retornada. Este * retorno é utilizado, entre outros lugares, por `visitarExpressaoDeChamada`. * @param {Agrupamento} expressao O construto de agrupamento. * @returns O resultado da avaliação. * @see this.visitarExpressaoDeChamada */ visitarExpressaoAgrupamento(expressao: Agrupamento): Promise<any>; eVerdadeiro(objeto: any): boolean; protected verificarOperandoNumero(operador: SimboloInterface, operando: any): void; visitarExpressaoUnaria(expressao: Unario): Promise<any>; /** * Formata uma saída de acordo com o número e espaços e casas decimais solicitados. * @param declaracao A declaração de formatação de escrita. * @returns {string} A saída formatada como texto e os respectivos parâmetros aplicados. */ visitarExpressaoFormatacaoEscrita(declaracao: FormatacaoEscrita): Promise<string>; /** * Lógica para verificação de valores iguais, para Delégua e alguns dialetos. * @param esquerda Uma variável. * @param direita Outra variável. * @returns Verdadeiro se são iguais. Falso em caso contrário. */ eIgual(esquerda: VariavelInterface | any, direita: VariavelInterface | any): boolean; /** * Verifica se operandos são números, que podem ser tanto variáveis puras do JavaScript * (neste caso, `number`), ou podem ser variáveis de Delégua com inferência (`VariavelInterface`). * @param operador O símbolo do operador. * @param direita O operando direito. * @param esquerda O operando esquerdo. * @returns Se ambos os operandos são números ou não. */ protected verificarOperandosNumeros(operador: SimboloInterface, direita: VariavelInterface | any, esquerda: VariavelInterface | any): void; visitarExpressaoBinaria(expressao: Binario): Promise<any>; /** * Faz a chamada do método de uma primitiva (por exemplo, número, texto, etc.) com seus * respectivos argumentos. * @param {Chamada} expressao A expressão de chamada. * @param {MetodoPrimitiva} metodoPrimitivaChamado O método da primitiva chamado. * @returns O resultado da chamada do método da primitiva. */ protected chamarMetodoPrimitiva(expressao: Chamada, metodoPrimitivaChamado: MetodoPrimitiva): Promise<any>; protected resolverArgumentosChamada(expressao: Chamada): Promise<ArgumentoInterface[]>; /** * Executa uma chamada de função, método ou classe. * @param expressao A expressão chamada. * @returns O resultado da chamada. */ visitarExpressaoDeChamada(expressao: Chamada): Promise<any>; /** * Execução de uma expressão de atribuição. * @param expressao A expressão. * @returns O valor atribuído. */ visitarExpressaoDeAtribuicao(expressao: Atribuir): Promise<any>; protected procurarVariavel(simbolo: SimboloInterface): any; visitarExpressaoDeVariavel(expressao: Variavel): any; visitarDeclaracaoDeExpressao(declaracao: Expressao): Promise<any>; protected logicaContemOuEm(esquerda: any, direita: any, expressao: Logico): any; visitarExpressaoLogica(expressao: Logico): Promise<any>; visitarDeclaracaoPara(declaracao: Para): Promise<any>; visitarDeclaracaoParaCada(declaracao: ParaCada): Promise<any>; /** * Executa uma expressão Se, que tem uma condição, pode ter um bloco * Senão, e múltiplos blocos Senão-se. * @param declaracao A declaração Se. * @returns O resultado da avaliação do bloco cuja condição é verdadeira. */ visitarDeclaracaoSe(declaracao: Se): Promise<any>; visitarDeclaracaoEnquanto(declaracao: Enquanto): Promise<any>; visitarDeclaracaoEscolha(declaracao: Escolha): Promise<any>; visitarDeclaracaoFazer(declaracao: Fazer): Promise<any>; /** * Interpretação de uma declaração `tente`. * @param declaracao O objeto da declaração. */ visitarDeclaracaoTente(declaracao: Tente): Promise<any>; visitarDeclaracaoImportar(declaracao: Importar): Promise<DeleguaModulo>; protected avaliarArgumentosEscreva(argumentos: Construto[]): Promise<string>; /** * Execução de uma escrita na saída padrão, sem quebras de linha. * Implementada para alguns dialetos, como VisuAlg. * @param declaracao A declaração. * @returns Sempre nulo, por convenção de visita. */ visitarDeclaracaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): Promise<any>; /** * Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou * alguma função para escrever numa página Web. * @param declaracao A declaração. * @returns Sempre nulo, por convenção de visita. */ visitarDeclaracaoEscreva(declaracao: Escreva): Promise<any>; /** * Empilha declarações na pilha de escopos de execução, cria um novo ambiente e * executa as declarações empilhadas. * Se o retorno do último bloco foi uma exceção (normalmente um erro em tempo de execução), * atira a exceção daqui. * Isso é usado, por exemplo, em blocos tente ... pegue ... finalmente. * @param declaracoes Um vetor de declaracoes a ser executado. * @param ambiente O ambiente de execução quando houver, como parâmetros, argumentos, etc. */ executarBloco(declaracoes: Declaracao[], ambiente?: EspacoMemoria): Promise<any>; visitarExpressaoBloco(declaracao: Bloco): Promise<any>; avaliacaoDeclaracaoVarOuConst(declaracao: Const | ConstMultiplo | Var | VarMultiplo): Promise<any>; /** * Executa expressão de definição de constante. * @param declaracao A declaração `Const`. * @returns Um descritor de informações importantes para o retorno externo. */ visitarDeclaracaoConst(declaracao: Const): Promise<any>; /** * Executa expressão de definição de múltiplas constantes. * @param declaracao A declaração `ConstMultiplo`. * @returns Sempre retorna nulo. */ visitarDeclaracaoConstMultiplo(declaracao: ConstMultiplo): Promise<any>; visitarExpressaoContinua(declaracao?: Continua): ContinuarQuebra; visitarExpressaoSustar(declaracao?: any): SustarQuebra; visitarExpressaoRetornar(declaracao: Retorna): Promise<RetornoQuebra>; visitarExpressaoFuncaoConstruto(funcaoConstruto: FuncaoConstruto): Promise<DeleguaFuncao>; visitarExpressaoAtribuicaoPorIndice(expressao: AtribuicaoPorIndice): Promise<any>; visitarExpressaoAcessoIndiceVariavel(expressao: AcessoIndiceVariavel): Promise<any>; /** * Método base para acesso a intervalo. * Por padrão lança erro, pois a maioria dos dialetos (como Delégua padrão) * ainda não suporta isso nativamente, apenas Pituguês. */ visitarExpressaoAcessoIntervaloVariavel(expressao: AcessoIntervaloVariavel): Promise<any>; visitarExpressaoDefinirValor(expressao: DefinirValor): Promise<any>; visitarDeclaracaoDefinicaoFuncao(declaracao: FuncaoDeclaracao): Promise<any>; /** * Executa uma declaração de classe. * Uma variável do tipo `DeleguaClasse` é adicionada à pilha de escopos de execução. * @param declaracao A declaração de classe. * @returns Sempre retorna nulo, por ser requerido pelo contrato de visita. */ visitarDeclaracaoClasse(declaracao: Classe): Promise<DescritorTipoClasse>; /** * Registra uma declaração de interface no ambiente de execução. * Interfaces são verificadas em tempo de análise; em tempo de execução, apenas registramos * o nome para possíveis verificações futuras (ex: `eInstanciaDe`). */ visitarDeclaracaoInterface(_declaracao: InterfaceDeclaracao): Promise<void>; /** * Procura um método de extensão nos registros de módulo e global, * percorrendo os tipos na ordem indicada (específico antes de base). */ encontrarMetodoExtensao(tiposParaVerificar: string[], nomeMetodo: string, hashArquivo: number): DeleguaFuncao | undefined; /** * Registra os métodos de uma declaração de extensão nos registros * de extensão do interpretador. */ visitarDeclaracaoExtensao(declaracao: Extensao): Promise<void>; /** * Executa um acesso a método, normalmente de um objeto de classe. * @param {AcessoMetodoOuPropriedade} expressao A expressão de acesso. * @returns O resultado da execução. */ visitarExpressaoAcessoMetodoOuPropriedade(expressao: AcessoMetodoOuPropriedade): Promise<any>; visitarExpressaoIsto(expressao: Isto): any; visitarExpressaoDicionario(expressao: Dicionario): Promise<any>; visitarExpressaoVetor(expressao: Vetor): Promise<any>; visitarExpressaoSuper(expressao: Super): any; /** * Executa expressão de definição de variável. * @param declaracao A declaração Var * @returns Um descritor de informações importantes para o retorno externo. */ visitarDeclaracaoVar(declaracao: Var): Promise<any>; /** * Executa expressão de definição de múltiplas variáveis. * @param declaracao A declaração `VarMultiplo`. * @returns Sempre retorna nulo. */ visitarDeclaracaoVarMultiplo(declaracao: VarMultiplo): Promise<any>; /** * Formata uma string usando o operador % (similar ao Python). * @param formato A string de formato com especificadores (ex: "Olá %s"). * @param valores Os valores para substituir (pode ser um único valor ou uma tupla/vetor). * @param operador O símbolo do operador para mensagens de erro. * @returns A string formatada. */ private formatarStringComOperadorPorcentagem; paraTexto(objeto: any): string; /** * Efetivamente executa uma declaração. * @param declaracao A declaração a ser executada. * @returns O resultado parcial da execução, normalmente usado por * ferramentas externas. */ executar(declaracao: Declaracao): Promise<ResultadoParcialInterpretadorInterface>; /** * Executa o último escopo empilhado no topo na pilha de escopos do interpretador. * Esse método pega exceções, mas apenas as devolve. * * O tratamento das exceções é feito de acordo com o bloco chamador. * Por exemplo, em `tente ... pegue ... finalmente`, a exceção é capturada e tratada. * Em outros blocos, pode ser desejável ter o erro em tela. * @param manterAmbiente Se verdadeiro, ambiente do topo da pilha de escopo é copiado para o ambiente imediatamente abaixo. * @returns O resultado da execução do escopo, se houver. */ executarUltimoEscopo(manterAmbiente?: boolean): Promise<any>; /** * Interpretação sem depurador, com medição de performance. * Método que efetivamente inicia o processo de interpretação. * @param declaracoes Um vetor de declarações gerado pelo Avaliador Sintático. * @param manterAmbiente Se ambiente de execução (variáveis, classes, etc.) deve ser mantido. Normalmente usado * pelo modo REPL (LAIR). * @returns Um objeto com o resultado da interpretação. */ executarChamavel(chamavel: Chamavel, argumentos: any[]): Promise<any>; interpretar(declaracoes: Declaracao[], manterAmbiente?: boolean): Promise<RetornoInterpretadorInterface>; } //# sourceMappingURL=interpretador-base.d.ts.map