Compiler



  • jop das meine ich ja 😃



  • mmh die codiereSprache funktion tun noch nicht richtig...



  • Tufelix schrieb:

    mmh die codiereSprache funktion tun noch nicht richtig...

    Mit der "Fehlerbeschreibung" kann keiner was anfangen. Leuchtet ein, oder? Wie wär's mit Fehlerbeschreibung, eventuell Fehlercode, fehlerhafter Code...?



  • wie kann ich jetzt was in den vector hinein tun? ich muss ja einer der 2 Variabelen in der klasse auswählen, muss ich da ne igene funktion schreiben oder gibts da auch ne andere möglichkeit?



  • Vielleicht willst du einen Konstruktor.

    #include <vector>
    #include <string>
    #include <iostream>
    
    struct foo_t {
    	std::string a;
    	std::string b;
    
    	foo_t( const std::string &param_a, const std::string &param_b ) : a( param_a ), b( param_b ) { }
    };
    
    int main()
    {
    	std::vector< foo_t > bar;
    
    	bar.push_back( foo_t( "Hugo", "Sepp" ) );
    	bar.push_back( foo_t( "Xaver", "Max" ) );
    
    	for( std::vector< foo_t >::iterator i = bar.begin(); i != bar.end(); ++i ) {
    		std::cout << i->a << ", " << i->b << '\n';
    	}
    }
    


  • ok danke, jetzt tut der übersetzt einwandfrei.



  • Nun als ich eine kompexe sprache dem übersetzter einlesen habe kam es zu einem Fehler(string subscript out of range) wärend die "CodiereSprache"funktion die 12. zeile des "Sprach text" bearbeitet.Komischerweise ist das bei jeder Sprache die ich einlese so.Hat wer ne idee an was das liegen könnte?

    CodiereSprache:

    void CodiereSprache(string Satz
    					,vector<tSprache> &Sprache)
    {
    
    int SpalteBinär=0;
    
    	while(isalnum(Satz[SpalteBinär])!=0 && isalnum(Satz[SpalteBinär+1])!=1)
    	{
    	SpalteBinär++;
    
    	}
    
    	int Ende=SpalteBinär;
    
    SpalteBinär++;
    
    int Spalte=SpalteBinär;
    
    	while(isalnum(Satz[SpalteBinär])!=0 && isalnum(Satz[SpalteBinär+1])!=1)
    	{
    
    	SpalteBinär++;
    
    	}
    
    	Sprache.push_back(tSprache(Satz.substr(0,Ende),Satz.substr(Spalte,SpalteBinär)));
    	cout <<Spalte<<" " << SpalteBinär<<endl;
    


  • Das Problem tritt wahrscheinlich eher bei der Zeile davor auf (Zeile 10). Mach dort mal einen Haltepunkt und überprüfe, ob Satz[SpalteBinär+1] auch wirklich im gültigen Bereich ist. Wahrscheinlich ist SpalteBinär+1 größer als Satz.size() (oder kleiner als 0).



  • ich meinte die zeile 12 im text der der übersetzer übersetzt -.-



  • Tufelix schrieb:

    ich meinte die zeile 12 im text der der übersetzer übersetzt -.-

    Und in welcher Zeile in deinem Code passiert der Fehler?



  • DU machst dir unnötig Arbeit.
    Bau dein Programm wie ein Compiler auf :
    - Lexikalische Analyse
    - Syntaktische Analyse
    - Semantische Analyse

    das ist das beste was du machen kannst.
    So kannst du die Fehler schneller finden die im Quellcode sind.

    Hier noch ein paar links:
    http://de.wikipedia.org/wiki/Compiler
    http://www.informatik.uni-rostock.de/tpp/lehre/slides/cobau.pdf
    http://magazin.c-plusplus.net/artikel/AVL-Baum
    http://magazin.c-plusplus.net/artikel/Compilerbau



  • AVL-Baum?



  • Er will den AVL-Baum bestimmt für den Syntaxbaum verwenden.
    @ThreadErsteller

    Schau dir mal das Drachenbuch an. Umfangreicher, ausführlicher aber auch schwieriger Stoff: http://www.weltbild.de/3/14168864-1/buch/compilerbau.html?wea=8002019



  • Nun ich hab die "codiereSprache" jetzt zum laufen bekommen jetzt aber hängt die "vergleicheWort" funktion

    string vergleicheWort(vector<string> &Woerter
    					,vector<tSprache> &Sprache)
    {
    
    string Binärcode;
    
    unsigned int c=0;
    signed int bearbeiteteWoerter=Woerter.size()-1;
    int Error=0;
    int HEX=0;
    
    	while(bearbeiteteWoerter+1==0==false && Error==0 )
    	{
    
    		if("HEX"==Woerter[bearbeiteteWoerter].substr(0,3)){
    
    		Binärcode=Binärcode+HEXA(Woerter[bearbeiteteWoerter].substr(3,Woerter[bearbeiteteWoerter].size()-3));
    
    		bearbeiteteWoerter--;
    		}
    
    		while(Sprache[c].Name!=Woerter[bearbeiteteWoerter] && bearbeiteteWoerter<0==false && c<Sprache.size() && Error==0){
    
    	     c++;
    		}
    
    		if(c>=Sprache.size()){
    		Error=1;
    
    		SetColor(13);
    
    		cout << "Fehler Befehl konnte nicht gefunden werden:"<<endl;
    		SetColor(15);
    		cout<<"Befehl:";
    		SetColor(12);
    		cout<<Woerter[bearbeiteteWoerter]<<endl;
    		SetColor(15);
    		cout<<"Zeile:";
    		SetColor(12);
    		cout<<Zeilenanz<<endl;
    		SetColor(15);
    
    		}
    
    		if(Error==0){
    			if(Sprache[c].Name==Woerter[bearbeiteteWoerter] && bearbeiteteWoerter<0==false && c<Sprache.size() ){
    
    			bearbeiteteWoerter--;
    
    			Binärcode=Binärcode+Sprache[c].Binärcode;
    			c=0;
    
    			}
    		}
    	}
    return Binärcode;  
    }
    

    Das problem ist das diese Schleife nicht anhalten will obwohl die bedingungen nicht erfüllt werden:

    while(bearbeiteteWoerter+1==0==false && Error==0 )
    	{
    

    hat wer ne idee an was das liegen könnte(eventuell debuggeneinstellungen ändern)



  • while(bearbeiteteWoerter+1==0==false && Error==0 )
    

    Oh je, setz da mal Klammern! Wie meinst du es denn? So?

    while(((bearbeiteteWoerter+1)==0)==false && Error==0 )
    

    Dann kannst du auch gleich != benutzen.

    Es ist irgendwie nicht sehr schön, dass bearbeiteteWoerter rückwärts läuft und unter 0 sinken kann. Der Bezeichner sagt irgendwie was anderes aus.



  • _matze schrieb:

    Es ist irgendwie nicht sehr schön, dass bearbeiteteWoerter rückwärts läuft und unter 0 sinken kann. Der Bezeichner sagt irgendwie was anderes aus.

    jop ich weis,hatte ganz vergessen das man zahlen von rechts nach links schreibt :D.
    mir ist der fehler erst beim 1 testlauf aufgefallen, hab dann einfach die schleife rückwärts laufen lassen 😃

    _matze schrieb:

    Dann kannst du auch gleich != benutzen.

    joar hatte anfangs gedacht das der fehler vielleicht das ungleich wäre, hab dann es mit einem false ausgetauscht 😃

    _matze schrieb:

    Oh je, setz da mal Klammern! Wie meinst du es denn? So?

    jop, hab jetzt wieder das ungleich eingebaut

    while((bearbeiteteWoerter+1)!=0 && Error==0 )
    

    aber die schleife tut dadurch immernoch nicht 😞



  • Tufelix schrieb:

    aber die schleife tut dadurch immernoch nicht 😞

    Dann nutze den Debugger! Die Schleife wird sicher verlassen, wenn die Bedingung nicht mehr erfüllt ist. Darauf kannst du dich verlassen. Aber nicht auf deinen Code. Den musst du überprüfen. Und das geht am einfachsten mit dem Debugger. Schau dir an, welche Werte deine Variablen wirklich zur Laufzeit haben und warum die Schleife nicht verlassen wird.



  • also der fehler tritt auf wenn bearbeitetewoerter der wert -1 hat und der debugger bei dem schleifenanfang ist wenn man dann einen schritt macht kommt die fehlermeldung

    Schleifenanfang:

    while(bearbeiteteWoerter!=-1 && Error==0 )
    


  • fehlermeldung:

    Unbehandelte Ausnahme bei 0x7c812afb in Editor.exe: Microsoft C++-Ausnahme: std::out_of_range an Speicherposition 0x0012f144..
    


  • Wenn bearbeiteteWoerter==0 ist, machst du noch einen Schleifendurchlauf. In dem dekrementierst du bearbeiteteWoerter dann eventuell (es ist also -1) und greifst auf Woerter[bearbeiteteWoerter] , also Woerter[-1] zu. Das kann ja nicht funktionieren. Du solltest deinen Ablauf überdenken.

    Ach ja, und sowas

    bearbeiteteWoerter<0==false
    

    ist natürlich sehr ungewöhnlich formuliert. Wieso nicht einfach so?

    bearbeiteteWoerter>=0
    

Anmelden zum Antworten