Estou com um problema com este exercício:
Seja G a seguinte gramática ambígua para o cálculo λ:
E → v | λv.E | EE | (E)
onde E é o único símbolo não terminal, λv.E representa a abstração da variável v em E e EE representa a aplicação.
- Defina uma gramática LL (1) G ′ de modo que L (G ′) = L (G) e a ambiguidade de G sejam resolvidas impondo as seguintes convenções usuais:
- abstração é associativa correta;
- a aplicação é deixada associativa;
- aplicativo tem prioridade mais alta que a abstração.
- Mostre a tabela de análise LL (1) para G ′ e a árvore de análise obtida ao analisar a sequência
λv1. λv2. v1v2v1
.
Eliminei a ambiguidade, estabelecendo precedência e associação, obtendo esta gramática:
E -> EF | F
F -> λv.G | G
G -> (E) | v
que não é LL (1), pois a produção E -> EF
é deixada recursiva. No entanto, eliminando a recursão esquerda dessa produção, obtenho:
E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v
que não cumpre o requisito 1.2.
Procurei uma solução na Internet, mas parece que não é possível eliminar a recursão à esquerda preservando a associatividade à esquerda.
No entanto, este exercício apareceu no exame de compiladores há alguns anos, portanto, deve haver uma resposta correta.
Obrigado pela ajuda.
fonte
Minha tentativa:
Essa gramática é LL (1) e deve respeitar as propriedades necessárias.
fonte