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.