Parser

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Parser
Mein parser funzt nicht, bei korrektem Wort gibt er immer KEIN WORT aus.

Weiss jemand warum?

Hier mein Code:

[code]package parser;
import java.io.*;

public class parser{
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
char currentSymbol;
int s = -1;
void getSymbol(){
try{
s = console.read();
currentSymbol = (char) s;
} catch(Exception e){
}
}
void s() throws GrammarRuleException{
if(currentSymbol == ‘a’){
getSymbol();
s();
if(currentSymbol == ‘b’){
getSymbol();
}
else throw new GrammarRuleException();
}
else if(currentSymbol == ‘c’){
getSymbol();
a();
}
else throw new GrammarRuleException();
}
void a() throws GrammarRuleException{
if (currentSymbol == ‘b’){
getSymbol();
a();
}
else if(currentSymbol == ‘c’){
getSymbol();
}
else throw new GrammarRuleException();
}
public static void main(String[] args){
parser a = new parser();
a.getSymbol();
try{
a.s();
} catch (GrammarRuleException w){
System.out.println(“KEIN WORT DER SPRACHE”);
return;
}
if(a.currentSymbol == ‘\n’){
System.out.println(“OK”);
}
else System.out.println(“KEIN WORT DER SPRACHE”);

}

}[/code]


hi,
habs mir grad mal angeschaut und den fehler gefunden:
es fehlt ein a.getSymbol() vor

if(a.currentSymbol == '\n'){ System.out.println("OK"); } else System.out.println("KEIN WORT DER SPRACHE");

er muss ja das ‘\n’ vorher auch einlesen, sonst ist zu dem zeitpunkt currentSymbol gleich dem letzten symbol des wortes.

btw: was soll dein package parser am anfang? bei mir hat das gestoert, weiss aber nicht mehr, wozu das ueberhaupt gut ist?!

btw2: zum debuggen ist es schlecht, dass du die beiden fehlermeldungen KEIN WORT DER SPRACHE gleich benennst, weil man da dann nicht unterscheiden kann. ich habe eines z. b. anders benannt, damit ich weiss, in welchen zweig er kommt. einfacher ginge das natuerlich noch mit einem stepper, gibt es sowas in joe oder so?


Hab des ausprobiert und dann funktionierts auch, aber ich kapier nicht, warum ich das noch brauch.

Wenn er als letzten Buchstaben b hat, checkt ers, macht getSymbol und verlässt die s() Methode. Aber dann müsste doch das currentSymbol gleich dem buchstaben nach b sein, also ‚\n‘. Ich kapiers net.

Des is nur beim Eclipse, in welcher Package die klasse ist, nicht zu beachten.

Das versuch ichmal, danke


du hast recht, das ist wirklich komisch. im moment bin ich nicht an meinem pc, aber heute abend schaue ich mir das nochmal an, warum das nicht geht. die grammatik soll wahrscheinlich folgende sein:

S → aSb,
S → cA,
A → bA,
A → c;

oder?


Genau, ich hab das auch schon alles mit der Lösung aus der 3. (?) Übung verglichen, da stehts genauso drin.


also ich hab den sourcecode grad ausprobiert und des funzt auch ohne ihn zu modifizieren. Ausserdem : Es wird nach der ueberpruefung eines Zeichens immer ein neues eingelesen so dass currentSymbol auch nach verlassen des try / catch abschnitts den wert des naechsten Buchstabens beherbergt.

bist du sicher dass du ein wort eingegeben hast dass auch wirklich erzeugt werden kann?

versuch mal ohne modifikation der source folgende woerter und du wirst sehen:
S → aSb → acAb → accb : das wort liefert ok
S → cA → cc : das wort liefert auch ok

und wenn du dann ccc ausprobierst gehts zum beispiel halt net

greets,
fred


Also ich hab grad den Code kopiert, neue classe gemacht, rein gepastet und geht nicht, die letzte Abfrage (ob currSymbol == ‚\n‘ ist) geht nicht.


das is recht merkwuerdig. bei mir ging des ohne probleme . musste halt noch die GrammarRuleException reintun damit der compiler ueebrhaupt angesprungen is. aber ansonsten …

wobei ich mir auch net erklaere kann warum das bei java ueberhaupt moeglich ist dass das prog abhaengig vom ausfuehrenden sys laeuft oder sich fehlerhaft verhaelt …


bei mir geht’s definitiv auch nicht.
keine ahnung warum. der code sieht sauber aus. das ist das wichtigste, darauf gibt’s uebermorgen auch die punkte.


update:
wenn ich die zeile

if(a.currentSymbol == ‘\n’){

durch

if(a.currentSymbol == (char) 13){

ersetze, dann geht es! anscheinend schafft er bei uns die escapesequenz nicht auf das carriage return zu matchen. so geht’s auf jeden fall, bei dir auch str1ch444?


mit welcher sdk version arbeitet ihr denn ? und unter welchem os ? koennte an sowas liegen …

ich : SDK 1.4.1-b21 (glaub ich zumindest) WINXP