Recursão à esquerda e fatoração à esquerda - qual deles vai primeiro?


8

se eu tiver uma gramática com uma produção que contenha recursão esquerda e fatoração esquerda como

F→FBuma∣cDS∣c

qual deles tem prioridade, recursão esquerda ou fatoração esquerda?


11
Que estratégia de análise você está usando? Para descida recursiva, a recursão esquerda deve ser evitada a todo custo. O fatoração à esquerda é importante se você estiver fazendo uma análise de LL, por exemplo.
— Ken Li

2
Desculpe, esqueci de escrever. Eu estou usando a estratégia analisador top-down (LL (1))
— Andrea Tucci

De acordo com inst.eecs.berkeley.edu , é a mesma coisa! (no terceiro exercício)
— Andrea Tucci

Respostas:


12

Transformações como fatoração à esquerda ou remoção da recursão à esquerda não têm regras de precedência. Obviamente, as gramáticas resultantes podem ser diferentes, mas reconhecerão o mesmo idioma.

O exemplo de gramática da pergunta é mais difícil do que o típico problema de lição de casa na graduação. Portanto, mostrar nosso trabalho será útil.

Recursão Esquerda

Vamos definir uma transformação que remove a recursão esquerda.

Dado

UMA→UMAα0 0∣UMAα1 1∣⋯∣UMAαn∣Bβ0 0∣Bβ1 1∣⋯∣Bβn ,

removemos a recursão esquerda assim:

UMAh→Bβ0 0∣Bβ1 1∣⋯∣BβnUMAt→α0 0∣α1 1∣⋯∣αnUMAt+→UMAtUMAt+∣UMAtUMA→UMAhUMAt+∣UMAh

A generalidade acima não é normalmente apresentada nos textos do compilador, mas a análise de textos como Grune e Jacobs cobre isso. O fatorial esquerdo pode ser aplicado à gramática transformada acima, mas apenas introduzirá regras extras que não mudarão a resposta. Portanto, simplificaremos a apresentação sem que seja realizado um fator extra à esquerda.

Nesta resposta, não abordaremos questões de recursão à esquerda indireta, porque estamos preocupados apenas com as regras de um único não terminal. Observe que a recursão indireta à esquerda pode ser tratada. (Abra uma pergunta separada, se isso for importante.)

Left Factoring

A remoção do fatoramento esquerdo está na maioria dos textos introdutórios do compilador, feitos dessa maneira. Dado

UMA→xy∣xz

rendimentos de fatoração à esquerda:

UMAs→y∣zUMA→xUMAs

Agora isso é realizar as transformações nos dois pedidos.

Factoring esquerdo primeiro

Vamos deixar de lado a gramática da pergunta

Fs→DS∣εF→FBuma∣cFs

e remova a recursão esquerda:

Fh→cFsFt→BumaFt+→FtFt+|FtFs→DS∣εF→FhFt+∣Fh

Removendo a recursão esquerda primeiro

E para os outros pedidos, vamos remover a recursão esquerda da gramática da pergunta

Fh→cDS∣cFt→BumaFt+→FtFt+∣FtF→FhFt+∣Fh

e então deixou o fator terminal :c

Fhs→DS∣εFh→cFhsFt→BumaFt+→FtFt+∣FtF→FhFt+∣Fh

Ah, as gramáticas resultantes são as mesmas!

Em geral, provar que duas gramáticas são equivalentes é indecidível. Portanto, se uma série de transformações gramaticais pudesse influenciar o idioma reconhecido , seria desastroso.


Obrigado, muito bem explicado! Portanto, se eu tenho recursão esquerda e fatoração esquerda, posso escolher qual remover primeiro. Obrigado novamente
— Andrea Tucci

"Em geral, provar que duas gramáticas são equivalentes é indecidível." - quer dizer, provar que isso é impossível, ou quer dizer que não existe algoritmo que sempre faz isso? Somente o último está correto. Além disso, não seria "desastroso" se apenas um pedido mantivesse o idioma inalterado: você teria que usar o pedido correto. Mas certamente está claro que, se as duas transformações forem usadas independentemente de outra, elas não poderão influenciar a linguagem gerada.
— Raphael

Observe que temos aqui ferramentas de formatação bastante sofisticadas (Markdown e LaTeX) para melhorar a clareza. Eu editei sua postagem de acordo. Dê uma olhada.
— Raphael

11
@Raphael A linguagem "prova" é ambígua e a redação "desastrosa", acho que é exagerada. Boa pegada.
— Codd #

@ Rafael Obrigado pela atenção na sintaxe.
— Codd #
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.