# Compiler-Bau



## Guest (8. Nov 2006)

Hi,

ich hab vor mal ne Mini-Programmiersprache entwickeln.
In der Schule machen wir grade Automathentheorie und sind jetzt bei der Backus-Naur-Form angekommen. 
Wenn geht es weiter, wenn ich meine Sprache dann in der BNF habe?

Gibts dazu ein Tutorial?
Oder vielleicht genügt mir es auch, wenn ihr mir einen Ansatz liefert.

Vielen Danke jetzt schonmal!!


----------



## Gast (8. Nov 2006)

Noch ne kleine Anmerkung: ich will das in Java machen!


----------



## Beni (8. Nov 2006)

Also so ein kleines hübsches Tutorial gibts dazu sicherlich nicht, eine Programmiersprache mit Parser und Compiler entwickelt man nicht an einem Nachmittag :wink:

Am besten beginnst du mit einem Tokenizer und einem Parser. Der Tokenizer nimmt deine Sprache und gruppiert grössere Syntaxelemente (z.B. Schlüsselwörter, Zahlen, Identifier...). Der Parser nimmt die Tokens und versucht einen Syntaxbaum daraus zu generieren. Dieser Baum wird anschliessend dem Compiler übergeben, der den Zielcode schreibt. Ein Test, ob die Eingabe korrekt ist, wäre nützlich :wink:

Beginn mal mit Tokenizer und Parser, das sind IMHO die schwierigsten Dinge und ohne die musst du gar nicht an den Compiler denken. Entweder schreibst du dir das selbst (seeeehr aufwendig), oder du benutzt Tools wie JFlex (Tokenizer) und CUP (Parsergenerator).

P.S. und fang mal mit was ganz kleinem an, irgendwas wie "1+2", damit du ein Gefühl für die Sache kriegst.

Achja, die BNF für deine Sprache würde ich erst schreiben, wenn du einigermassen mit dem Parser umgehen kannst. Ansonsten entwickelst du eine Sprache, die der Parser fast nicht lesen kann.


----------



## Gast (8. Nov 2006)

OK, Compiler war etwas hochgegriffen, stimmt - Tokenizer/Parser ist wohl erstmal besser.
Ich dachte beim Spryachumfang/-gestaltung an sowas wie Brainfuck (siehe Wikipedia).


----------



## Guest (12. Nov 2006)

Hi,

also ich hab mich jetzt mal drangemacht und einen "if-Interpreter" (oder Parser?) zu bauen. Bis jetzt hab ich folgendes:

```
static private void check(String input)
	{
		status=0;
		String temp = input.toLowerCase();
		String bed = "", wenn="", sonst="";
		char[] zeichen = temp.toCharArray();
		for(int i=0; i<zeichen.length; i++)
		{
			switch(status)  //99: Fehler
			{
			case 0:  //i vom IF
			{
				if(zeichen[i]=='i')
					status=1;
				break;
			}
			case 1:  //f vom IF
			{
				if(zeichen[i]=='f')
					status=2;
				else
					status=0;
				break;
			}
			case 2:  //Klammer auf für Bedingung
			{
				if(zeichen[i]=='(')
					status=3;
				else
					status=0;
				break;
			}
			case 3:  //In der Bedingungklammer
			{
				if(zeichen[i]==')')
					status=4;
				else
					bed = bed + zeichen[i];
				break;
			}
			case 4: //Klammer auf für "Wenn"
			{
				if(zeichen[i]=='{')
					status=5;
				else if(zeichen[i]==' ')
					status=5;
				else
					status=99; //Fehler
				break;
			}
			case 5:  //Dass "Wenn"
			{
				if(zeichen[i]=='}')
					status=6;
				else
					wenn = wenn + zeichen[i];
				break;
			}
			case 6:  //e vom Else
			{
				if(zeichen[i]=='e')
					status=7;
				else
					status=0;
				break;
			}
			case 7:  //l vom eLse
			{
				if(zeichen[i]=='l')
					status=8;
				else
					status=0;
				break;
			}
			case 8:  //s vom elSe
			{
				if(zeichen[i]=='s')
					status=9;
				else
					status=0;
				break;
			}
			case 9:  //e vom elsE
			{
				if(zeichen[i]=='e')
					status=10;
				else
					status=0;
				break;
			}
			case 10: //Klammer auf für "sonst"
			{
				if(zeichen[i]=='{')
					status=11;
				else if(zeichen[i]==' ')
					status=10;
				else
					status=99; //Fehler
				break;
			}
			case 11:  //Dass "sonst"
			{
				if(zeichen[i]=='}')
					status=12;
				else
					sonst = sonst + zeichen[i];
				break;
			}
			}
		}
		
		if(status==99)
		{
			System.out.println("Fehler!");
		}
		else
		{
			System.out.println("Wenn: " + bed);
			System.out.println("Dann: " + wenn);
			System.out.println("Sonst: " + sonst);
		}
		
	}
```
Also bis jetzt wird erstmal nur geprüft, ob die Eingabe synthaktisch korrekt ist. Falls ja, wird dir Bedingung, dass "Dann" und das "Sonst" ausgegeben.
Eigentlioch müsste ich jetzt nur noch eine weiter Methode schafften, die checkt, ob die Bedingung erfüllt ist oder nicht und dem entsprechend "Dann" oder "Sonst" ausgeben.

Ist das in etwa der Weg wie man sowas angeht? Oder geht das kürzer/schnell/eleganter?

Danke


----------



## Roar (12. Nov 2006)

Hi,
dein code ist nicht wirklich der weg wie man sowas angeht. schau mal hier: http://en.wikipedia.org/wiki/Lexical_analysis für ne kleine einleitung da sind dann auch weiterführende links


----------

