Parser-Gschmarri

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-Gschmarri
Gleich geh ich zum Fenster und schmeiß meinen PC naus…

Hab folgende Grammatik:
S->aS
S->bSc
S->d

und folgendes Programm:

[code]class MyException extends Exception {

public MyException() {}

}

class SyntaxAnalyse extends MyException {

public String wort;
public int k;

public SyntaxAnalyse(String wort) {
	this.wort = wort;
}

public char getNext() throws MyException {
	if (k > wort.length() - 1) {
		return '\n';
	} else return wort.charAt(k);
}

public void Analyse() throws MyException {
		System.out.print(getNext());
	if (getNext() == 'a') {
		k++;
		Analyse();
	} 
	if (getNext() == 'b') {
		k++;
		Analyse();
		if (getNext() == 'c') {
			k++;
		} else throw new MyException();
	} else if (getNext() == 'd') {
		k++;
	} else if (getNext() == '\n') {
		System.out.println("Wort ist in der Sprache enthalten");
	} else throw new MyException();
}

public static void main(String[] args) {
	SyntaxAnalyse a = new SyntaxAnalyse("aaabbbbaaadcccc");
	try {
		a.Analyse();
	} catch (MyException e) {
		System.out.println("Wort ist nicht in der Sprache enthalten");
	}
}

}[/code]

So, des Problem is, er erkennt die cs am Schluss nimma, bzw wenn ich die as in der Mitte weglasse, geht alles. Hilfe.

Da WELL '3

that should do the trick

  1. in deinem code wird das leere wocht erkannt
  2. nac dem ersten vergleich fehlt ein else
  3. alle woerter w die bis zum nten zeichen element von L(G) sind und ab dann nicht mehr passieren deinen parser

so sollte es richtig sein

[code]class MyException extends Exception {

 public MyException() {}

}

class SyntaxAnalyse extends MyException {

 public String wort;
 public int k;
 
 public SyntaxAnalyse(String wort) {
 k = 0;
     this.wort = wort;
 }
 
 public char getNext() {
     if (k > wort.length() - 1) {
         return '\0';
     } else return wort.charAt(k);
 }
 
 public void analyse() throws MyException {
     //System.out.print(getNext());
     if (getNext() == 'a') {
         k++;
         analyse();
     //obacht! alternative produktion
     } else if (getNext() == 'b') {
         k++;
         analyse();
         if (getNext() == 'c') {
             k++;
         } else throw new MyException();
     } else if (getNext() == 'd') {
         k++;
     } /*obacht: leere wocht ist nich in der sprache ;-)
     else if (getNext() == '\0') {
         System.out.println("Wocht ist in der Sprache enthalten");
     } */else throw new MyException();
 }
 
 public static void main(String[] args) {
     SyntaxAnalyse a = new SyntaxAnalyse(args[0]);
     try {
         a.analyse();
     //aufpassen! wenn es a.anlyse() terminiert, muss das wocht zuende sein
     if(a.getNext() != '\0')
	 System.out.println("Das Wocht ist nicht in der Sprache enthalten");
     else 
	 System.out.println("Wocht ist in der Sprache enthalten");

     } catch (MyException e) {
         System.out.println("Wocht ist nicht in der Sprache enthalten");
     }
 }

}[/code]


Keine Ahnung ob des der Fehler
ist, aber nach jeder Alternative muss „else if“ stehen. Probier mal obs klappt.


Str1ch444: jo genau (–> mein code)


hi,
ich weiss schon nicht, was du mit deinem header

class SyntaxAnalyse extends MyException

willst. die klasse extendet ja deine myexception nicht.
@linqs: was hast du die ganze zeit mit deinem “wocht”, das du ueberall ersetzen musst?


steppenwolf: waerst du in ti gewesen wuesstest du es…:wink:


hat er das wohl immer gesagt? DAS sollte sich also hinter dem genuschel erkennen lassen! ich hab da nie was verstanden…


Moin!

Danke, hat funktioniert. Hab jetzt alles nochmal überarbeitet und die ganzen “throw Exception” rausgenommen, geht anscheinend auch ohne. Nur noch ne Frage dazu, dass in der Grammatik kein leeres Wort vorkommen darf: wie gibt man am Besten von der Methode getNext() zurück, dass die Wortlänge 0 is? Null geht nicht und ein leeres Char wird auch nicht akzeptiert. Geht das nur mit irgendnem Fantasiebuchstaben? Is doch bläid.

[code]class SyntaxAnalyse {

public String wort;
public int k;

public SyntaxAnalyse(String wort) {
	this.wort = wort;
}

public char getNext() {
	if (wort.length() == 0) return '§';   //die Stelle hier meine ich
	if (k > wort.length() - 1) {
		return '\n';
	} else return wort.charAt(k);
}

public void Analyse() {
	if (getNext() == 'a') {
		k++;
		Analyse();
	} else if (getNext() == 'b') {
		k++;
		Analyse();
		if (getNext() == 'c') {
			k++;
		}
	} else if (getNext() == 'd') {
		k++;
	} else if (getNext() == '\n') {
		System.out.println("Wort ist in der Sprache enthalten");
	}
}

public static void main(String[] args) {
	SyntaxAnalyse a = new SyntaxAnalyse("aaabbaaaadcc");
	try {
		a.Analyse();
		if (a.getNext() == '§' || a.getNext() != '\n')
     		System.out.println("Wort ist nicht in der Sprache enthalten");
     	else
     		System.out.println("Wort ist in der Sprache enthalten");
	} catch (Exception e) {
		System.out.println("Wort ist nicht in der Sprache enthalten");
	}
}

}[/code]


Also bei dem Parser wie er in der Übung drankam, musst un in der methode analyse nicht die abfrage nach ‚\n‘ machen, sondern in der main methode.

Also praktisch so:


public class SyntaxAnalyse {
	public static void main(String[] args) {
		SyntaxAnalyse a = new SyntaxAnalyse("aaabbaaaadcc\n");
		try {
			a.Analyse();
		} catch (GrammarRuleException e) {
			System.out.println("Wort ist nicht in der Sprache enthalten");
		}
		char b;
		try {
			b = a.getNext();
		} catch (GrammarRuleException e) {
			System.out.println("Fehla");
			return;
		}
		if (b == '\n') {
			System.out.println("Wort OK");
		} else
			System.out.println("Wort nicht in Sprache");
	}
	public int k;

	public String wort;

	public SyntaxAnalyse(String wort) {
		this.wort = wort;
	}

	public void Analyse() throws GrammarRuleException {
		if (getNext() == 'a') {
			k++;
			Analyse();
		} else if (getNext() == 'b') {
			k++;
			Analyse();
			if (getNext() == 'c') {
				k++;
			} else
				throw new GrammarRuleException();
		} else if (getNext() == 'd') {
			k++;
		} else
			throw new GrammarRuleException();
	}

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

@steppenwolf : du hast ja auch immer geschlaffen :gun:


was anderes ist in diesem fach auch nicht moeglich…