import { AcessoElementoMatriz, AcessoIndiceVariavel, AcessoIntervaloVariavel, AcessoMetodo, AcessoMetodoOuPropriedade, AcessoPropriedade, Agrupamento, ArgumentoReferenciaFuncao, AtribuicaoPorIndice, AtribuicaoPorIndicesMatriz, Atribuir, Binario, Chamada, ComentarioComoConstruto, Constante, DefinirValor, Dicionario, ExpressaoRegular, FimPara, FormatacaoEscrita, FuncaoConstruto, Isto, Leia, Literal, Logico, ReferenciaFuncao, Separador, Super, TipoDe, Tupla, TuplaN, Unario, Variavel, Vetor } from '../construtos';
import { Bloco, CabecalhoPrograma, Classe, Comentario, Const, ConstMultiplo, Continua, Declaracao, Enquanto, Escolha, Escreva, EscrevaMesmaLinha, Expressao, Falhar, Fazer, FuncaoDeclaracao, InicioAlgoritmo, Para, ParaCada, Retorna, Se, Sustar, TendoComo, Tente, TextoDocumentacao, Var, VarMultiplo } from '../declaracoes';
import { ContinuarQuebra, SustarQuebra } from '../quebras';
import { TradutorInterface, VisitanteComumInterface } from '../interfaces';
import { SimboloInterface } from '../interfaces/simbolo-interface';
/**
 * Tradutor que converte código Delégua para Elixir.
 *
 * Elixir é uma linguagem funcional, então algumas conversões são necessárias:
 * - Classes → Módulos com structs
 * - Métodos → Funções que recebem structs como primeiro parâmetro
 * - Loops imperativos → Funções recursivas ou Enum.each
 * - Variables → Bindings imutáveis
 */
