Verschachtelte Blöcke

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Verschachtelte Blöcke
Wie habt ihr das implemetiert?
Mir fällt nur eine Lösung ein, bei denen zuerste der innerste Block komplett ausgeführt wird, dann der äußere… was aber wohl nicht ganz der “java-realität” (wie gefordert) entspricht.
oder versteh ich die aufgabe einfach falsch… es soll zwar möglich sein, zugriffsrechte zu überprüfen, aber kein mensch will eigentlich verschachtelte blöcke machen? :gun:


afaik war das nicht verlangt.
meins prueft den aktuellen block, obs die anheforderte variabe gibt, nicht aber den upper block.
im mom gibts ja auch garkeinen upperblock


ich versteh die frage zwar nicht ganz aber im prinzip ist esganz einfach

block1:
{
var int i;
var int z;
block2:
{
var int i
}
}

stells dir mal so vor

führe ich bock 2 aus und suche nach i dann bekomm ich i aus block 2
suche ich z bekomm ich z aus block 1
weil i lokal deklariert wurde

nun wie mach ich das?

Pseudocode:

ALGOBLock:
public searchforvariable( string varname)
{
var = null;
var = getvar(varname);
if( var == null)
var =upperblock->searchforvariable(varname);

}

das is schön rekursiv zu implementieren und bedarf keines großen aufwands


genau :slight_smile: du hast die frage nicht richtig verstanden :finger: :wink:

program {
    var int i;
    i = 1;
    {
        var int i;
        i = 2;
        print i;
    }
    print i;
}

Ausgabe:
1
2

sollte das aber nicht eigentlich
2
1
sein? also eben: führe block aus… neuer block…führe neuen block aus… neuer block ende… führe alten block weiter aus… ende

so war die frage gemeint. aber danke trotzdem :slight_smile:


du leitest ALGOBlock von ALGOStatement ab und packst bei jedem vorkommen eines “subblocks” in deiner Grammatik den inneren Block der zurückgegeben wurde einfach mit in die StatementTab des oberen Blocks. kleine Änderungen an execute() notwending, funktioniert aber 1a.


gehts net leicher

program returns [ALGOProgram prog]
{
prog = null;
ALGOBlock firstblock = null;
ALGOBlock b = null;
ALGOBlock lastblock=null;
}:
SYM_PROGRAM (b = block
{
if(firstblock == null && b)
firstblock = b;

if(b && lastblock)
lastblock.upperblock = b;

lastblock = b;

})*
;

block sollte nen block zurückgeben damit das funzt
is ne blockverschachtelung zu ende wird lastblock automatisch wieder auf null gesetzt


ich muss mich korrigieren das (block)* müsst ihr in block rekursive aufrufen damit es funktioniert