Removendo a recursão esquerda na gramática, mantendo a associação esquerda do operador


13

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.

  1. 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:
    1. abstração é associativa correta;
    2. a aplicação é deixada associativa;
    3. aplicativo tem prioridade mais alta que a abstração.
  2. 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.

Respostas:


11

Compatibilidade da associatividade esquerda e análise de LL (1)

Você acabou de atingir uma das principais inconsistências no uso da sintaxe sem contexto (CF). As pessoas querem escolher gramáticas para que a árvore-análise reflita a estrutura pretendida da sentença, próxima à sua semântica, especialmente no caso de operadores não associativos, como aplicação . Essa era basicamente a intenção original das gramáticas da FC em linguística. Mas, ao mesmo tempo, estão se restringindo a analisar a tecnologia que tolerará apenas alguns tipos de gramática.

De fato, se a árvore analítica deve refletir a associatividade esquerda de um operador, a gramática é necessariamente recursiva à esquerda, pois o nó do aplicativo principal na árvore analítica está necessariamente adicionando o termo mais à direita de aplicativos sucessivos não paretésizados. Portanto, a análise de LL está fora de questão. Você está certo.

Existem duas maneiras de sair disso. Não se deve confiar no analisador para fornecer a "árvore de análise" rígida a ser usada para estágios posteriores do processamento (como a redução da expressão lambda, aqui). Isso levou ao conceito de Abstract Syntax Trees (AST) que pode ser construído a partir da árvore de análise, mas com uma estrutura diferente.

A outra solução é usar técnicas de análise mais gerais que aceitem qualquer gramática de CF e analisem de acordo com ela. Analisadores gerais de CF são uma tecnologia bem desenvolvida (e não paro de me perguntar por que o LL continua tão popular).

Não tenho idéia do que poderia ser considerado uma resposta adequada a esses requisitos contraditórios.

O que eu faria é mostrar que eles são requisitos contraditórios. Dê uma primeira gramática que atenda às restrições de associatividade e prioridade e depois transforme a gramática em e LL (1) para a análise.

O fato de algo aparecer em um diário ou em um exame não é uma garantia total de que está correto. E posso estar errado também ... mas fiz algumas verificações, além do meu próprio conhecimento do problema.

Sobre este exemplo específico

Dito isto, a primeira gramática que você está sugerindo não parece muito correta. Não tem como produzir λu.λv.v.

Um truque a saber é começar com operadores (aqui abstração ou aplicativo) com a menor prioridade (abstração). É o mesmo para expressões aritméticas.


Muito obrigado pelo seu comentário detalhado. Você está certo, eu cometi um erro com a primeira gramática, obrigado por isso também. Vou perguntar ao professor então.
Marco DallaG

Posso acrescentar à resposta, com uma pequena nota sobre o design da gramática para manequins (eu também), se você estiver interessado. Além disso, conte-nos o que seu professor diz sobre isso.
Babou 29/05

Vou atualizar o tópico quando o professor responder a essa pergunta. De qualquer forma, fique à vontade para adicionar mais informações, se isso não for um problema para você, é claro que eu apreciaria muito isso. Obrigado novamente por sua ajuda
Marco DallaG

@MarcoDallaG Deparei com isso ao trabalhar na TAPL de Pierce. O seu professor disse algo diferente desta resposta? :)
lcn

0

Minha tentativa:

E  -> A | λv.E
A  -> FA'
A' -> A | ɛ
F  -> (E) | v

Essa gramática é LL (1) e deve respeitar as propriedades necessárias.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.