En el método main de ejemplo se crea una función que calcula el área de un círculo utilizando el valor de PI:
import java.util.*; import java.util.regex.*; import java.lang.reflect.*; public class Expresion { enum TipoToken { NUMERO, VARIABLE, FUNCION, ADD, SUB, MUL, DIV, EXP, P_IZQ, P_DER, ERROR }; class Token { TipoToken tipo; String texto; Token(TipoToken ti, String te) { tipo=ti; texto=te;} Token(TipoToken ti) { tipo = ti; } } Queue<Token> colaTokens; String cadenaFuncion; double variableX; Expresion(String c) throws Exception { cadenaFuncion = c; } private void generarTokens() throws Exception { colaTokens = new LinkedList<Token>(); StringBuffer entrada = new StringBuffer(cadenaFuncion); Pattern pNumero = Pattern.compile("\\-?\\d+(\\.\\d+)?"); Pattern pID = Pattern.compile("\\p{Alpha}\\w+"); Pattern pFuncion= Pattern.compile("\\p{Alpha}\\w+\\s+\\("); while(entrada.length()>0) { Matcher m = pNumero.matcher(entrada); if(m.lookingAt()) { colaTokens.add(new Token(TipoToken.NUMERO,m.group())); entrada.delete(0, m.end()); continue; } if(entrada.charAt(0) == 'x' || entrada.charAt(0) == 'X') { colaTokens.add(new Token(TipoToken.VARIABLE,"x")); entrada.deleteCharAt(0); continue; } if(entrada.charAt(0) == '+') { colaTokens.add(new Token(TipoToken.ADD)); entrada.deleteCharAt(0); continue; } if(entrada.charAt(0) == '-') { colaTokens.add(new Token(TipoToken.SUB)); entrada.deleteCharAt(0); continue; } if(entrada.charAt(0) == '*') { colaTokens.add(new Token(TipoToken.MUL)); entrada.deleteCharAt(0); continue; } if(entrada.charAt(0) == '/') { colaTokens.add(new Token(TipoToken.DIV)); entrada.deleteCharAt(0); continue; } if(entrada.charAt(0) == '(') { colaTokens.add(new Token(TipoToken.P_IZQ)); entrada.deleteCharAt(0); continue; } if(entrada.charAt(0) == ')') { colaTokens.add(new Token(TipoToken.P_DER)); entrada.deleteCharAt(0); continue; } if(entrada.charAt(0) == '^') { colaTokens.add(new Token(TipoToken.EXP)); entrada.deleteCharAt(0); continue; } m = pFuncion.matcher(entrada); if(m.lookingAt()) { String cadena = m.group(); cadena = cadena.split("\\s+\\(")[0].trim(); colaTokens.add(new Token(TipoToken.FUNCION, cadena)); continue; } m = pID.matcher(entrada); if(m.lookingAt()) { colaTokens.add(new Token(TipoToken.VARIABLE, m.group())); entrada.delete(0, m.end()); continue; } throw new Exception("Elemento no reconocido en la entrada: " + entrada.charAt(0)); } } private double evaluar(double x) throws Exception { generarTokens(); variableX = x; return expresion(); } private double expresion() { double respuesta=termino(); while(!colaTokens.isEmpty() ) { switch(colaTokens.element().tipo) { case ADD: colaTokens.remove(); respuesta+=termino(); continue; case SUB: colaTokens.remove(); respuesta-=termino(); continue; } break; } return respuesta; } private double termino() { double respuesta=factor(); while(!colaTokens.isEmpty() ) { switch(colaTokens.element().tipo) { case MUL: colaTokens.remove(); respuesta*=factor(); continue; case DIV: colaTokens.remove(); respuesta/=factor(); continue; default: } break; } return respuesta; } private double factor() { double respuesta=valor(); while(!colaTokens.isEmpty() ) { switch(colaTokens.element().tipo) { case EXP: colaTokens.remove(); respuesta=Math.pow(respuesta,valor()); continue; } break; } return respuesta; } private double valor() { Token token; try { double respuesta = 0; token = colaTokens.poll(); switch(token.tipo) { case P_IZQ: respuesta = expresion(); leaToken(TipoToken.P_DER); return respuesta; case NUMERO: return Double.parseDouble(token.texto); case VARIABLE: if(token.texto.toLowerCase().equals("x")) { return variableX; } Field f = java.lang.Math.class. getField(token.texto); return f.getDouble(null); case FUNCION: double argumento=expresion(); leaToken(TipoToken.P_DER); Method m = java.lang.Math.class. getMethod(token.texto, Double.TYPE); return (Double) m.invoke(null, argumento); } return respuesta; } catch(Exception ex) { System.err.println("Error: " + ex.getMessage()); System.exit(0); } return 0; } private boolean leaToken(TipoToken t) { Token token = colaTokens.poll(); if(token.tipo.equals(t)) { return true; } else { System.err.println("Error: elemento no permitido " + token.texto ); return false; } } public static void main(String[] args) throws Exception { String funcion = "PI*x^2" ; Expresion exp = new Expresion(funcion); for(int x=0; x<=10; x++) { System.out.println(x + " -> " + exp.evaluar(x)); } } }
yeezy
ResponderBorraradidas yeezy
jordan 1 off white
golden goose
coach outlet
coach
air max 97
golden goose francy
yeezy shoes
calvin klein outlet
xiaofang20191218