Arithmetische Ausdrücke

Iam_Fiction

Mitglied
Hallo, wie kann ich in Java am einfachsten Ausdrücke wie "(4+3)*3" auf Korrektheit überprüfen? Kann ich da über Grammatiken ans Ziel kommen oder welche Möglichkeiten bieten sich mir? Habt ihr eventuell Beispiele oder Links zu dem Thema für mich?

Gruß
 
Java 6 Lösung

Java:
package de.tutorials;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class EvalDemo {

	/**
	 * @param args
	 * @throws  
	 */
	public static void main(String[] args)  {

		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("js");

		// Korrekt
		try {
			System.out.println("Bitte Ausdruck eingeben:");
			engine.eval(reader.readLine());
			System.out.println("Ausdruck ist Ok!");
		} catch (ScriptException e) {
			System.out.println("Ungültiger Ausdruck :" + e.getMessage());
		} catch (IOException e) {
			System.out.println("IO Fehler:" + e.getMessage());
		}

	}

}
 
Hallo,

nur mal so als Spielerei ;-)
Geht auch unter Java 5:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.StringReader;

import javax.xml.xpath.XPathFactory;

import org.xml.sax.InputSource;

/**
 * @author Thomas.Darimont
 * 
 */
public class ExpressionEvalutationExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        System.out.println(XPathFactory.newInstance().newXPath().evaluate(
                "(3+2)*4", new InputSource(new StringReader("<xml/>"))));
    }

}

Gruß Tom
 
Ich muss noch einen draufsetzen:

Java 1.4 Dazu muss man die "js.jar" von der Rhinoseite einbinden.

Java:
package de.tutorials;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.EvaluatorException;
import org.mozilla.javascript.Scriptable;

public class EvalDemo {

	
	public static void main(String[] args) {
		Context context = Context.enter();
		 Scriptable scope = context.initStandardObjects();
		 String ausdruck = "(3 + 4) - 5";
		 try {
			context.evaluateString(scope, ausdruck, "test", 1, null);
			System.out.println("Ausdruck ist ok");
		} catch (EvaluatorException e) {
			System.out.println("Audruck ist fehlerhaft!");
		}


	}

}

Geht gut!
 
Krasse Sache :) Welche Scripting language kommt hier zum Einsatz? (Javascript?!) Hat js build-in einen Parser für arithmetische Ausdrücke? Werden alle korrekten Infix Ausdrücke erkannt? Ich brauche das für eine Art Compiler ;)
 
Zuletzt bearbeitet:
Meine Beispiele arbeiten mit javascript, Tom benutzt XPATH. XPATH ist da nicht so mächtig wie Scriptsprachen, erfüllt aber Deine ursprüngliche Anforderung. Grundsätzlich kannst Du mit verschieden Scriptsprachen arbeiten.

In meinem ersten Beispiel wird mit

ScriptEngine engine = manager.getEngineByName("js");

Javascript als Sprache festgelegt. "eval" führt den Scriptcode aus. Kommt es dabei zu einem Fehler, fliegt eine Exception. Das ist der Trick. Das Parsen ist also nur ein Nebeneffekt, im Prinzip kannst Du komplette Skripte laufen lassen.

In meinem zweiten Beispiel habe ich die JavaScript.jar von Rhino verwendet. Das ist das selbe in grün. Statt Eval, heisst die Funktion EvalString. Das deutet schon an, dass es auch einen EvalReader gibt, der ein Script aus einer Datei ausliest und ausführt.

Gruss
 
Zurück