Also um alles mal zu verdeutlichen
hier ist unser Aufgabentext
http://stl-www.htw-saarland.de/fach/ss12-ps2/u17.pdf
Das läuft auch alles soweit aufgabenkonform, d.h. wir haben ne hashtable, wir haben nen parser, usw...
problem ist halt nur, dass ich bisher nur strings der Form "a * ( b + c )" verarbeiten kann, sprich die einzelnen operatoren bzw operanten müssen durch ein leerzeichen getrennt sein, damit der parser das verarbeitet, ich will aber den eingelesenen String so splitten, dass der parser eben auch die Form"a*(b+c)" akzeptiert...dies versuch ich momentan zu implementieren und bekomm es irgendwie nicht hin, ich kann hier schlecht den gesamten Quellcode des Programms posten, das würde den Rahmen sprengen.
Momentan ist es so, dass wir eine Klasse haben, die eine datei einliesst und Aufgabenkonform entsprechend die Deklarationsblöcke auf die einzelnen Programmteile verteilt.
Im Falle des Parsers ist es nun so, dass der String eingelesen wird und an den Parser übergeben wird.von diesem wird der String dann entsprechend gesplittet.
Hier mal der entsprechende Quelltext des Parsers
[JAVA=42]
import java.util.*;
/**
* Write a description of class Parser here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Parser implements ParserInterface
{
private Stack<ExTreeNode> opndStack;
private Stack<Operator> optStack;
public Parser()
{
opndStack = new Stack();
optStack = new Stack();
}
public ExpressionTreeInterface parse(String eingabeString,SymbolTabelleInterface tabelle)
{
String[] eingabeArray = eingabeString.split("\\s+");
for (int i = 0; i < eingabeArray.length;i++)
{
String eingabeElement = eingabeArray
;
switch (eingabeElement.charAt(0))
{
case '(' :
KlammerAuf klammerAuf = new KlammerAuf();
optStack.push(klammerAuf);
break;
case ')' :
KlammerZu klammerZu = new KlammerZu();
bearbeiteKlammerZu(klammerZu);
break;
case '+' :
Plus plus = new Plus();
bearbeiteOpt(plus);
break;
case '-' :
Minus minus = new Minus();
bearbeiteOpt(minus);
break;
case '*' :
Mal mal = new Mal();
bearbeiteOpt(mal);
break;
case '/' :
Durch durch = new Durch();
bearbeiteOpt(durch);
break;
default : //Irgendein String der kein Operator ist -> Operand
Operand opd = new Operand(eingabeElement);
try
{
bearbeiteOpd(opd,tabelle);
}
catch (Exception e)
{
System.out.println("Operand " + opd + " nicht in Tabelle; beende Programm");
System.exit(-1);
}
break;
}
}
ExTreeNode root;
while (!optStack.empty())
{
Operator opt = optStack.pop();
ExTreeNode right = opndStack.pop();
ExTreeNode left = opndStack.pop();
ExTreeNode optNode = new OptNode(opt,left,right);
opndStack.push(optNode);
}
root = opndStack.pop();
ExpressionTreeInterface tree = new ExpressionTree(root);
System.out.println(tree);
return tree;
}
private void bearbeiteOpd(Operand opd,SymbolTabelleInterface tabelle) throws Exception
{
String name = opd.getName();
if (!tabelle.exists(name)) throw new Exception("Nicht in Tabelle");
OpdNode opdNode = new OpdNode(opd);
opndStack.push(opdNode);
//Kreiere opnd-Knoten, push Knotenpointer auf opndStack
}
private void bearbeiteKlammerZu(KlammerZu klammerZu)
{
while (!optStack.empty())
{
Operator optTop = optStack.pop();
if (optTop instanceof KlammerAuf)
{
break;
}
else
{
ExTreeNode right = opndStack.pop();
ExTreeNode left = opndStack.pop();
ExTreeNode optTopNode = new OptNode(optTop,left,right);
opndStack.push(optTopNode);
}
}
}
private void bearbeiteOpt (Operator opThis)
{
if (optStack.empty())
{
optStack.push(opThis);
}
else
{
while (!optStack.empty())
{
Operator opTop = optStack.pop();
if (opTop instanceof KlammerAuf)
{
optStack.push(opTop);
}
else
{
if (opTop.compareTo(opThis) < 0)
{
optStack.push(opTop);
}
else
{
ExTreeNode right = opndStack.pop();
ExTreeNode left = opndStack.pop();
ExTreeNode optTopNode = new OptNode(opTop,left,right);
opndStack.push(optTopNode);
}
}
if ((opTop instanceof KlammerAuf) || (opTop.compareTo(opThis) < 0))
{
break;
}
}
optStack.push(opThis);
}
}
}
[/code]
Das Problem beschränkt sich auf folgenden QuellcodeTeil
[JAVA=42]
public ExpressionTreeInterface parse(String eingabeString,SymbolTabelleInterface tabelle)
{
String[] eingabeArray = eingabeString.split("\\s+");
for (int i = 0; i < eingabeArray.length;i++)
{
String eingabeElement = eingabeArray;
switch (eingabeElement.charAt(0))
{
case '(' :
KlammerAuf klammerAuf = new KlammerAuf();
optStack.push(klammerAuf);
break;
case ')' :
KlammerZu klammerZu = new KlammerZu();
bearbeiteKlammerZu(klammerZu);
break;
case '+' :
Plus plus = new Plus();
bearbeiteOpt(plus);
break;
case '-' :
Minus minus = new Minus();
bearbeiteOpt(minus);
break;
case '*' :
Mal mal = new Mal();
bearbeiteOpt(mal);
break;
case '/' :
Durch durch = new Durch();
bearbeiteOpt(durch);
break;
default : //Irgendein String der kein Operator ist -> Operand
Operand opd = new Operand(eingabeElement);
try
{
bearbeiteOpd(opd,tabelle);
}
catch (Exception e)
{
System.out.println("Operand " + opd + " nicht in Tabelle; beende Programm");
System.exit(-1);
}
break;
}
}
[/code]
Zur Verdeutlichung hier noch die MainShellKlasse mit deren Hilfe die Textdatei eingelesen wird
[JAVA=42]
import java.io.*;
import java.util.*;
/**
* Die Klasse Tree234Shell erlaubt es dem Nutzer ueber eine Shell die Klasse Tree234 zu testen
*
*
* @author Christian Geers,Markus Hubig
* @version 0.3
*/
public class MainShell
{
private File datei;
// private ExpressionTree tree = ExpressionTree();
private SymbolTabelleInterface symbolTabelle = new SymbolTabelle();
private ParserInterface parser = new Parser();
/**
* Konstruktor
*/
public MainShell(String dateiName)
throws IOException, DateiException
{
File datei = getFile(dateiName);
load(symbolTabelle,parser,datei);
}
/**
* main methode fuer ExpressionTreeShell
*/
public static void main(String[] args) throws Exception
{
if (args.length < 1)
throw new Exception("Syntaxfehler:Es wurde kein Dateinamen angegeben");
String dateiName = args[0];
MainShell shell = new MainShell(dateiName);
}
public File getFile(String dateiName)
throws DateiException
{
File datei = new File(dateiName);
DateiException.dateiExistiertNicht(datei);
DateiException.dateiNichtLesbar(datei);
DateiException.istKeineDatei(datei);
return datei;
}
public void load (SymbolTabelleInterface symbolTabelle,ParserInterface parser, File datei)
throws IOException
{
LineNumberReader read = new LineNumberReader(new FileReader(datei));
String line;
ExpressionTreeInterface tree = new ExpressionTree();
//todo, prüfungen ob string vorhanden, splitten in substrings,evaluate einbauen,exceptions,...
while (!(line = read.readLine()).isEmpty())
{
String identifier = line.substring(0);
if (!symbolTabelle.exists(identifier))
{
System.out.println( "\nBearbeeitete Zeile : " + read.getLineNumber() + " : " + line );
symbolTabelle.insert(identifier,false);
System.out.println( identifier + " eingefuegt");
}
else
{
System.out.println(identifier + " ist bereits vorhanden");
}
}
while(!(line = read.readLine()).isEmpty())
{
System.out.println( "\nBearbeeitete Zeile : " + read.getLineNumber() + " : " + line );
String ausdruck = line.substring(0);
tree = parser.parse(ausdruck,symbolTabelle);
}
while(!(line = read.readLine()).isEmpty())
{
String[] zuweisung = line.split("=");
if (zuweisung.length != 2)
{
System.out.println("Zuweisung hat nicht richtiges Format");
}
for (int i = 0 ; i < 2 ; i++)
{
zuweisung = zuweisung.trim();
}
Integer wertIntg = new Integer(0);
int wert = wertIntg.parseInt(zuweisung[1]);
symbolTabelle.insert(zuweisung[0],wert);
System.out.println(zuweisung[0] + " mit Wert " + wert + " eingefuegt");
}
int ergebnis = tree.evaluate(symbolTabelle);
System.out.println("Ergebnis: " + ergebnis);
read.close();
}
}
[/code]
Vielen Dank für eure Hilfe
Gruss
Christian