import { ConstrutoInterface } from '../interfaces/construtos/construto-interface';
import { AcessoMetodoOuPropriedade, AjudaComoConstruto, Chamada, Decorador, Dicionario, EnquantoComoConstruto, FuncaoConstruto, ImportarComoConstruto, Leia, ListaCompreensao, ParaCadaComoConstruto, ParaComoConstruto, Tupla, Variavel } from '../construtos';
import { AvaliadorSintaticoInterface, ParametroInterface, SimboloInterface } from '../interfaces';
import { ErroAvaliadorSintatico } from './erro-avaliador-sintatico';
import { Ajuda, Bloco, Classe, Comentario, Const, Continua, Declaracao, Enquanto, Escolha, Escreva, Expressao, Extensao, Falhar, Fazer, FuncaoDeclaracao, Importar, InterfaceDeclaracao, Para, ParaCada, Retorna, Se, Sustar, TendoComo, Tente, Var } from '../declaracoes';
import { RetornoAvaliadorSintaticoInterface } from '../interfaces/retornos/retorno-avaliador-sintatico-interface';
import { RetornoLexadorInterface } from '../interfaces/retornos/retorno-lexador-interface';
import { AvaliadorSintaticoBase } from './avaliador-sintatico-base';
import { PilhaEscopos } from './pilha-escopos';
import { InformacaoElementoSintatico } from '../informacao-elemento-sintatico';
import { MontaoTipos } from './montao-tipos';
import { ElementoMontaoTipos } from './elemento-montao-tipos';
import { ClasseDeModulo } from '../interpretador/estruturas';
/**
 * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
 * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
 * Há dois grupos de estruturas de alto nível: Construtos e Declarações.
 *
 * Construtos não existem por si só: cada construto precisa estar dentro de uma declaração para ser
 * aceito pela próxima etapa, como tradução, interpretação, análise semântica, etc.
 *
 * Este é o avaliador sintático de Delégua que, assim como todos os demais dialetos baseados
 * neste núcleo, são uma derivação do avaliador sintático base. Aqui estão implementadas várias mecânicas
 * a mais relacionadas a tipagem e registros de bibliotecas externas:
 *
 * - `tiposDeFerramentasExternas` é utilizada em [Liquido](https://github.com/DesignLiquido/liquido)
 * para registro de tipos exclusivos de Liquido, como classes de requisição e resposta;
 * - `primitivasConhecidas` é utilizada aqui para registro de métodos relacionados a tipos, e também
 * para as bibliotecas externas de Delégua registrarem suas respectivas resoluções de tipos;
 * - `montaoTipos` é uma implementação de montão muito semelhante ao montão do interpretador, para
 * tipos complexos com N níveis de profundidade, como dicionários e objetos.
 */
