Compiler zu eigener Programmiersprache bauen



  • Ich fühl mich leicht getrollt, aber es war ja gerade Weihnachten ...

    Blauwaal schrieb:

    Ich hab aber jetzt das Problem, dass wenn mein Compiler in eine cpp-Datei compiliert, der c++-Compiler, weil es keine vollständige Projektmappe ist, das Programm nicht compiliert.

    Du hast dieses Problem? Wirklich? Du meinst nicht vielleicht eher, dass du Angst hast, dieses Problem in frühestens einem halben Jahr zu haben? Vielleicht versuchst du, bevor du damit anfängst, auch erstmal, einen bestehenden (C++-)Compiler besser zu verstehen. So von der Bedienung her meine ich.



  • Sorry, Bashar.Es war nicht meine Absicht Dich zu trollen.
    Ich versuche noch mal auf anderen Wegen die offenen Fragen zu klären.
    Denn trotz allem habe ich die Hoffnung es zu schaffen noch nicht aufgegeben.



  • Auch einen einfachen Compiler zu schreiben, der zuerst in eine andere Sprache übersetzt, ist nicht einfach. Dafür braucht man schon ein gewisses Verständnis von Informatik, formalen Sprachen und Programmiererfahrung.
    Dabei wird "irgendwas" entstehen, z.B. eine C oder eine C++ Datei. Die mit einem richtigen Compiler zu bauen ist dann im Gegensatz dazu nur eine leichte Fingerübung. Es ist zwar nachvollziehbar, warum du dir jetzt schon Gedanken darüber machst, allerdings ist das Problem an sich völlig irrelevant. Wenn du soweit bist, einen Compiler zu schreiben, der aus deiner eigenen Sprache eine cpp erzeugt, wirst du damit sicher keine Schwierigkeiten mehr haben.



  • Ich habe nun den Anfang von meinem Compiler gebaut. Er kann bis jetzt nur einen Befehl, aber diesen übersetzt er auf c++.:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <iterator>

    #define in_cout_datei "in.txt"
    #define ozw_cout_datei "ozw"
    #define out_cout_datei "out.cpp"

    using namespace std;

    void befel(string sB);
    void parser();

    namespace include
    {
    bool Windows = false;
    bool Iostream = false;
    bool std = false;
    }
    namespace alt
    {
    bool alt = false;
    string tuhe("");
    }

    ofstream ozw(ozw_cout_datei);

    int main()
    {
    ifstream in(in_cout_datei);
    vector<char>source_code;
    copy(
    istreambuf_iterator<char>(in.rdbuf()),
    istreambuf_iterator<char>(),
    back_inserter(source_code));
    int i = 0;
    string sB;
    sB = "";
    while (source_code.size() > (size_t)i)
    {
    if (source_code[i] == ' ' || source_code[i] == '\n' || source_code[i] == '\r')
    {
    if (sB != "")
    {
    befel(sB);
    }
    sB = "";
    }
    else
    {
    char Text[21];
    sprintf_s(Text, "%s%c", sB.c_str(), source_code[i]);
    sB = Text;
    }
    i++;
    }
    if (sB != "")
    {
    befel(sB);
    }
    sB = "";
    ozw.close();
    parser();
    cout << endl;
    system("PAUSE");
    }

    void befel(string sB)
    {
    if (!alt::alt)
    {
    if (sB == "Text")
    {
    include::Iostream = true;
    include::std = true;
    alt::alt = true;
    alt::tuhe = "Text";
    }
    else
    {
    cout << "Der Begriff: \"" << sB << " ist undefiniert!" << endl;
    }
    }
    else
    {
    if (alt::tuhe == "Text")
    {
    ozw << "cout << \"" << sB << "\";" << endl;
    alt::alt = false;
    alt::tuhe = "";
    }
    }
    }

    void parser()
    {
    ofstream out(out_cout_datei);
    if (include::Iostream)
    out << "#include <iostream>" << endl;
    if (include::std)
    out << "using namespace std;" << endl;
    out << "int main(){" << endl;
    ifstream izw(ozw_cout_datei);
    out << izw.rdbuf();
    out << "return 0;}";
    }

    Jetzt würde mich interessieren, ob man diese cpp-Datei auch einzeln compilieren kann oder ob man sie jedes mal in eine neue Projektmappe einfügen muss.



  • Von was für 'ner Projektmappe redest Du die ganze Zeit? Einen Compiler ruft man auf, und fertig?! Verwechselst Du Compiler und IDE?



  • LOL.

    Wenn dir das mit dem Übersetzen so wichtig ist... Du redest von VS, also könntest du z.B. ein Makefile für nmake vorbereiten, als Vorlage mitausliefern und nmake mit dem Makefile ausführen.



  • Das ist kein Compiler, sondern ein Programm, dessen Code mit ungenügend zu bewerten ist.

    Deine Vorhaben ist mit deinem Kenntnisstand vermutlich nicht angemessen zu realisieren. Möglicherweise strebst du auch ein ganz anderes Ziel an und kennst die Fachausdrücke nicht, aber auch in diesem Fall gilt, dass dein Vorhaben nicht angemessen realisierbar ist.



  • Ansonsten kannst du dir noch folgenden Artikel ansehen: https://www.c-plusplus.net/forum/268247

    Der Artikel deutet an, wie z.B. ein mathematischer Term in eine Zwischensprache (hier C++ Makros) überführt werden könnte (s. 8 Abstrakter Syntaxbaum) oder wie man sowas überhaupt auswertet (braucht man für einen echten Compiler ohnehin).

    Es ist aber wirklich nichts für Anfanger!



  • Blauwaal schrieb:

    Ich glaube, ich entscheide mich dafür, es dem Benutzer und seinem Buildtool zu überlassen. Ich hab aber jetzt das Problem, dass wenn mein Compiler in eine cpp-Datei compiliert, der c++-Compiler, weil es keine vollständige Projektmappe ist, das Programm nicht compiliert.

    Wenn du es dem Benutzer überlassen willst, dann ist es auch die Aufgabe des Benutzers die "Projektmappe" (aka. Solution) zu erstellen.
    Sowohl die .sln Files als auch die .vcxproj Files sind allerdings rechte einfache Textfiles. Die kannst du per Clickediclick 1x erstellen und dann beliebige .cpp Files damit übersetzen. Das File .cpp muss halt einfach nur immer gleich heissen. Bzw. wenn du das .vcxproj File aufmachst siehst du da drin auch sofort den Namen des .cpp Files und wie man den ändern kann sollte dann klar sein.

    Du kannst aber auch einfach den Compiler direkt aufrufen. Der heisst CL.EXE und ist ein ganz normales Commandline-Tool. Der übersetzt einzelne .cpp Files und braucht keine Projektmappen - bzw. er kann damit nicht mal was anfangen. Dann noch linken (LINK.EXE) und fertig ist dein Programm. Die Kommandozeilenparameter für die beiden Programme sind im Internet auch gut dokumentiert, kannst du dir schnell selbst rausgoogeln.



  • Vielen Dank für eure Antworten. Ich habe tatsächlich ein bisschen durcheinandergebracht. Aber eure Antworten haben mir geholfen, wie ich an meinem Projekt weiterarbeiten kann. Nochmals Dankeschön.


Anmelden zum Antworten