Esta é uma pergunta do Dragon Book. Esta é a gramática:
A pergunta pergunta como mostrar que é LL (1), mas não SLR (1).
Para provar que é LL (1), tentei construir sua tabela de análise, mas estou obtendo várias produções em uma célula, o que é contradição.
Por favor, diga como é este LL (1) e como provar isso?
formal-grammars
compilers
parsers
Vinayak Garg
fonte
fonte
Respostas:
Primeiro, vamos dar um número às suas produções.
Vamos calcular o primeiro e seguir os conjuntos primeiro. Para pequenos exemplos como esses, usar a intuição sobre esses conjuntos é suficiente.
Agora vamos calcular a tabela . Por definição, se não temos conflitos, a gramática é L L ( 1 ) .LL(1) LL(1)
Como não há conflitos, a gramática é .LL(1)
Agora, para a tabela . Em primeiro lugar, o G R ( 0 ) autómato.SLR(1) LR(0)
E então a tabela (presumo que S possa ser seguido por qualquer coisa).SLR(1) S
Existem conflitos no estado 0, então a gramática não é . Note-se que se L A L R ( 1 ) foi utilizado em vez disso, em seguida, ambos os conflitos seria resolvido correctamente: no estado 0 em antecipação um G Um G R ( 1 ) levaria R3 e em antecipação b levaria R4.SLR(1) LALR(1) a LALR(1) b
Isso suscita a questão interessante de saber se existe uma gramática mas não L A L R ( 1 ) , que é o caso, mas não é fácil encontrar um exemplo.LL(1) LALR(1)
fonte
Se você não for solicitado, não precisará construir a tabela LL (1) para provar que é uma gramática LL (1). Você apenas calcula os conjuntos PRIMEIRO / SEGUINTE como Alex fez:
E então, por definição, uma gramática LL (1) deve:
Então, para a gramática dada:
Quanto à análise SLR (1), acho que é perfeita!
fonte
Procure uma condição suficiente que faça uma gramática LL (1) (dica: veja os PRIMEIROS conjuntos).
Procure uma condição necessária que todas as gramáticas SLR (1) devem atender (dica: veja os conjuntos de SEGUINTES).
fonte