28/09/13 8:25
dmr
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 !
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 28/09/13 8:40
aaa