J'ai un problème avec cet exercice:
Soit G la grammaire ambiguë suivante pour le λ-calcul:
E → v | λv.E | EE | (E)
où E est le symbole non terminal unique, λv.E représente l'abstraction par rapport à la variable v dans E et EE représente l'application.
- Définissez une grammaire LL (1) G ′ telle que L (G ′) = L (G) et l'ambiguïté de G soit résolue en imposant les conventions habituelles suivantes:
- l'abstraction est associative droite;
- l'application est laissée associative;
- l'application a une priorité plus élevée que l'abstraction.
- Afficher la table d'analyse LL (1) pour G ′ et l'arbre d'analyse obtenu lors de l'analyse de la chaîne
λv1. λv2. v1v2v1
.
J'ai éliminé l'ambiguïté en établissant la priorité et l'association, obtenant cette grammaire:
E -> EF | F
F -> λv.G | G
G -> (E) | v
qui n'est pas LL (1), puisque la production E -> EF
est laissée récursive. Cependant, en éliminant la récursion gauche de cette production, j'obtiens:
E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v
qui n'est pas conforme à l'exigence 1.2.
J'ai cherché une solution sur Internet, mais il semble qu'il ne soit pas possible d'éliminer la récursion gauche en préservant l'associativité gauche.
Cependant, cet exercice est apparu à l'examen des compilateurs il y a quelques années, il doit donc y avoir une bonne réponse.
Merci de votre aide.
la source
Ma tentative:
Cette grammaire est LL (1) et doit respecter les propriétés requises.
la source