export declare class TradutorElixir implements TradutorInterface<Declaracao>, VisitanteComumInterface {
    indentacaoAtual: number;
    moduloAtual: string | null;
    modulosConhecidos: Set<string>;
    funcoesConhecidas: Set<string>;
    atributosModulo: Map<string, string>;
    dentroDeMetodo: boolean;
    nomeParametroStruct: string | null;
    contadorVariavelTemporaria: number;
    constructor();
    /**
     * Adiciona a indentação atual (Elixir usa 2 espaços por convenção)
     */
    protected adicionarIndentacao(): string;
    /**
     * Aumenta o nível de indentação em 2 espaços
     */
    protected aumentarIndentacao(): void;
    /**
     * Diminui o nível de indentação em 2 espaços
     */
    protected diminuirIndentacao(): void;
    /**
     * Converte identificadores de camelCase para snake_case (convenção Elixir)
     */
    protected converterIdentificador(nome: string): string;
    /**
     * Converte nomes de classes/módulos, preservando PascalCase
     */
    protected converterNomeModulo(nome: string): string;
    /**
     * Gera nome único para variável temporária
     */
    protected gerarVariavelTemporaria(): string;
    /**
     * Mapeia operadores Delégua para Elixir
     */
    protected traduzirOperador(simbolo: SimboloInterface): string;
    /**
     * Ponto de entrada para tradução
     */
    traduzir(declaracoes: Declaracao[]): Promise<string>;
    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> | void;
    visitarDeclaracaoClasse(declaracao: Classe): Promise<string>;
    /**
     * Extrai nomes de campos do struct a partir do construtor da classe
     */
    protected extrairCamposStruct(declaracao: Classe): Promise<string[]>;
    /**
     * Extrai campos de uma declaração recursivamente
     */
    protected extrairCamposDeDeclaracao(declaracao: any, campos: Set<string>): void;
    /**
     * Traduz um método de classe para função de módulo
     */
    protected traduzirMetodoClasse(metodo: FuncaoDeclaracao, nomeModulo: string): Promise<string>;
    /**
     * Extrai inicializações de struct do corpo do construtor
     */
    protected extrairInicializacoesStruct(corpo: any[], nomeModulo: string): Promise<string>;
    visitarDeclaracaoComentario(declaracao: Comentario): Promise<string>;
    visitarDeclaracaoConst(declaracao: Const): Promise<string>;
    visitarDeclaracaoConstMultiplo(declaracao: ConstMultiplo): Promise<any> | void;
    visitarDeclaracaoDeExpressao(declaracao: Expressao): Promise<string>;
    visitarDeclaracaoDefinicaoFuncao(declaracao: FuncaoDeclaracao): Promise<string>;
    visitarDeclaracaoEnquanto(declaracao: Enquanto): Promise<string>;
    visitarDeclaracaoEscolha(declaracao: Escolha): Promise<string>;
    visitarDeclaracaoEscreva(declaracao: Escreva): Promise<string>;
    visitarDeclaracaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): Promise<any> | void;
    visitarDeclaracaoFazer(declaracao: Fazer): Promise<string>;
    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> | void;
    visitarDeclaracaoPara(declaracao: Para): Promise<string>;
    visitarDeclaracaoParaCada(declaracao: ParaCada): Promise<string>;
    visitarDeclaracaoSe(declaracao: Se): Promise<string>;
    visitarDeclaracaoTendoComo(declaracao: TendoComo): Promise<string>;
    visitarDeclaracaoTente(declaracao: Tente): Promise<any> | void;
    visitarDeclaracaoTextoDocumentacao(declaracao: TextoDocumentacao): Promise<any> | void;
    visitarDeclaracaoVar(declaracao: Var): Promise<string>;
    visitarDeclaracaoVarMultiplo(declaracao: VarMultiplo): Promise<any> | void;
    visitarExpressaoDeAtribuicao(expressao: Atribuir): Promise<string>;
    visitarExpressaoAcessoIndiceVariavel(expressao: AcessoIndiceVariavel): Promise<string>;
    visitarExpressaoAcessoIntervaloVariavel(expressao: AcessoIntervaloVariavel): Promise<any> | void;
    visitarExpressaoAcessoElementoMatriz(expressao: AcessoElementoMatriz): Promise<any> | void;
    visitarExpressaoAcessoMetodo(expressao: AcessoMetodo): Promise<string>;
    /**
     * Mapeia métodos built-in de Delégua para Elixir
     */
    protected mapearMetodoBuiltIn(metodo: string, objeto: string, argumentos: string[]): string | null;
    /**
     * Tenta extrair o nome do módulo de uma expressão de objeto
     */
    protected obterNomeModulo(objetoStr: string): string;
    visitarExpressaoAcessoMetodoOuPropriedade(expressao: AcessoMetodoOuPropriedade): Promise<string>;
    visitarExpressaoAcessoPropriedade(expressao: AcessoPropriedade): Promise<string>;
    visitarExpressaoAgrupamento(expressao: Agrupamento): Promise<string>;
    visitarExpressaoArgumentoReferenciaFuncao(expressao: ArgumentoReferenciaFuncao): Promise<any> | void;
    visitarExpressaoAtribuicaoPorIndice(expressao: AtribuicaoPorIndice): Promise<any> | void;
    visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: AtribuicaoPorIndicesMatriz): Promise<any> | void;
    visitarExpressaoBinaria(expressao: Binario): Promise<string>;
    visitarExpressaoBloco(declaracao: Bloco): Promise<string>;
    visitarExpressaoComentario(expressao: ComentarioComoConstruto): Promise<any> | void;
    visitarExpressaoContinua(declaracao?: Continua): ContinuarQuebra;
    visitarExpressaoDeChamada(expressao: Chamada): Promise<string>;
    visitarExpressaoDefinirValor(expressao: DefinirValor): Promise<any> | void;
    visitarExpressaoFuncaoConstruto(expressao: FuncaoConstruto): Promise<string>;
    visitarExpressaoDeVariavel(expressao: Variavel | Constante): Promise<string>;
    visitarExpressaoDicionario(expressao: Dicionario): Promise<string>;
    visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<RegExp> | void;
    visitarExpressaoFalhar(expressao: Falhar): Promise<any> | void;
    visitarExpressaoFimPara(declaracao: FimPara): Promise<any> | void;
    visitarExpressaoFormatacaoEscrita(declaracao: FormatacaoEscrita): Promise<any> | void;
    visitarExpressaoIsto(expressao: Isto): Promise<string>;
    visitarExpressaoLeia(expressao: Leia): Promise<string>;
    visitarExpressaoLiteral(expressao: Literal): Promise<string>;
    visitarExpressaoLogica(expressao: Logico): Promise<string>;
    visitarExpressaoReferenciaFuncao(expressao: ReferenciaFuncao): Promise<any> | void;
    visitarExpressaoRetornar(expressao: Retorna): Promise<string>;
    visitarExpressaoSeparador(expressao: Separador): Promise<any> | void;
    visitarExpressaoSuper(expressao: Super): Promise<any> | void;
    visitarExpressaoSustar(declaracao?: Sustar): SustarQuebra | void;
    visitarExpressaoTupla(expressao: Tupla): Promise<string>;
    visitarExpressaoTuplaN(expressao: TuplaN): Promise<string>;
    visitarExpressaoTipoDe(expressao: TipoDe): Promise<any> | void;
    visitarExpressaoUnaria(expressao: Unario): Promise<string>;
    visitarExpressaoVetor(expressao: Vetor): Promise<string>;
}
//# sourceMappingURL=tradutor-elixir.d.ts.map