@designliquido/delegua
Version:
Linguagem de programação simples e moderna usando português estruturado.
346 lines • 19.2 kB
TypeScript
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