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