import { Atribuir, AcessoIndiceVariavel, AcessoElementoMatriz, AcessoMetodo, AcessoMetodoOuPropriedade, AcessoPropriedade, ArgumentoReferenciaFuncao, Agrupamento, AtribuicaoPorIndice, AtribuicaoPorIndicesMatriz, Binario, Chamada, DefinirValor, FuncaoConstruto, Dicionario, ExpressaoRegular, FimPara, FormatacaoEscrita, Isto, Literal, Logico, Super, Tupla, TipoDe, Unario, Vetor, ReferenciaFuncao, Leia, ComentarioComoConstruto, Separador, Variavel, Constante, AcessoIntervaloVariavel, TuplaN, Morsa, Bote } from '../construtos';
import { Declaracao, TendoComo, InicioAlgoritmo, CabecalhoPrograma, Classe, Const, ConstMultiplo, Expressao, FuncaoDeclaracao, Enquanto, Escolha, Escreva, Fazer, Importar, Para, ParaCada, Se, Tente, Var, VarMultiplo, Bloco, Continua, EscrevaMesmaLinha, Falhar, Retorna, Sustar, Comentario, TextoDocumentacao } from '../declaracoes';
import { CorrecaoSugeridaInterface, DiagnosticoAnalisadorSemanticoInterface, DiagnosticoSeveridade, ParametroInterface, SimboloInterface } from '../interfaces';
import { AnalisadorSemanticoInterface } from '../interfaces/analisador-semantico-interface';
import { ConstrutoInterface } from '../interfaces/construtos/construto-interface';
import { RetornoAnalisadorSemanticoInterface } from '../interfaces/retornos/retorno-analisador-semantico-interface';
import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../quebras';
import { GerenciadorEscopos } from './gerenciador-escopos';
/**
 * Essa classe só existe para eliminar redundância entre todos os analisadores
 * semânticos. Por padrão, quando um método não é implementado, ao invés de dar erro,
 * simplesmente passa por ele (`return Promise.resolve()`).
 */
