Como funciona a avaliação de expressões na prática
Avaliar uma expressão matemática ou lógica parece simples até você precisar fazer isso em código. O problema não é entender que 2 + 3 × 4 é 14. O problema é fazer um programa entender isso sem depender de construções perigosas como eval(). A expressão é igual a qual resultado depende inteiramente de como você estrutura o parser e a árvore de avaliação. Na minha experiência, a maioria dos desenvolvedores começa com regex para extrair números e operadores. Isso funciona até você se deparar com parênteses aninhados ou operações unárias como -5 + 3. Nesse ponto o código quebra silenciosamente e você perde horas caçando bugs. A solução correta passa por construir um parser recursivo ou usar o algoritmo do shunting-yard para converter a notação infixa em pós-fixa (RPN) antes de avaliar.
Implementação prática em Python
Vou mostrar uma implementação robusta que evita os problemas mais comuns. Não vou simplificar arbitrariamente — o código abaixo trata parênteses aninhados, precedência de operadores, números negativos e casas decimais. O algoritmo usa duas pilhas: uma para operandos e outra para operadores. Quando encontra um parêntese de abertura, inicia um sub-problema recursivo. Ao encontrar um parêntese de fechamento, avalia tudo até o parêntese correspondente. Operadores com maior precedência são processados antes dos de menor precedência, o que resolve o clássico erro de 2 + 3 × 4.
👉 Clique no botão abaixo para saber mais sobre o assunto!
O problema que ninguém conta sobre precisão float
Uma armadilha frequente é confiar no resultado direto do eval ou de operadores de ponto flutuante. 0.1 + 0.2 não é exatamente 0.3 em binário floating point. Eu passei uma semana rastreando um bug em um sistema de cálculos financeiros onde o resultado final estava com diferença de 0.00000000000000002. A correção foi usar a biblioteca decimal do Python com precisão configurada, em vez de floats nativos. Isso adiciona uma leve sobrecarga de performance, mas elimina erros de arredondamento cumulativo.
Dica técnica sobre validação de entrada
Sempre valide a expressão antes de avaliá-la. Deixe o parser retornar um erro claro quando encontrar caracteres inválidos ou parênteses desbalanceados. Um erro como "parêntese não fechado na posição 23" é muito mais útil do que um crash genérico. Eu costumava deixar expressões malformadas caírem e gerar stack traces enormes nos logs. A partir do momento em que adicionei validação com mensagens específicas, o volume de tickets de suporte caiu quase pela metade.
Quando não usar um evaluator caseiro
Se você precisa avaliar expressões em produção com recursos avançados — funções trigonométricas, variáveis dinâmicas, suporte a notação científica — considere bibliotecas consolidadas como simpleeval ou asteval em Python. Elas lidam com edge cases que você não vai lembrar de cobrir na sua primeira versão. Um evaluator caseiro é aceitável para projetos internos com escopo bem definido, mas não para sistemas que precisam rodar 24 horas por dia com entradas imprevisíveis. A parte mais importante que os tutoriais ignoram é o teste. Cubra casos extremos: expressões vazias, operadores duplicados, números muito grandes, parênteses aninhados profundamente. Sem testes adequados, seu evaluator vai funcionar no exemplo do tutorial e falhar exatamente quando alguém passar algo inesperado.