Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - Problema implementazione grammatica L-attribuita
Forum - Algoritmi - Problema implementazione grammatica L-attribuita

Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 10:25
Sabato, 28/09/2013
Ciao a tutti, sto studiando i compilatori dal libro "Compilatori Principi,tecniche e strumenti". Riscontro molti problemi durante l'implementazione di una grammatica LL-attribuita con le sue relative azioni semantiche,usando la tecnica di parsing LL(1).

Per esempio data la seguente grammatica(Le azioni semantiche sono tra {}):

T-> B { t=B.type; w=B.width; }
    C     { T.type=C.type; T.width=C.width; }

B-> int { B.type=integer; B.width=4; }

B-> float { B.type=float; B.width=8; }

C-> ε    { C.type=t C.width=w; }

C-> [ num ] C1 { array(num.value,C1.type); C.width=num.value*C1.width }



Inizialmente sullo stack del parser ci sarà il record del non terminale T, quindi:

|   T          |
|type=?   |
|width=? |
--------------

Ma il parser durante il suo lavoro andrà a sostituire il record di T con i record di Action(per eseguire le azioni semantiche) e quelli relativi ai non terminali B e C.
Quindi se il record di T sullo stack non c'è piu' come si fa ad eseguire le azioni semantiche del non terminale C ?
Dove sbaglio ?

Grazie a tutti !

Ultima modifica effettuata da dmr il 28/09/2013 alle 10:40
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 3:16
Domenica, 29/09/2013
Mm, non credo di aver capito la domanda... potresti formularla diversamente?


Il mio blog: https://piero.dev
PM Quote
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 8:50
Domenica, 29/09/2013
Ok, ti faccio un esempio per farti capire meglio cosa intendo. Facciamo finta di implementare questa grammatica con le sue azioni semantiche:

S-> while (        {L1=new(); L2=new(); C.false=S.next(); C.true=L2; print("label",L1); }
        
          C )            {S1.next=L1; print("label",L2);}
            
          S1

All'inizio del parsing, ci sarà sullo stack il record di S che contiene appunto il non-terminale S con i suoi campi( che sarebbero gli attributi ereditati ). Quindi lo stack inizialmente è:

|   S          |
|next=x   |
--------------

Con la seconda azione del parser, il parser espande S, rimuovendo il record di S dallo stack e mettendo i record di while ( C ) S1 . Quello che non riesco a capire è: se il parser deve cambiare il valore del campo next di S come deve fare se il record non è piu presente sullo stack? ( con la grammatica delle dichiarazioni ho questo problema ).

    

Ultima modifica effettuata da dmr il 29/09/2013 alle 8:51
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 21:37
Domenica, 29/09/2013
Penso la tua domanda sia piu' semplice da formulare in termini di: posso accedere ad un oggetto se non e' allocato nello stack?

La risposta e' si. Il fatto che lo stack (o qualsiasi altra struttura) contanga un *riferimento* ad un particolare oggetto non significa che nel momento in cui il riferimento viene eliminato l'oggetto non e' piu' accessibile. Basta che ci sia un'altro riferimento all'oggetto salvato da qualche altra parte.

Se non era questa la domanda, posso solo suggerire una piu' attenta lettura di come funziona LL parsing (anche da wikipedia). http://en.wikipedia.org/wiki/LL_parser#Parsing_procedure


Il mio blog: https://piero.dev
PM Quote
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 15:20
Mercoledì, 02/10/2013
Ok, grazie !!!

PM Quote