estoy tratando de escribir una función de evaluación de cuerdas es decirfunción de evaluación de escritura cadena
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + -/and *
Mi inicial, aunque era utilizar expresiones regulares para recoger los operadores y dígitos, ya que pueden ser emparejados. Y que después de encontrar esa información, de alguna manera encuentre una manera de priorizar los operadores /*
ove -+
.
Así es como empecé:
static String regex = "([\\+\\*-/])+";
static String digitRegex = "(\\d)+";
public static void main(String[] args) {
System.out.println(getOperators("4 + 1 * 3"));
}
public static List<String> getOperators(String input) {
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(input);
List<String> operatorList = new ArrayList<String>();
int count = 0;
while (matcher.find()){
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
operatorList.add(matcher.group(count));
count++;
}
}
return operatorList;
}
Ahora puedo escribir otro método para extraer los dígitos utilizando la misma lógica.
public static List<Integer> getDigits(String input) {
Pattern p = Pattern.compile(digitRegex);
Matcher matcher = p.matcher(input);
List<Integer> digitList = new ArrayList<Integer>();
int count = 0;
while (matcher.find()) {
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
digitList.add(Integer.valueOf(matcher.group(count)));
count++;
}
}
return digitList;
}
Ahora es la parte donde estoy atascado. # 1 Este método anterior falla en el tercer ejemplo:
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
Y esto # 2 Incluso si trato ejemplos anteriores, no puedo imaginar que encontrar la manera de ponerlos en el orden correcto.
Estoy en el camino correcto, ¿Alguien tiene algún consejo útil por favor comparta?
Esta es una [precedencia de los operadores] (http: // en.wikipedia.org/wiki/Order_of_operations) problema. En un analizador de bajadas recursivo, simplemente desciende de los operadores de menor precedencia a las precedencias más altas, y usa el operador entre paréntesis para saltar de regreso a la parte superior. –
Espero que esto ayude: http://en.wikipedia.org/wiki/Recursive_descent_parser – sarnold
la expresión 'evaluate (" 4 + 1 * 3 ");' DEBERÍA devolver 7.si quisieras que regresara 15 deberías haber escrito 'evaluate (" (4 + 1) * 3 "); ' – alfasin