Nochmal Parser

Ich kapiers nie…

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.

Nochmal Parser
Tja, wollte heut noch ne Parser-Aufgabe ERFOLGREICH lösen, doch es hat wieder nicht geklappt.
Also, die Sprache is die:
S::= A {“+” A}*
A::= “a” | “b” | “(” S “)”

und man soll alles in eine Methode packen (also nix mit aufteilen auf Methode s() und a())

So, dann hab ich folgendes geschrieben:

class GrammarRuleException extends Exception {
public GrammarRuleException() {}
}

public class Parser2 {

public int k;

public Parser2() {
}

public char getNext(String word) throws GrammarRuleException {
	if (k > word.length() - 1) throw new GrammarRuleException();
	else return word.charAt(k);
}

public void SyntaxAnalyse(String word) throws GrammarRuleException {
	if (getNext(word) == 'a') {
		k++;
		SyntaxAnalyse(word);
	} else if (getNext(word) == 'b') {
		k++;
		SyntaxAnalyse(word);
	} else if (getNext(word) == '(') {
		k++;
		SyntaxAnalyse(word);
		if (getNext(word) == ')') {
			k++;
		} else throw new GrammarRuleException();
	} else if (getNext(word) == '+') {
		k++;
		SyntaxAnalyse(word);
	} else if (getNext(word) == '\n') {
		System.out.println("Wort ist drin");
	} else throw new GrammarRuleException();
}

public static void main(String[] args) {
	Parser2 p = new Parser2();
	try {
		p.SyntaxAnalyse("a+(b+a)\n");
	} catch (GrammarRuleException e) {
		System.out.println("Wort is nicht drin");
	}
}

}

und es kommt raus, dass das Wort nicht in der Sprache drin ist, obwohl es doch drin sein müsste, oder?
Wenn ich net des Gfühl hät, dass des morgen auf jeden Fall drankommt, würd ich scho lang a Axt nehmen und den Bildschirm damit…

Da WELL '3


ich denke bei der aufgabe ist wieder rekursiver abstieg gefragt, oder?
d.h. du musst für jede produktion eine methode schreiben die die syntax rekursiv checkt


Das Problem ist, dass du die Zeile

“if (getNext(word) == ‘)’) {”

nie erreichen wirst …

Bei deinem Wort kommt vor der Klammer zu ja ein “a” … bei deinen Regeln analysierst du danach weiter und es folgt die “)” … die kommt aber als nicht vor in deinen Regeln (außer nach einer anderen if-abfrage), weshalb eine Exception geworfen wird …

Wie man das sauber macht → keine Ahnung :slight_smile: … ich würde einfach

“public void SyntaxAnalyse(String word, char wobinich) throws …”

schreiben und dann darüber mir merken ob ich in A oder S bin :slight_smile: … was soll man sonst mit einer Aufgabe anfangen, bei der sie einem extra das Leben schwer machen wollen … pfff

Grüße,
Sebbi


Naja, des public void SyntaxAnalyse(String word) throws GrammarRuleException war halt gegeben…
Ahja wurscht, a baar Punkte wirds scho geben.

Da WELL '3