[C#] Doppelte Deklaration einer Variablen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Affje800, 12. August 2013 .

  1. 12. August 2013
    Doppelte Deklaration einer Variablen

    Hallo,

    ich schreibe für die Vorlesung Compilerbau gerade einen PL/0 Compiler.
    Der Compiler ist so weit auch fertig und funktioniert einwandfrei, bis auf ein kleines Problem. Ich habe einen Cross-Compiler nach C# geschrieben, der eben einen PL/0 Quelltext in C# übersetzt.

    In PL/0 ist es möglich, in jedem Scope beliebige Variablen zu deklarieren, auch welche, die vorher bereits deklariert wurden, beispielsweise so:

    Code:
    VAR a, d;
     
     PROCEDURE f;
     VAR b, d;
     
     PROCEDURE g;
     VAR c, d;
     BEGIN
     a := 12;
     b := 22;
     c := 32;
     d := 42;
     ! a;
     ! b;
     ! c;
     ! d;
     END;
     
     BEGIN
     a := 11;
     b := 21;
     d := 41;
     CALL g;
     ! a;
     ! b;
     ! d;
     END;
     
    BEGIN
     a := 10;
     d := 40;
     CALL f;
     ! a;
     ! d;
    END.
    
    Wie man sieht, ist die Variable d z.b. mehrfach mal deklariert. Ich bilde alle geschachtelten Blöcke in C# als Delegaten ab, mein Compiler erzeugt beim obigen Beispiel den folgenden Code:

    Code:
    /*
    * Dieser C# Code entspricht dem PL/0 Programm "Beispiele/speicher-g-in-f.pl0".
    */
    
    using System;
    
    class GeneratedCode
    {
     delegate void Delegate_f();
     delegate void Delegate_g();
    
     public static void Main()
     {
     int a = 0;
     int d = 0;
    
     Delegate_f del_f = delegate
     {
     int b = 0;
     int d = 0;
    
     Delegate_g del_g = delegate
     {
     int c = 0;
     int d = 0;
     a = 12 ;
     b = 22 ;
     c = 32 ;
     d = 42 ;
     Console.WriteLine(a);
     Console.WriteLine(b);
     Console.WriteLine(c);
     Console.WriteLine(d);
     };
     a = 11 ;
     b = 21 ;
     d = 41 ;
     del_g();
     Console.WriteLine(a);
     Console.WriteLine(b);
     Console.WriteLine(d);
     };
     a = 10 ;
     d = 40 ;
     del_f();
     Console.WriteLine(a);
     Console.WriteLine(d);
    
     }
    };
    
    Ein Kommilitone meinte, es würde funktionieren, irgendwie mit Actions. Ist in einer Action eine Variable deklariert, die in einem äußeren Scope bereits definiert wurde, so hat die lokale Vorrang, aber irgendwie funktioniert das auch nicht.

    Code:
     public static void Main(String[] args)
     {
     int b = 0;
    
     Action a = new Action(delegate
     {
     int b = 0;
     Console.WriteLine("Test A");
    
     Action c = new Action(delegate
     {
     Console.WriteLine("Test C");
     });
    
     c.DynamicInvoke();
    
     });
    
     a.DynamicInvoke();
     }
    
    Der Kollege ist leider im Urlaub, sonst könnte ich ihn nochmal fragen.
     
  2. 12. August 2013
    Zuletzt bearbeitet: 12. August 2013
    AW: Doppelte Deklaration einer Variablen

    Ich weiß nicht wie C# mit delegates umgeht, aber zur Not kannst du auf Name-Mangling zurückgreifen und die Geltungsbereiche damit nachbilden.

    Würde dann so in der Art aussehen:
    Code:
    /*
    * Dieser C# Code entspricht dem PL/0 Programm "Beispiele/speicher-g-in-f.pl0".
    */
    
    using System;
    
    class GeneratedCode
    {
     delegate void Delegate_f();
     delegate void Delegate_g();
    
     public static void Main()
     {
     int a = 0;
     int d = 0;
     int _del_f__b;
     int _del_f__d;
     int _del_f__del_g__c;
     int _del_f__del_g__d;
     
     Delegate_f del_f = delegate
     {
     _del_f__b = 0;
     _del_f__d = 0;
    
     Delegate_g del_g = delegate
     {
     _del_f__del_g__c = 0;
     _del_f__del_g__d = 0;
     a = 12 ;
     _del_f__b = 22 ;
     _del_f__del_g__c = 32 ;
     _del_f__del_g__d = 42 ;
     Console.WriteLine(a);
     Console.WriteLine(_del_f__b);
     Console.WriteLine(_del_f__del_g__c);
     Console.WriteLine(_del_f__del_g__d);
     };
     a = 11 ;
     _del_f__b = 21 ;
     _del_f__d = 41 ;
     del_g();
     Console.WriteLine(a);
     Console.WriteLine(_del_f__b);
     Console.WriteLine(_del_f__d);
     };
     a = 10 ;
     d = 40 ;
     del_f();
     Console.WriteLine(a);
     Console.WriteLine(d);
    
     }
    };
     
  3. 16. August 2013
    AW: Doppelte Deklaration einer Variablen

    Er könnte sich den Aufwand für Name-Mangling auch sparen und Variablen einfach stur mit den Namen Var0, Var1, Var2 usw benennen. Er muss seinem Compiler so der so beibringen, die Namen im aktuellen Scope richtig aufzulösen. Keine Ahnung wie sein Parser aufgebaut ist, aber es sollte nicht zu schwierig sein das ganze bei dieser Sprache on-the-fly zu realisieren.
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.