# Arithmetische Ausdrücke



## Iam_Fiction (10. Juni 2007)

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ß


----------



## limago (10. Juni 2007)

Was Du suchst ist eine Eval-Funktion, oder ähnliches.

schau dazu hier:

http://mindprod.com/jgloss/eval.html

oder wenn Du Java 6 hast, kannst Du Scripting-Engines nutzen:

siehe z.B. hier

http://www.onjava.com/pub/a/onjava/2006/04/26/mustang-meets-rhino-java-se-6-scripting.html

Gruss


----------



## limago (10. Juni 2007)

Java 6 Lösung


```
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());
		}

	}

}
```


----------



## Thomas Darimont (10. Juni 2007)

Hallo,

nur mal so als Spielerei ;-)
Geht auch unter Java 5:

```
/**
 * 
 */
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


----------



## limago (10. Juni 2007)

Ich muss noch einen draufsetzen:

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


```
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!


----------



## Thomas Darimont (10. Juni 2007)

Hallo,

"JDK" fremde Bibliotheken einsetzen zählt nicht ;-)

Gruß Tom


----------



## limago (10. Juni 2007)

Lol! Ich werde es mir merken....


----------



## Iam_Fiction (11. Juni 2007)

Vielen Dank für eure Antworten werde es gleich mal testen


----------



## Iam_Fiction (11. Juni 2007)

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


----------



## limago (11. Juni 2007)

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


----------



## Iam_Fiction (11. Juni 2007)

Vielen Dank für deine Antwort  Wo finde ich eine genauere Beschreibung der beiden Bibliotheken bezüglich meines Anwendungsbereichs, weil mir ein eingeschränkter Parser sogar entgegen kommen würde, da ich die Ausdrücke mit Stacks  selbst evaluieren soll und zudem keine vorzeichen, etc gefordert sind. Denke aber sowohl XPath als auch die Script Lgs beherrschen komplette arithm. Ausdrücke?!


----------



## limago (11. Juni 2007)

Xpath ist sehr eingeschränkt, aber aufgepasst, die 5 Grundrechnenarten sind

+ PLUs
- Minus
* Mal
div Geteilt
mod Modulo

also 3 mal 5 durch 3 wäre in XPATH 3 * 5 div 3

Das hat Tom unterschlagen  (Seitenhieb)

Doku von XPATH in Selfhtml http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm oder besser  http://www.obqo.de/w3c-trans/xpath-de-20020226 

Gruss


----------



## Thomas Darimont (11. Juni 2007)

Hallo,



> Xpath ist sehr eingeschränkt, aber aufgepasst, die 5 Grundrechnenarten sind
> 
> + PLUs
> - Minus
> ...


Ach was ... die Fuktionalität war nicht explizit Spezifiziert, insofern passt das schon ;-)

Gruß Tom


----------



## Iam_Fiction (11. Juni 2007)

Vielen Dank für die ausführlichen Antworten


----------

