Ho un problema con questo esercizio:
Sia G la seguente ambigua grammatica per il calcolo λ:
E → v | λv.E | EE | (E)
dove E è il singolo simbolo non terminale, λv.E rappresenta l'astrazione rispetto alla variabile v in E ed EE rappresenta l'applicazione.
- Definire una grammatica LL (1) G ′ tale che L (G ′) = L (G) e l'ambiguità di G sia risolta imponendo le seguenti convenzioni usuali:
- l'astrazione è associativa giusta;
- l'applicazione è lasciata associativa;
- l'applicazione ha una priorità maggiore rispetto all'astrazione.
- Mostra la tabella di analisi LL (1) per G ′ e l'albero di analisi ottenuto durante l'analisi della stringa
λv1. λv2. v1v2v1
.
Ho eliminato l'ambiguità impostando la precedenza e l'associazione, ottenendo questa grammatica:
E -> EF | F
F -> λv.G | G
G -> (E) | v
che non è LL (1), poiché la produzione E -> EF
viene lasciata ricorsiva. Tuttavia, eliminando la ricorsione sinistra da quella produzione ottengo:
E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v
non conforme al requisito 1.2.
Ho cercato una soluzione su Internet, ma sembra che non sia possibile eliminare la ricorsione di sinistra preservando l'associatività di sinistra.
Tuttavia, questo esercizio è apparso sull'esame dei compilatori alcuni anni fa, quindi ci deve essere una risposta corretta.
Grazie per l'aiuto.