Symboltable Deklararion Variablen Compilerbau



  • Hallo,

    bau mir grad nen Compiler. Variablen müssen ja deklariert sein, bevor sie verwendet werden. Sowas geht ja nicht.

    class X{
    
        funk()
       {
            member = 7;
            int member;
       }
    
    }
    

    Wenn ich mir jetzt die Symboltabelle aufbaue, dann nehme ich ja die Deklaration von member in die Symboltabelle auf. Wenn ich dann den nächsten Durchlauf mache und prüfe ob member deklariert ist, dann scheint das ja der Fall zu sein, weil es in der Symboltabelle ist. Wie mach ich das jetzt am besten ? Mein Ablauf ist eben so dass ich erst die Symboltabelle aufbau und dann nochmal durch das Programm gehe und prüfe ob die Variablen deklariert sind. Daran will ich auch nichts ändern. Natürlich könnt ich es so machen , dass ich bie jeder Variablen prüfe ob sie schon deklariert ist, aber dann hätt ich ja auch wieder das Problem mit den member denn die wiederum dürfen ja nach der Verwendung deklariert sind.



  • dann muss du wohl zu jedem Symbol speichern, wo dessen Scope beginnt und endet.



  • 1. was soll der Sinn von

    member = 7;
    int member;
    

    sein?

    was machst du wenn ich sowas schreibe

    member = "hallo";
    int member;
    member = "du"
    

    2. wenn du einen sauberen AST (https://en.wikipedia.org/wiki/Abstract_syntax_tree) hast kannst du doch problemlos alles machen wie du es willst - falls du den nicht hast wirst definitiv noch in andere Problem, die da kommen werden, laufen



  • Gast3 schrieb:

    was machst du wenn ich sowas schreibe

    member = "hallo";
    int member;
    member = "du"
    

    Nur das 1.member gibt einen fehler, das 2. nicht. Im ersten Schritt bau ich mir die Symboltabelle auf und trage member ein. Beim 2.Durchlauf prüfe ich ob member deklariert wurde. Jetzt sollte ich einen Fehler bekommen aber das ist nicht der Fall da member in der Symboltabelle steht und es den Anschein hat es wurde ordnungsgemäß deklariert. Meine Lösung dafür wäre jetzt.

    Beim 1.Durchlauf prüfe ich falls ich auf eine Variable treffe ob sie in der aktuellen Symboltabelle ist. Falls nicht setz ich ein flag und prüfe beim 2.Durchlauf ob sie vielleicht ein member ist. Falls nicht gibts nen Fehler 😞



  • Hallo,

    lies dir mal den Artikel Compilerbau durch, insbs. das Kapitel über Variablen. Dort wird auch erklärt, wie man mit Scopes richtig umgeht.
    Welche Sprache willst du denn umsetzen? Vollständiges C++ ist (bezogen auf Scopes) jedoch etwas umfangreicher, als dein naiver Ansatz.
    Was ist, wenn du zwei Klassen hast (oder Unterklassen)? Dann kannst du doch nicht einfach auf alle Variablen zugreifen...
    Du benötigst also verschiedene Symboltabellen (global, Klassen, lokal), welche du je nach Scope befüllst und darauf dann zugreifst.
    Folgendes wäre ja gültiger C++ Code:

    class X
    {
        int member;
    
        void funk()
        {
            member = 7;
            int member;
            member = 10;
       }
    };
    

    (in C# dagegen führt dies zu einem Fehler)



  • Eine Klasse hat ja seine eigene Symboltabelle. Beiden Klassen wären also auf derselben Hierarchie und eine Klasse ist ein Child einer Compilation Unit.

    Also deine Code Beispiel funktioniert ? Hmm. Das 1.member bezieht sich wohl auf den Klassenmember und das 2. dann auf die lokale Variable. Schätz ich mal.




  • Mod

    WarriorInC schrieb:

    Wenn ich mir jetzt die Symboltabelle aufbaue, dann nehme ich ja die Deklaration von member in die Symboltabelle auf. Wenn ich dann den nächsten Durchlauf mache und prüfe ob member deklariert ist, dann scheint das ja der Fall zu sein, weil es in der Symboltabelle ist.

    Das funktiniert in C so nicht, weil die Gramatik nicht kontextfrei ist.

    int x = 0, y = 0;
    x * y; // keine Deklaration
    
    typedef void x;
    x * y: // Deklaration
    

Log in to reply