FACULDADE ANGLO AMERICANO FOZ DO IGUAÇU Curso de Ciência da Computação 7º Periodo Disciplina: Compiladores Prof. Erinaldo Sanches Nascimento Análise Sintática LL(1) Análise Sintática Descendente
Introdução Os analisadores sintáticos preditivos podem ser construídos para uma classe de gramática chamada LL(1). L (Left-to-right) significa que a cadeia de entrada é escandida da esquerda para a direita. L (Leftmost) representa uma derivação mais à esquerda 1 pelo uso de um símbolo à frente na entrada utilizando um cada passo para tomar as decisões quanto à ação de análise. http://erinaldosn.wordpress.com 2
Definição Uma gramática G é LL(1) se e somente se, sempre que A forem duas produções distintas de G, as seguintes condições forem verdadeiras: 1. Para um terminal a, tanto quanto não derivam cadeias començando com a. 2. No máximo um dos dois, ou, pode derivar a cadeia vazia. 3. Se *, então não deriva nenhuma cadeia começando com um terminal em FOLLOW(A). De modo semelhante se *, então não deriva qualquer cadeia começando com um terminal FOLLOW(A). http://erinaldosn.wordpress.com 3
Método Básico Utiliza uma pilha explícita Facilita e agiliza a visualização as ações do analisador sintático LL(1) http://erinaldosn.wordpress.com 4
Exemplo Gramática que gera cadeias de parênteses balanceados: S ( S ) S Pilha de análise sintática Entrada Ação 1 $S ( ) $ S ( S ) S 2 $ S) S ( ( ) $ casamento 3 $ S ) S ) $ S 4 $ S ) ) $ casamento 5 $ S $ S 6 $ $ aceita http://erinaldosn.wordpress.com 5
Lista de Ações S ( S ) S [S ( S ) S] ( ) S [S ] ( ) [S ] http://erinaldosn.wordpress.com 6
Tabela Quatro colunas: 1) Enumera os passos. 2) Mostra o conteúdo da pilha de análise sintática. O final da pilha à esquerda. O topo da pilha à direita. 3) Mostra a entrada da esquerda para a direita. 4) Apresenta uma descrição resumida da ação. http://erinaldosn.wordpress.com 7
Analisador Descendente Coloca o símbolo de início na pilha. Substitui um não-terminal no topo da pilha por uma de suas escolhas na regra gramatical a) Substituir um não-terminal A no topo da pilha por uma cadeia com base na escolha da regra gramatica A ; b) Casar uma marca no topo da pilha com a marca de entrada seguinte Aceita uma cadeia de entrada se, após uma série de ações, a pilha e a entrada ficarem vazias. http://erinaldosn.wordpress.com 8
Árvore de Análise Sintática Construir nós à medida que cada terminal ou não-terminal é colocado na pilha. O nó-raiz é construído no começo da análise sintática. Os nós de cada um dos símbolos de substituição são construidos à medida que os símbolo são colocados na pilha e são concatenados como filhos do nó de S que eles substituem na pilha. Modifique a pilha de forma a conter apontadores para os nós construidos, em vez de conter só os terminais e não-terminais. http://erinaldosn.wordpress.com 9
Tabela de Reconhecimento Sintático Preditivo M[A, a], um arranjo bidimensional A é um não-terminal a é um terminal ou símbolo $ (marcador de fim de entrada) Entrada: gramática G. Saída: tabela de análise M. Método: para cada produção A gramática faça o seguinte: da http://erinaldosn.wordpress.com 10
Algoritmo 1. Para cada terminal a em FIRST(A), inclua A em M[A, a]. 2. Se pertence a FIRST( ), inclua A em M[A,b] para cada terminal b em FOLLOW(A). Se pertence a FIRST( ) e $ pertence a FOLLOW(A), acrescente também A em M[A,$]. Se, depois de realizar esses passos, não houver produção alguma em M[A, a], então defina M[A, a] como error. http://erinaldosn.wordpress.com 11
Complemento do Algoritmo Uma gramática é LL(1) se a tabela de análise sintática LL(1) associada tiver no máximo uma produção em cada célula. Uma gramática LL(1) não pode ser ambigua http://erinaldosn.wordpress.com 12
Exercício 1 Considere a gramática simplificada de declarações if: declaracao if-decl outra if-decl if (exp) declaracao else-parte else-parte else declaracao exp 0 1 Dada a cadeia if (0) if (1) outra else outra Representa a tabela que mostre as ações do algortimo de análise sintática LL(1). http://erinaldosn.wordpress.com 13
Exercício 2 Considere a gramática de expressões reduzidas: E n E E + n E Efetue a computação do valor da expressão 3+4+5 mostrando as ações do analisador sintático na tabela. http://erinaldosn.wordpress.com 14
Exercício 3 Utilize uma pilha S para executar a verificaçao de grupos de parênteses em expressões aritméticas com uma varredura simples da esquerda para direita. Cada vez que se encontra uma símbolo de abertura insere-se o símbolo na pilha e cada vez que se encontra uma símbolo de fechamento retira-se o símbolo do topo da pilha S (assumindo-se que a pilha não está vazia). Se a pilha estiver vazia após ter sido processada toda a sequência, então os símbolos em X casam. http://erinaldosn.wordpress.com 15
http://erinaldosn.wordpress.com 16