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