import { Aleatorio, Bloco, CabecalhoPrograma, Classe, Const, ConstMultiplo, Continua, Declaracao, Enquanto, Escolha, Escreva, EscrevaMesmaLinha, Expressao, Falhar, Fazer, FuncaoDeclaracao, Importar, InicioAlgoritmo, Leia, Para, ParaCada, Retorna, Se, TendoComo, Tente, Var, VarMultiplo } from '../declaracoes';
import { DescritorTipoClasse, DeleguaFuncao, DeleguaModulo } from '../estruturas';
import { AcessoIndiceVariavel, AcessoMetodo, AcessoMetodoOuPropriedade, AcessoPropriedade, Agrupamento, AtribuicaoPorIndice, Atribuir, Chamada, Comentario, Construto, DefinirValor, ExpressaoRegular, FimPara, FormatacaoEscrita, FuncaoConstruto, Literal, Logico, Super, TipoDe, Tupla, Unario, Variavel, Vetor } from '../construtos';
import { ErroInterpretador } from '../interfaces/erros/erro-interpretador';
import { RetornoInterpretador } from '../interfaces/retornos/retorno-interpretador';
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 { EspacoVariaveis } from '../espaco-variaveis';
import { InterpretadorInterface, 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.
 *
 * 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: ErroInterpretador[];
    declaracoes: Declaracao[];
    resultadoInterpretador: Array<string>;
    expandirPropriedadesDeObjetosEmEspacoVariaveis: boolean;
    requerDeclaracaoPropriedades: boolean;
    performance: boolean;
    funcaoDeRetorno: Function;
    funcaoDeRetornoMesmaLinha: Function;
    interfaceDeEntrada: any;
    interfaceEntradaSaida: any;
    emDeclaracaoTente: boolean;
    pilhaEscoposExecucao: PilhaEscoposExecucaoInterface;
    microLexador: MicroLexador;
    microAvaliadorSintatico: MicroAvaliadorSintaticoBase;
    regexInterpolacao: RegExp;
    private tiposNumericos;
    constructor(diretorioBase: string, performance?: boolean, funcaoDeRetorno?: Function, funcaoDeRetornoMesmaLinha?: Function);
    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>;
    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>;
    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[]} variaveis A lista de variaveis interpoladas
     * @returns O texto com o valor das variaveis.
     */
    protected retirarInterpolacao(texto: string, variaveis: 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>;
    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: any): 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} entidadeChamada O método da primitiva chamado.
     * @returns O resultado da chamada do método da primitiva.
     */
    protected chamarMetodoPrimitiva(expressao: Chamada, entidadeChamada: 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 | any): 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>;
    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?: EspacoVariaveis): 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 Sempre retorna nulo.
     */
    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>;
    visitarExpressaoDeleguaFuncao(corpoDeclaracao: FuncaoConstruto): Promise<DeleguaFuncao>;
    visitarExpressaoAtribuicaoPorIndice(expressao: AtribuicaoPorIndice): Promise<any>;
    visitarExpressaoAcessoIndiceVariavel(expressao: AcessoIndiceVariavel | any): Promise<any>;
    visitarExpressaoDefinirValor(expressao: DefinirValor): Promise<any>;
    visitarDeclaracaoDefinicaoFuncao(declaracao: FuncaoDeclaracao): void;
    /**
     * 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>;
    /**
     * 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: any): any;
    visitarDeclaracaoAleatorio(declaracao: Aleatorio): Promise<any>;
    visitarExpressaoDicionario(expressao: any): 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 Sempre retorna nulo.
     */
    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>;
    paraTexto(objeto: any): any;
    /**
     * Efetivamente executa uma declaração.
     * @param declaracao A declaração a ser executada.
     * @param mostrarResultado Se resultado deve ser mostrado ou não. Normalmente usado
     *                         pelo modo LAIR.
     */
    executar(declaracao: Declaracao, mostrarResultado?: boolean): Promise<any>;
    /**
     * 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.
     */
    interpretar(declaracoes: Declaracao[], manterAmbiente?: boolean): Promise<RetornoInterpretador>;
}
//# sourceMappingURL=interpretador-base.d.ts.map