export declare class AvaliadorSintatico extends AvaliadorSintaticoBase implements AvaliadorSintaticoInterface<SimboloInterface, Declaracao> {
    pilhaDecoradores: Decorador[];
    simbolos: SimboloInterface[];
    erros: ErroAvaliadorSintatico[];
    tiposDefinidosEmCodigo: {
        [nomeTipo: string]: Declaracao;
    };
    interfacesDeclaradas: {
        [nomeInterface: string]: InterfaceDeclaracao;
    };
    tiposDefinidosPorBibliotecas: {
        [nomeTipo: string]: ClasseDeModulo;
    };
    pilhaEscopos: PilhaEscopos;
    tiposDeFerramentasExternas: {
        [nomeFerramenta: string]: {
            [nomeTipo: string]: string;
        };
    };
    primitivasConhecidas: {
        [nomeModuloOuClasse: string]: {
            [nomePrimitiva: string]: InformacaoElementoSintatico;
        };
    };
    montaoTipos: MontaoTipos;
    hashArquivo: number;
    atual: number;
    blocos: number;
    performance: boolean;
    superclasseAtual: string | undefined;
    metodosClasseAtualEmAnalise: FuncaoDeclaracao[] | undefined;
    intuirTipoQualquerParaIdentificadores: boolean;
    emAjuda: boolean;
    constructor(performance?: boolean);
    protected verificarDefinicaoTipoAtual(): string;
    protected construtoAjuda(): Promise<AjudaComoConstruto>;
    private tentarResolverTopicoAjudaPalavraChave;
    protected obterChaveDicionario(): Promise<ConstrutoInterface>;
    protected construtoDicionario(simboloChaveEsquerda: SimboloInterface): Promise<Dicionario>;
    /**
     * `delegua-node` e a extensão para VSCode precisam que este método seja assíncrono.
     * @returns
     */
    protected construtoImportar(): Promise<ImportarComoConstruto>;
    protected construtoTupla(): Promise<Tupla>;
    protected enquantoComoConstruto(): Promise<EnquantoComoConstruto>;
    protected fazerComoConstruto(simboloFazer: SimboloInterface): Promise<ConstrutoInterface>;
    protected paraCadaComoConstrutoVetor(simboloPara: SimboloInterface): Promise<ParaCadaComoConstruto>;
    protected paraCadaComoConstrutoDicionario(simboloPara: SimboloInterface): Promise<ParaCadaComoConstruto>;
    protected paraCadaComoConstruto(simboloPara: SimboloInterface): Promise<ParaCadaComoConstruto>;
    protected paraTradicionalComoConstruto(simboloPara: SimboloInterface): Promise<ParaComoConstruto>;
    /**
     * Método que resolve `para` ou `para cada` como construto.
     */
    protected paraComoConstruto(simboloPara: SimboloInterface): Promise<ParaCadaComoConstruto | ParaComoConstruto>;
    /**
     * Resolve uma lista de compreensão.
     * @returns {ListaCompreensao} A lista de compreensão resolvida.
     */
    protected resolverCompreensaoDeLista(retornoExpressao: ConstrutoInterface): Promise<ListaCompreensao>;
    primario(): Promise<ConstrutoInterface>;
    protected resolverTipoAcessoIndiceVariavel(expressaoAnterior: ConstrutoInterface): string;
    /**
     * Resolve um construto do tipo `Variavel`, `AcessoMetodoOuPropriedade` ou `AcessoIndiceVariavel`
     * para um `ElementoMontaoTipos` correspondente, caso exista.
     * @param construto O construto.
     * @returns O `ElementoMontaoTipos` correspondente ou `null` se não existir.
     */
    protected resolverElementoMontao(construto: ConstrutoInterface): ElementoMontaoTipos | null;
    protected resolverCadeiaChamadas(expressaoAnterior: ConstrutoInterface, tipoAnterior?: string): Promise<ConstrutoInterface>;
    chamar(): Promise<ConstrutoInterface>;
    /**
     * `AcessoMetodoOuPropriedade` é um construto intermediário em Delégua, e deve ser resolvido como outro
     * construto antes de qualquer outra próxima etapa. Algumas validações adicionais também ocorrem aqui.
     * @param {AcessoMetodoOuPropriedade} entidadeChamadaResolvida O construto original.
     * @returns {ConstrutoInterface} O construto resolvido como um tipo mais específico.
     * @see finalizarChamada
     */
    protected resolverEntidadeChamadaAcessoMetodoOuPropriedade(entidadeChamadaResolvida: AcessoMetodoOuPropriedade): ConstrutoInterface;
    private obterTiposParaConsultaPrimitiva;
    private resolverAcessoMetodoConhecido;
    protected validarArgumentosEntidadeChamada(argumentosEntidadeChamada: InformacaoElementoSintatico[], argumentosUtilizados: ConstrutoInterface[]): string[];
    /**
     * Diversas verificações de resolução de entidade chamada, como resolver chamada da pilha ou usar referência, argumentos, etc.
     * @param entidadeChamada O construto da entidade chamada.
     * @param argumentos Os argumentos utilizados na chamada.
     * @param tipoPrimitiva Se for uma primitiva, o tipo dela. Senão, `undefined`.
     * @returns A entidade chamada resolvida, se as validações passarem.
     */
    protected resolverEntidadeChamada(entidadeChamada: ConstrutoInterface, argumentos: ConstrutoInterface[], tipoPrimitiva?: string | undefined): ConstrutoInterface;
    finalizarChamada(entidadeChamada: ConstrutoInterface, tipoPrimitiva?: string | undefined): Promise<Chamada>;
    unario(): Promise<ConstrutoInterface>;
    private verificarOperandosComparacao;
    private verificarOperandoNegacao;
    /**
     * A exponenciacão é uma exceção na ordem de avaliação (resolve primeiro à direita).
     * Por isso `direito` chama `exponenciacao()`, e não `unario()`.
     * @returns {Binario} A expressão binária na forma do construto `Binario`.
     */
    exponenciacao(): Promise<ConstrutoInterface>;
    /**
     * Verifica recursivamente se um construto é ou contém uma operação unária em um vetor.
     * Isso bloqueia padrões de ofuscação como !![] usado em operações aritméticas.
     */
    private verificarOperacaoUnariaEmVetor;
    protected verificacaoOperacoesBinariasIlegais(esquerdo: ConstrutoInterface, direito: ConstrutoInterface, operador: SimboloInterface): void;
    multiplicar(): Promise<ConstrutoInterface>;
    /**
     * Se símbolo de operação é `+`, `-`, `+=` ou `-=`, monta objeto `Binario` para
     * ser avaliado pelo Interpretador.
     * @returns Um Construto, normalmente um `Binario`, ou `Unario` se houver alguma operação unária para ser avaliada.
     */
    adicaoOuSubtracao(): Promise<ConstrutoInterface>;
    bitShift(): Promise<ConstrutoInterface>;
    bitE(): Promise<ConstrutoInterface>;
    bitOu(): Promise<ConstrutoInterface>;
    comparar(): Promise<ConstrutoInterface>;
    comparacaoIgualdade(): Promise<ConstrutoInterface>;
    em(): Promise<ConstrutoInterface>;
    e(): Promise<ConstrutoInterface>;
    protected elvis(): Promise<ConstrutoInterface>;
    protected seTernario(): Promise<ConstrutoInterface>;
    /**
     * Método que resolve atribuições.
     * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
     */
    /**
     * Processa tuplas, que são expressões separadas por vírgula entre parênteses.
     * Se não houver vírgula, retorna apenas a expressão simples.
     * Sobrescreve o método da base para usar seTernario() em vez de ou().
     */
    tupla(): Promise<ConstrutoInterface>;
    /**
     * Método que resolve atribuições.
     * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
     */
    atribuir(): Promise<ConstrutoInterface>;
    /**
     * Declaração para comando `leia`, para ler dados de entrada do usuário.
     * @returns Um objeto da classe `Leia`.
     */
    expressaoLeia(): Promise<Leia>;
    blocoEscopo(): Promise<Array<Declaracao>>;
    protected declaracaoComentarioMultilinha(): Comentario;
    protected declaracaoComentarioUmaLinha(): Comentario;
    declaracaoContinua(): Continua;
    protected logicaComumEnquanto(): Promise<{
        condicao: ConstrutoInterface;
        corpo: Bloco;
    }>;
    declaracaoEnquanto(): Promise<Enquanto>;
    protected declaracaoEscolha(): Promise<Escolha>;
    declaracaoEscreva(): Promise<Escreva>;
    protected declaracaoExpressao(): Promise<Expressao>;
    protected declaracaoFalhar(): Promise<Falhar>;
    protected declaracaoAssercao(): Promise<Se>;
    protected logicaComumFazer(): Promise<{
        caminhoFazer: Bloco;
        condicaoEnquanto: ConstrutoInterface;
    }>;
    protected declaracaoFazer(simboloFazer: SimboloInterface): Promise<Fazer>;
    /**
     * O símbolo é emitido aqui para fins de formatação, mas este método é
     * sobrescrito em `delegua-node`.
     * @returns {Importar} Uma declaração `Importar`.
     */
    declaracaoImportar(): Promise<Importar>;
    declaracaoPara(): Promise<Para | ParaCada>;
    protected logicaParaCadaDicionario(simboloPara: SimboloInterface): Promise<{
        nomeVariavelChave: SimboloInterface<string>;
        nomeVariavelValor: SimboloInterface<string>;
        dicionario: ConstrutoInterface;
        corpo: Bloco;
    }>;
    protected declaracaoParaCadaDicionario(simboloPara: SimboloInterface): Promise<ParaCada>;
    protected logicaComumParaCadaVetor(simboloPara: SimboloInterface): Promise<{
        variavelIteracao: Variavel<string>;
        vetor: ConstrutoInterface;
        corpo: Bloco;
    }>;
    protected declaracaoParaCadaVetor(simboloPara: SimboloInterface): Promise<ParaCada>;
    protected declaracaoParaCada(simboloPara: SimboloInterface): Promise<ParaCada>;
    protected logicaComumPara(): Promise<{
        inicializador: Expressao | Var | Var[] | Const[];
        condicao: any;
        incrementar: any;
        corpo: Bloco;
    }>;
    protected declaracaoParaTradicional(simboloPara: SimboloInterface): Promise<Para>;
    declaracaoRetorna(): Promise<Retorna>;
    declaracaoSe(): Promise<Se>;
    declaracaoSustar(): Sustar;
    declaracaoTente(): Promise<Tente>;
    protected resolverDecoradores(): Promise<void>;
    protected declaracaoTendoComo(): Promise<TendoComo>;
    protected declaracaoDesestruturacaoVariavel(): Promise<Var[]>;
    protected logicaComumInferenciaTiposAcessoMetodoOuPropriedade(entidadeChamada: AcessoMetodoOuPropriedade): string;
    protected logicaComumInferenciaTiposVariaveisEConstantes(inicializador: ConstrutoInterface, tipo: string): string | undefined;
    protected resolverValorConstruto(construto: ConstrutoInterface): string;
    protected resolverInformacaoElementoSintaticoDeDicionario(construto: ConstrutoInterface): ElementoMontaoTipos;
    /**
     * Caso símbolo atual seja `var`, devolve uma declaração de variável.
     * @returns Um Construto do tipo Var.
     */
    protected declaracaoDeVariaveis(): Promise<Var[]>;
    protected declaracaoDesestruturacaoConstante(): Promise<Const[]>;
    /**
     * Caso símbolo atual seja `const, constante ou fixo`, devolve uma declaração de const.
     * @returns Um Construto do tipo Const.
     */
    declaracaoDeConstantes(): Promise<Const[]>;
    protected funcao(tipo: string): Promise<FuncaoDeclaracao>;
    protected logicaComumParametros(): Promise<ParametroInterface[]>;
    corpoDaFuncao(tipo: string): Promise<FuncaoConstruto>;
    /**
     * Analisa uma declaração de interface.
     * Interfaces definem contratos de métodos e propriedades que as classes devem implementar.
     * A verificação é feita em tempo de análise (parse-time).
     */
    declaracaoDeInterface(): Promise<InterfaceDeclaracao>;
    declaracaoDeClasse(): Promise<Classe>;
    /**
     * Analisa uma declaração de extensão:
     * `extensão [global] de <tipo> { <métodos> }`
     */
    declaracaoDeExtensao(): Promise<Extensao>;
    /**
     * Declarações fora de bloco precisam ser verificadas primeiro por
     * uma série de motivos, como, por exemplo:
     *
     * - Não é possível declarar uma classe/função dentro de um bloco `enquanto`,
     *   `fazer ... enquanto`, `para`, `escolha`, etc;
     * - Qualquer declaração pode ter um decorador.
     * @returns Uma função ou classe se o símbolo atual resolver aqui.
     *          O retorno de `resolverDeclaracao()` em caso contrário.
     * @see resolverDeclaracao
     * @see resolverDecoradores
     */
    resolverDeclaracaoForaDeBloco(): Promise<Declaracao | Declaracao[] | undefined>;
    /**
     * Usado quando há erros na avaliação sintática.
     * Garante que o avaliador sintático não entre em _loop_ infinito.
     * @returns Sempre retorna `void`.
     */
    protected sincronizar(): void;
    protected encontrarIndiceAposFechamentoDeBloco(indiceAbertura: number): number;
    /**
     * Todas as resoluções triviais da linguagem, ou seja, todas as
     * resoluções que podem ocorrer dentro ou fora de um bloco.
     * @returns Normalmente uma `Declaracao`, mas há casos em que
     * outros objetos podem ser retornados.
     * @see resolverDeclaracaoForaDeBloco para as declarações que não podem
     * ocorrer em blocos de escopo elementares.
     */
    protected resolverDeclaracao(): Promise<Declaracao | Declaracao[]>;
    declaracaoAjuda(): Promise<Ajuda>;
    /**
     * Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
     * É separada da inicialização do avaliador sintático, pois é necessário manipular essa
     * inicialização de outra forma em `delegua-node`.
     */
    protected inicializarPilhaEscopos(): void;
    analisar(retornoLexador: RetornoLexadorInterface<SimboloInterface>, hashArquivo: number): Promise<RetornoAvaliadorSintaticoInterface<Declaracao>>;
}
//# sourceMappingURL=avaliador-sintatico.d.ts.map