Hier finden sich zusätzliche Java Programme ohne weiteren Kommentar.
Beispiel:
public class Node {
}
Beispiel:
public class Oper extends Node {
final String text;
protected int art = -1;
public Oper(String text) {
this.text = text.trim();
if ( this.text == "*" ) {
art = 1;
}
if ( this.text == "+" ) {
art = 2;
}
if ( this.text == "-" ) {
art = 3;
}
}
public String toString() {
return "oper[" + text + "," + art + "]";
}
}
Beispiel:
public class Leaf extends Node {
final String text;
public Leaf(String text) {
this.text = text;
}
public String toString() {
return "leaf[" + text + "]";
}
}
Beispiel:
public class Expr extends Node {
final Node left;
final Oper oper;
final Node right;
public Expr() {
this.left = null;
this.oper = null;
this.right = null;
}
public Expr(Node left, Oper oper, Node right) {
this.left = left;
this.oper = oper;
this.right = right;
}
public String toString() {
return "expr[" + left + " " + oper + " " + right + "]";
}
}
Beispiel:
public class Ausdruck {
Klammern k = new Klammern();
public Expr expression(String[] parts) {
Node left = new Leaf(parts[0]);
Oper oper = new Oper(parts[1]);
Node right = new Leaf(parts[2]);
return new Expr(left,oper,right);
}
public Expr extract(String text) {
if ( text == null || text.length() == 0 ) {
System.out.println("no text");
return new Expr();
}
int i = text.indexOf("(");
if ( i < 0 ) {
String[] parts = k.operator( text );
k.print( parts );
return expression(parts);
}
String links = text.substring(0,i).trim();
String[] parts = null;
if ( links.length() > 0 ) {
parts = k.operator( links );
k.print( parts );
}
text = text.substring(i).trim();
int level = 1;
for ( i = 1 ; i < text.length(); i++ ) {
char c = text.charAt(i);
if ( c == '(' ) {
level++;
}
if ( c == ')' ) {
level--;
}
if ( level == 0 ) {
break;
}
}
String innen = text.substring(1,i).trim();
Expr inexpr = extract(innen);
Expr rexpr = null;
if ( i+1 < text.length() ) {
String rest = text.substring(i+1).trim();
rexpr = extract(rest);
}
Expr result = null;
if ( parts != null ) {
Node left = new Leaf(parts[0]);
Oper oper = new Oper(parts[1]);
// parts[2] == "";
result = new Expr(left,oper,inexpr);
} else {
result = inexpr;
}
if ( rexpr != null ) { // rexpr.left == ""
result = new Expr(result,rexpr.oper,rexpr.right);
}
return result;
}
public int evaluate(Node n) {
if ( n == null ) {
return 0;
}
int r = 0;
if ( n instanceof Oper ) {
System.out.println("oper nur alleine = " + n);
return r;
}
if ( n instanceof Leaf ) {
try {
Leaf l = (Leaf)n;
r = Integer.parseInt( l.text );
} catch( NumberFormatException e ) {
System.out.println("keine Zahl = " + n);
}
return r;
}
if ( n instanceof Expr ) {
Expr e = (Expr)n;
int el = evaluate(e.left);
int er = evaluate(e.right);
switch ( e.oper.art ) {
case 1: r = el * er;
break;
case 2: r = el + er;
break;
case 3: r = el - er;
break;
default:
}
return r;
}
System.out.println("unbekannter Ausdruck = " + n);
return r;
}
public static void main(String[] args) {
Ausdruck k = new Ausdruck();
String s = "(3-4)*(7+2)";
Expr r;
r = k.extract("2*3");
System.out.println("r = " + r);
System.out.println("eval(r) = " + k.evaluate(r));
r = k.extract("2*(1+3)+5");
System.out.println("r = " + r);
System.out.println("eval(r) = " + k.evaluate(r));
r = k.extract("(3-4)*(7+2)");
System.out.println("r = " + r);
System.out.println("eval(r) = " + k.evaluate(r));
r = k.extract("(4*(7+2))+5");
System.out.println("r = " + r);
System.out.println("eval(r) = " + k.evaluate(r));
r = k.extract("(4*(7+2))+(5-(8*6))");
System.out.println("r = " + r);
System.out.println("eval(r) = " + k.evaluate(r));
r = k.extract("2*(3*4)");
System.out.println("r = " + r);
System.out.println("eval(r) = " + k.evaluate(r));
}
}