Expressão matemática em uma string

Olá pessoal,

Estou no início da programação, esses dias estava tentando desenvolver uma calculadora em Java, porém com a funcionalidade de realizar múltiplas operações. Por exemplo: 3+5*2.
Entretanto não consegui pensar em algum algoritmo que quebrasse essa string e realizasse as operações.
Fui procurar como poderia fazer isso e descobri que existem interpretadores que podem realizar isso, mas não faco ideia de como funcionam e como implementá-los no Java.

Obrigado desde já.

Importante você ter o embasamento de lógica, linguagens formais e compiladores pra implementar um parser desses.
Uma das formas de implementar é utilizando um parser descendente recursivo.

Encontrei uma solução que utiliza uma própria biblioteca do Java, mas não entendi como ela funciona. Segue o código:

package testedeconversao;
import javax.script.*;
public class TesteDeConversao {

    public static void main(String[] args) throws ScriptException {
        
        ScriptEngineManager factory = new ScriptEngineManager();
        // create a JavaScript engine
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        // evaluate JavaScript code from String
        String expressao = "1+2";
        Object obj = engine.eval(expressao);
        System.out.println( obj );
    }
}

Se alguém puder explicar como isso funciona, agradeço.

Essa implementação utiliza uma Engine que já está no Java, você teria que analisar o código dela pra saber como ela funciona. Pelo que sei tem outras bibliotecas open source que fazem isso, você pode analisar o código.

Como o @staroski disse, fazer isso não é algo trivial, principalmente se você quiser avançar fazendo coisas como “(3+(5*3))/2” e “7+(3^9) / squareRoot(144)” , etc…

Mas se você estiver mesmo determinado a implementar isso, recomendo fazer usando TDD, de forma incremental. Mas como você disse que está no início,. pode não ser uma boa ideia se lançar a fazer uma coisa dessas.

Se você só quer fazer coisas simples como “3+5*2”, sem parênteses, calculando tudo na ordem que aparece (esquerda para direita), apenas com operadores +-/*, então fica bem mais fácil. Deve dá pra fazer com um método recursivo, que recebe a expressão, a simplifica resolvendo uma parte dela, e envia a ele mesmo ela simplificada. Aí ele vai simplificando até terminar de resolvê-la.