Compiler



  • Huhu erstmal,bin neu hir 😃
    Nun ich hab vor ein paar tagen eine CPU in logisim gebaut und jetzt möchte ich ihn programmieren...weil ich keinen bock habe unmengen von hexazahlen zu schreiben, möchte ich nen Compiler schreiben mit dem man mit einer art assemblersprache die cpu programmiert. Auserdem soll der Compiler wiederverwendbar sein :D, also die sprache+instruction set soll austauschbar sein.
    Weil ich es noch nie geschafft habe ihrgent ein programm mit ner selbstgeschriebener gui zu starten soll man der code, die sprache und der code mit den fertigen hexazahlen jeweils in einer txt datei definieren werden ,das compilen macht man über dann über das consolenfenster.

    So das problem ist das ich noch keine erfahrungen mit dem schreiben von compiler habe, könnt ihr mir paar Tipps geben wie ich den code am besten aufbauen sollte?

    MfG Tufelix



  • Auf die Gefahr hin, dass ich mich irre, weil ich nie Informatik studiert habe...
    Schau dir mal nen Parsergenerator an: http://de.wikipedia.org/wiki/Compilerbau



  • Ist nicht einfach, aber sehr gut: https://www.coursera.org/course/compilers



  • moechtest du wirklich einen compiler schreiben? (und fuer welche sprache?)
    oder meinst du einen assembler, also ein program das sowas:

    mov r0,r1
    add r0,r0,r1
    ...
    

    in deine opcodes uebersetzt?



  • also anfangs wollte ich schon ein compiler schreiben der code zusätzlich ausführt,aber jetzt wo ich mich näher über "Compilerbau" informierthabe leg ich das erstmal auf eis 😃 .

    Hab jetzt so ein Einfacher Übersetzter geschrieben, er wird erfolgreich Compilt ,aber im consolenfenster tut sich nix 😕 .

    #include <fstream>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <string>
    using namespace std;
    
    vector<string> Woerter;
    
    class tSprache
    {
    public:
    	string Binärcode;
    	string Name;
    };
    
    int Zeilenanz=0;
    
    int i=0;
    
    tSprache Sprache[9999999];
    
    void CodiereSprache(string Satz)
    {
    
    int SpalteBinär=0;
    
    	while(isalnum(Satz[SpalteBinär])!=0)
            {
            SpalteBinär++;
    
                    if(isalnum(Satz[SpalteBinär])!=1)
                    {
                    SpalteBinär--;
                    }
            }
    
    Sprache[i].Binärcode=Satz.substr(0,SpalteBinär);
    SpalteBinär++;
    
    int Spalte=SpalteBinär;
    
            while(isalnum(Satz[SpalteBinär])!=0)
            {
            SpalteBinär++;
    
                    if(isalnum(Satz[SpalteBinär])!=1)
                    {
                    SpalteBinär--;
                    }
            }
            Sprache[i].Name=Satz.substr(Spalte,SpalteBinär);
    }
    
    string vergleicheWort(vector<string> &Woerter)
    {
    
    string Binärcode;
    
    int c=0;
    int bearbeiteteWoerter=0;
    
            while(c<Zeilenanz && bearbeiteteWoerter==Woerter.size()==false)
            {
    
                    if(c<Zeilenanz && Sprache[c].Name!=Woerter[bearbeiteteWoerter] && bearbeiteteWoerter==Woerter.size()==false)
                    {
    
                     c++;
    
                     }
    
                     if(c<Zeilenanz && Sprache[c].Name==Woerter[bearbeiteteWoerter] && bearbeiteteWoerter==Woerter.size()==false)
                     {
    
                    bearbeiteteWoerter++;
                    Binärcode=Binärcode+Sprache[c].Binärcode;
                    c=0;
                    }
           }
    
    return Binärcode;  
    }
    
    void sucheWorter(string Satz,
    	             vector<string> &Woerter)
    {
    
    int laenge=Satz.length();
    int c=0;
    int anfang;
    Woerter.clear();
    
             while(c<laenge)
             {
    
                    while(c<laenge && isalnum(Satz[c])!=1)
                    c++;
                    anfang = c;
    
                    while(c<laenge && isalnum(Satz[c])!=0)
                    c++;
    
                    Woerter.push_back(Satz.substr(anfang,c-anfang));
    
            }
    }
    
    int main()
    {
    
    cout<<"Geben sie bitte der Dateiname der Sprachdatei ein"<<endl;
    
    string SprachDateiName;
    getline(cin,SprachDateiName);
    
    SprachDateiName=SprachDateiName+".txt";
    
    cout<<"Geben sie nun der dateiname der Datei die Eingelesen soll ein"<<endl;
    
    string Einlesen;
    getline(cin,Einlesen);
    Einlesen=Einlesen+".txt";
    
    cout<<"Geben sie jetzt der Dateiname der Datei in \n der Das Ergebniss ausgelesen werden soll ein"<<endl;
    string Auslesen;
    getline(cin,Auslesen);
    Auslesen=Auslesen+".txt";
    
    //Einlesen der Sprache
    string ZeileSprachDatei;
    fstream SprachDatei;
    
    SprachDatei.open(SprachDateiName, ios::in);
    
            while(!SprachDatei.eof())
            {
    
                    while( getline(SprachDatei,ZeileSprachDatei))
                    {
                    i++;
                    CodiereSprache(ZeileSprachDatei);
    
                    }
            }
            SprachDatei.close();
    
    // Einlesen der Datei
    fstream fC;
    fstream fO;
    
    string zeile;
    
    fO.open(Einlesen, ios::in);
    fC.open(Auslesen, ios::out);
    
            while (!fO.eof())
            {
    
                    while( getline(fO,zeile))
                    {
    
                    Zeilenanz++;
    
                    // Datei wird bearbeitet
                    sucheWorter(zeile,Woerter);
                    string BN=vergleicheWort(Woerter);
    
                     cout << BN <<endl;
    
                     //datei wird Geschrieben	
    
                     fC << BN << endl;
    
                     }
            }
    
    fC.close();
    fO.close();
    
    	 system("PAUSE");
    return 0; 
    }
    

    Hab jetzt schon alles ausprobiert aber das problem geht einfach nicht weg.
    Hat jemand ne idee an was es liegen könnte?



  • Es wäre schön, wenn du uns etwas mehr Informationen geben könntest. Es findet sich bestimmt jemand, der dir bei deinem Problem hilft, aber im Moment machst du es uns ganz schön schwer.

    1. Die Einrückung in deinem Code ist grauenhaft und macht ihn schwer zu lesen
    2. Wir können deinen Code nicht selbst ausführen, da wir die .txt Dateien nicht haben. Ausserdem erklärst du auch nicht wie die Aufgebaut sein sollen (ein Bsp wäre hilfreich).
    3. Die Fehlerbeschreibung ist etwas dürftig. Was genau funktioniert nicht? Und vor allem: Was genau sollte der Code denn tun?


  • So ist jetzt der Code besser 😃

    also es gibt 3 txt dateien:
    Die Sprachdatei:

    Nun man schreibt darin einfach die binäre nummer und der name eines Elementes(Registern,Operationen,Argumente...) des Instuctions-set.Zunächst schreibt man die binäre zahl des elements und nach einem leerzeichen der name des elements.

    also das sieht dann nacher zum beisspiel so aus:

    10000 MOV
    01000 ALU
    00000 ADD
    00000 NONE
    000 AX
    001 BX
    

    Die Eingelesene Datei:

    Darin wird der zuübersetzende Code reingeschrieben:

    z.B.

    Mov NONE AX BX
    ALU ADD AX BX
    

    Herauskommt dann die Ausgabedatei:

    Da ist dann der Übersetzte Opcode drin.
    z.B. von dem oberem Code:

    Mov ADD AX BX
    ALU ADD AX BX
    

    sieht dann die Ausgabedatei so aus:

    10000 00000 000 001 
    01000 00000 000 001
    

    So zu der fehlerbeschreibung:
    es gibt weder einen Fehler noch einen Warnhinweis
    ich vermute starkt das ich nen denkfehler in dem code habe.

    Was der Code machen sollte:

    als fragt nach den dateinamen der 3 benötigten dateien,
    danach öffnent er die sprachdatei und scheibt sie zeilenweise in eine besonde Array

    dann bearbeitet er zeilenweise der code Eingelesende Datei...
    und schreibt gleichzeitig der übersetzte code in die Ausgabe-Datei.

    so noch fragen ? 😃



  • Tufelix schrieb:

    So ist jetzt der Code besser

    Nein.

    Tufelix schrieb:

    so noch fragen?

    Warum prüfst du nicht, ob die Dateien überhaupt geöffnet werden können?



  • hast du ernsthaft mit dem debugger geschaut wo etwas schief geht? deine frage klingt so als ob du es nur runterprogrammiert haettest und jetzt ein debug-schweinchen suchst der es fuer dich fixt und zum laufen bringt.

    ansonsten verstehe ich deine
    "Hab jetzt schon alles ausprobiert aber das problem geht einfach nicht weg.
    Hat jemand ne idee an was es liegen könnte?"
    was meinst du mit 'probiert'? was genau ist das problem, kannst du uns die zeile sagen ueber die du im debugger stepst und die dennoch nichts ausgibt?



  • Swordfish schrieb:

    Warum prüfst du nicht, ob die Dateien überhaupt geöffnet werden können?

    ich benutz Microsoft Visual c++ 2010 Express , das stellt doch schon beim öffnen des projekts fest ob die dateien geöffnet werden können.Beim Debuggen jedenfalls öffnet es alle dateien erfolgreich.

    rapso schrieb:

    deine frage klingt so als ob du es nur runterprogrammiert haettest und jetzt ein debug-schweinchen suchst der es fuer dich fixt und zum laufen bringt

    Nop habe bis auf die "codieresprache" funktion alles sorgfältig einzeln getestet,bei einem probelauf habe ich schon ein 2-zeilen-code mit einer einfachen sprache die ich in die array reingeschrieben habe übersetzt und dann
    ne korrekte ausgabe-datei herausbekommen.(die sprache und die 2 dateinen hab ich in meinem letzten beitrag als beispiel genommen)

    rapos schrieb:

    was meinst du mit 'probiert'? was genau ist das problem, kannst du uns die zeile sagen ueber die du im debugger stepst und die dennoch nichts ausgibt??

    Nun der Compiler höhrt bei dieser zeile auf und öffnet das consolenfenster 😃

    int main(){
    

    jetzt vermute ich das der Builtvorgang nicht startet.Den es gibt weder eine Ausgabe im Builtfenster noch textdatei wo das protokol vom Builtvorgang drinsteht.

    Hat ihrgent einer ne idee wie man das problem lösen könnte?



  • Wenn er nach dem Druck auf F5/Play-Taste das Konsolenfenster öffnet, führt er offensichtlich dein Programm aus. Mit dem Buildvorgang ist also wahrscheinlich alles in Ordnung. Die Build-Ausgabe siehst du im Ausgabefenster (in der Liste "Erstellen" auswählen).

    Mir scheint, du weißt nicht mit dem Debugger umzugehen. Das solltest du ändern. Der Debugger ist ein wichtiges Werkzeug, mit dem sich jeder Programmierer auskennen sollte. Lies dich da mal schlau! Und für den Anfang: erstelle dein Projekt als Debug-Version (da ist eine Listbox oben in der Toolbar mit mindestens Release und Debug zur Auswahl), setze einen Haltepunkt in der ersten Zeile der main-Funktion (F9) - und staune, dass du das Programm zur Laufzeit anhalten kannst! 🙂



  • Tufelix schrieb:

    Swordfish schrieb:

    Warum prüfst du nicht, ob die Dateien überhaupt geöffnet werden können?

    ich benutz Microsoft Visual c++ 2010 Express, das stellt doch schon beim öffnen des projekts fest ob die dateien geöffnet werden können.

    Warum sollte sich eine IDE darum kümmern ob irgendwelche Dateien, die dein Programm zur Laufzeit versucht zu öffnen, beim laden des Projekts existieren!?

    Tufelix schrieb:

    Beim Debuggen jedenfalls öffnet es alle dateien erfolgreich.

    Ach? Woran erkennst du das?

    Tufelix schrieb:

    Nun der Compiler höhrt bei dieser zeile auf und öffnet das consolenfenster 😃

    int main(){
    

    Würde der /Compiler/ bei dieser Zeile "aufhören", würde er dir als Fehlermeldung auch verraten, warum er das tut.

    Tufelix schrieb:

    jetzt vermute ich das der Builtvorgang nicht startet.

    Wenn der Build nicht starten wuerde, wuerde es dir VS sagen und dich fragen, ob es den letzten erfolgreichen Build ausführen soll.



  • könnt ihr eigentlich den code bei euch erflogreich starten oder ist gibts da auch ein fehler?



  • Ok, dann eben weiter:

    Tufelix schrieb:

    tSprache Sprache[9999999];

    Wtf? Das sind ~600 MB auf dem Stack! Nimm einen std::vector !
    Warum globale Variablen?



  • Der hier ist zu groß für den Stack:

    tSprache Sprache[9999999];
    

    Sowas als Globale zu lösen, ist sowieso sehr unschön...



  • joar die war auch anfangs eingebaut aber die hat nicht die class akzeptiert:

    class tSprache{
    public:
    	string Binärcode;
    	string Name;
    };
    


  • Tufelix schrieb:

    joar die war auch anfangs eingebaut aber die hat nicht die class akzeptiert

    Was?



  • ok ich bau dann der vector wieder ein



  • Tufelix schrieb:

    ok ich bau dann der vector wieder ein

    Aber bitte nicht als Globale!



  • ok dann bau ich sie in der main-anweisungsblock ein und benutz ein zeiger um die sprache an die CodiereSprache funktion zu übergeben.


Anmelden zum Antworten