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 1 $S 2 $ S) S ( 3 $S)S 4 $S) 5 $S 6 $ Entrada ()$ ()$ )$ )$ $ $ http://erinaldosn.wordpress.com Ação S (S)S casamento S casamento S aceita 5 Lista de Ações S (S)S ()S () [S [S [S http://erinaldosn.wordpress.com ( S ) S] ] ] 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: http://erinaldosn.wordpress.com da 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