export declare abstract class AnalisadorSemanticoBase implements AnalisadorSemanticoInterface {
    gerenciadorEscopos: GerenciadorEscopos;
    diagnosticos: DiagnosticoAnalisadorSemanticoInterface[];
    abstract analisar(declaracoes: Declaracao[]): Promise<RetornoAnalisadorSemanticoInterface>;
    protected diagnosticoJaExiste(simbolo: SimboloInterface, mensagem: string): boolean;
    erro(simbolo: SimboloInterface, mensagem: string, codigoDiagnostico?: string, simboloRelacionado?: SimboloInterface): void;
    aviso(simbolo: SimboloInterface, mensagem: string, codigoDiagnostico?: string, simboloRelacionado?: SimboloInterface): void;
    sugestao(simbolo: SimboloInterface, mensagem: string, correcoes: CorrecaoSugeridaInterface[], codigoDiagnostico?: string, simboloRelacionado?: SimboloInterface): void;
    protected comparacaoArgumentosContraParametrosFuncao(simboloFuncao: SimboloInterface, parametros: ParametroInterface[], argumentos: ConstrutoInterface[]): void;
    /**
     * Obtém o tipo de uma expressão (pode ser Literal, Variavel, Binario, Leia, etc)
     */
    protected obterTipoExpressao(expressao: ConstrutoInterface): string | null;
    /**
     * Infere o tipo de resultado de uma operação binária
     */
    protected inferirTipoBinario(binario: Binario): string | null;
    /**
     * Marca as variáveis usadas em uma expressão.
     */
    protected marcarVariaveisUsadasEmExpressao(expressao: ConstrutoInterface): void;
    /**
     * Stub para ser sobrescrito por subclasses que implementam análise de interpolações.
     */
    protected verificarInterpolacaoTexto(_texto: string, _literal: Literal): void;
    /**
     * Analisa se todos os caminhos retornam
     * @returns true se todos os caminhos retornam, false caso contrário
     */
    protected todosOsCaminhosRetornam(declaracoes: Declaracao[]): boolean;
    private verificarBlocoRetorna;
    protected verificarSeRetorna(declaracaoSe: Se): boolean;
    private verificarEscolhaRetorna;
    visitarDeclaracaoTextoDocumentacao(declaracao: TextoDocumentacao): Promise<any> | void;
    visitarExpressaoAcessoIntervaloVariavel(expressao: AcessoIntervaloVariavel): Promise<any> | void;
    visitarExpressaoTuplaN(expressao: TuplaN): Promise<any> | void;
    visitarExpressaoComentario(expressao: ComentarioComoConstruto): Promise<any> | void;
    visitarExpressaoSeparador(expressao: Separador): Promise<any> | void;
    adicionarDiagnostico(simbolo: SimboloInterface, mensagem: string, severidade?: DiagnosticoSeveridade, codigoDiagnostico?: string, simboloRelacionado?: SimboloInterface): void;
    visitarExpressaoArgumentoReferenciaFuncao(expressao: ArgumentoReferenciaFuncao): Promise<any> | void;
    visitarExpressaoReferenciaFuncao(expressao: ReferenciaFuncao): Promise<any> | void;
    visitarExpressaoAcessoMetodo(expressao: AcessoMetodo): Promise<any> | void;
    visitarExpressaoAcessoPropriedade(expressao: AcessoPropriedade): Promise<any> | void;
    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any>;
    visitarDeclaracaoClasse(declaracao: Classe): Promise<any>;
    visitarDeclaracaoComentario(declaracao: Comentario): void | Promise<any>;
    visitarDeclaracaoConst(declaracao: Const): Promise<any>;
    visitarDeclaracaoConstMultiplo(declaracao: ConstMultiplo): Promise<any>;
    visitarExpressaoDeAtribuicao(expressao: Atribuir): Promise<any>;
    visitarDeclaracaoDeExpressao(declaracao: Expressao): Promise<any>;
    visitarDeclaracaoDefinicaoFuncao(declaracao: FuncaoDeclaracao): Promise<any>;
    visitarDeclaracaoEnquanto(declaracao: Enquanto): Promise<any>;
    visitarDeclaracaoEscolha(declaracao: Escolha): Promise<any>;
    visitarDeclaracaoEscreva(declaracao: Escreva): Promise<any>;
    visitarDeclaracaoFazer(declaracao: Fazer): Promise<any>;
    visitarDeclaracaoImportar(declaracao: Importar): Promise<any>;
    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any>;
    visitarDeclaracaoPara(declaracao: Para): Promise<any>;
    visitarDeclaracaoParaCada(declaracao: ParaCada): Promise<any>;
    visitarDeclaracaoSe(declaracao: Se): Promise<any>;
    visitarDeclaracaoTendoComo(declaracao: TendoComo): Promise<any>;
    visitarDeclaracaoTente(declaracao: Tente): Promise<any>;
    visitarDeclaracaoVar(declaracao: Var): Promise<any>;
    visitarDeclaracaoVarMultiplo(declaracao: VarMultiplo): Promise<any>;
    visitarExpressaoAcessoIndiceVariavel(expressao: AcessoIndiceVariavel): Promise<any>;
    visitarExpressaoAcessoElementoMatriz(expressao: AcessoElementoMatriz): Promise<any>;
    visitarExpressaoAcessoMetodoOuPropriedade(expressao: AcessoMetodoOuPropriedade): Promise<any>;
    visitarExpressaoAgrupamento(expressao: Agrupamento): Promise<any>;
    visitarExpressaoAtribuicaoPorIndice(expressao: AtribuicaoPorIndice): Promise<any>;
    visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: AtribuicaoPorIndicesMatriz): Promise<any>;
    visitarExpressaoBinaria(expressao: Binario): Promise<any>;
    visitarExpressaoBloco(declaracao: Bloco): Promise<any>;
    visitarExpressaoContinua(declaracao?: Continua): ContinuarQuebra;
    visitarExpressaoDeChamada(expressao: Chamada): Promise<any>;
    visitarExpressaoDefinirValor(expressao: DefinirValor): Promise<any>;
    visitarExpressaoFuncaoConstruto(expressao: FuncaoConstruto): Promise<any>;
    visitarExpressaoDeVariavel(expressao: Variavel | Constante): Promise<any>;
    visitarExpressaoDicionario(expressao: Dicionario): Promise<any>;
    visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<RegExp>;
    visitarDeclaracaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): Promise<any>;
    visitarExpressaoFalhar(expressao: Falhar): Promise<any>;
    visitarExpressaoFimPara(declaracao: FimPara): Promise<any>;
    visitarExpressaoFormatacaoEscrita(declaracao: FormatacaoEscrita): Promise<any>;
    visitarExpressaoIsto(expressao: Isto): Promise<any>;
    visitarExpressaoLeia(expressao: Leia): Promise<any>;
    visitarExpressaoLiteral(expressao: Literal): Promise<any>;
    visitarExpressaoLogica(expressao: Logico): Promise<any>;
    visitarExpressaoRetornar(declaracao: Retorna): Promise<RetornoQuebra>;
    visitarExpressaoSuper(expressao: Super): Promise<any>;
    visitarExpressaoSustar(declaracao?: Sustar): SustarQuebra;
    visitarExpressaoTupla(expressao: Tupla): Promise<any>;
    visitarExpressaoTipoDe(expressao: TipoDe): Promise<any>;
    visitarExpressaoUnaria(expressao: Unario): Promise<any>;
    visitarExpressaoVetor(expressao: Vetor): Promise<any>;
    visitarExpressaoMorsa(expressao: Morsa): Promise<any>;
    visitarExpressaoBote(expressao: Bote): Promise<any>;
}
//# sourceMappingURL=analisador-semantico-base.d.ts.map