"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Binario = void 0;
/**
 * Binário é uma estrutura com um operador e dois operandos: esquerda e direita.
 * Implementa as seguintes operações para Delégua e todos os dialetos:
 *
 * - `+` (Adição);
 * - `-` (Subtração);
 * - `*` (Multiplicação);
 * - `/` (Divisão);
 * - `%` (Módulo);
 *
 * Algumas outras operações podem ser suportadas de dialeto para dialeto,
 * como por exemplo:
 *
 * - `+=` (Adição com Atribuição);
 * - `-=` (Subtração com Atribuição);
 * - `*=` (Multiplicação com Atribuição);
 * - `/=` (Divisão com Atribuição);
 * - `%=` (Módulo com Atribuição);
 * - `**` (Exponenciação);
 * - `::` (Concatenação);
 * - `\` (Divisão inteira).
 */
class Binario {
    constructor(hashArquivo, esquerda, operador, direita) {
        this.tipo = 'qualquer';
        this.linha = esquerda.linha;
        this.hashArquivo = hashArquivo;
        this.esquerda = esquerda;
        this.operador = operador;
        this.direita = direita;
        this.tipo = this.deduzirTipo();
    }
    /**
     * Dedução otimista de tipos para expressões binárias.
     * @returns O tipo deduzido.
     */
    deduzirTipo() {
        if (['logico', 'lógico'].includes(this.esquerda.tipo) ||
            ['logico', 'lógico'].includes(this.direita.tipo)) {
            return 'lógico';
        }
        if (this.esquerda.tipo === 'texto' ||
            this.direita.tipo === 'texto') {
            return 'texto';
        }
        if (['numero', 'número'].includes(this.esquerda.tipo) ||
            ['numero', 'número'].includes(this.direita.tipo)) {
            return 'número';
        }
        if (this.esquerda.tipo === this.direita.tipo) {
            return this.esquerda.tipo;
        }
        return 'qualquer';
    }
    async aceitar(visitante) {
        return await visitante.visitarExpressaoBinaria(this);
    }
    paraTexto() {
        return (`<binário esquerda=${this.esquerda.paraTexto()} operador=${this.operador.lexema} ` +
            `direita=${this.direita.paraTexto()} ` +
            `tipo=${this.tipo} ` +
            `/>`);
    }
    paraTextoSaida() {
        throw new Error('Método não implementado.');
    }
}
exports.Binario = Binario;
//# sourceMappingURL=binario.js.map