Compiladores Análise Sintática Fabiano Baldo
Gramáticas Livre de Contexto (GLC) É utilizada na especificação formal lda sintaxe de uma linguagem de programação. É um conjunto de produções ou regras gramaticais i da seguinte forma: A X 1 X 2 X n A produção tem exatamente um símbolo A do lado esquerdo. Pode ter zero ou mais símbolos X i do lado direito. Por exemplo, uma clausula while é definida desta forma: 2
Gramáticas Livre de Contexto Dois tipos de símbolos podem aparecer em uma GLC: Não terminais: São elementos substituídos pelo lado direitodasproduções das produções, quando aparecemdo lado esquerdo. Terminais: Representam as marcações de uma linguagem g (ou tokens). Uma gramática livre de contexto define uma linguagem: Este linguagem é um conjunto de strings (seqüência) de tokens (terminais) i Cada string de tokens é derivada de uma regra de produção. 3
Gramáticas Livre de Contexto Ex: Considere a seguinte gramática simplificada para expressões: 4
Derivação Uma derivação é uma seqüência de substituições de não terminais por uma escolha das regras de produção gramaticais. A derivação é o método utilizado para a construção de uma cadeia específica de terminais, partindo de um não terminal inicial. Em geral, existem várias derivações para a construção da mesma cadeia de não terminais. 5
Derivação Verificar se a seqüência de tokens é reconhecida: Inicia se com o símbolo não terminal chamado raiz; Aplica se produções, substituindo não terminais, até somente restarem terminais; Uma derivação substitui um não terminal pelo lado direito de uma de suas produções; O símbolo denota um passo de derivação. 6
Derivação Ex: Derivação da cadeia (num + num) * num é apresentada abaixo: 7
Definição Formal de GLC Uma Gramática livre de contexto consiste em: Um conjunto finito de terminais T Um conjunto finito de não terminais N (disjunto de T) Um símbolo inicial S Є N Um conjunto de produções ou regras gramaticais P Uma regra de produção é da forma: tal que e Um produção com zero símbolos no lado direito (n = 0) é da forma: Uma produção também é escrita como:, tal que 8
Linguagem de uma Gramática A linguagem de uma gramática G é O símbolo de derivação pode ser estendido: : Derivado em um ou mais passos : Derivado em zero ou mais passos Freqüentemente, mais de uma produção compartilham o mesmo lado esquerdo da produção É o mesmo que: 9
Derivação mais à Esquerda e mais à Direita Derivação mais à esquerda de uma sentença é a seqüência de formas sentenciais que se obtém derivando sempre o símbolo não terminal mais à esquerda; Derivação mais à direita é a seqüência de formas sentenciais que se obtém derivando sempre o símbolo não terminal mais à direita; 10
Derivação mais à Esquerda Ex: (num + num) * num 11
Derivação mais à Direita Ex: (num + num) * num 12
Propriedades de GLC Gramática sem ciclos: É uma gramática que não possui derivação da forma: Gramáticas com ε produção: É uma gramática que possui produção do tipo A ε Gramática recursiva à esquerda: É uma gramática que permite e derivação do tipo: Gramática recursiva à direita: É uma gramática que permite derivaçãodo do tipo: 13
Propriedades de GLC A recursividade em GCL é importante, pois a repetição poder ser construída através da recursão. As ε produções sãotambém úteis para definir estruturas opcionais da linguagem. 14
Arvore de Análise Sintática Uma árvore de análise sintática é uma árvore rotulada cujos nós interiores são rotulados por nãoterminais, já os nós folha são rotulados por terminais. Os filhos de cada nó interno representam a substituição do não terminal associado em um passo de derivação. 15
Arvore de Análise Sintática É uma representação gráfica da derivação de uma sentença, que: Filtra as escolhas levando em consideração a ordem de substituição; Tem como raiz da árvore o não terminal inicial S Nós internos representam não terminais pertencentes a N Nós folhas são terminais em T ou ε O nó A pode ter filhos se existir a regra 16
Arvore de Análise Sintática Ex: (num + num) * num 17
Enumeração Pré ordem e Pósordem Uma árvore de derivação pode ser construída de derivações à esquerda ou à direita. Derivações mais à esquerda produzem uma árvore enumerada em pré ordem. Derivações mais à direita produzem uma árvore enumerada e adaem pós ordem ode invertida. Enumeração pré ordem corresponde ao parsing top down Enumeração pós ordem corresponde ao parsing botton up. 18
Enumeração em Pré ordem 19
Enumeração em Pós ordem Invertida 20
Árvore Sintática Abstrata Uma árvore de análise sintática contém muito mais informação que o necessário para um compilador gerar código executável. Uma árvore sintática abstrata pode ser entendida como uma representação em forma de árvore de uma notação simplificada. 21
Árvore Sintática Abstrata Ex: (3+4)*2 22
Árvore Sintática Abstrata O princípio da tradução dirigida por sintaxe estabelece que o significado da sentença está diretamente relacionado a sua estrutura sintática representada na árvore. Assim, a posição que cada token na árvore indica sua relação com os outros tokens reconhecidos. 23
Gramática Ambígua É uma gramática que permite construir mais de uma árvore de derivação para uma mesma sentença. Isto representa um problema para o analisador sintático, pois ela não especifica com precisão a estrutura sintática do um programa. Este sepobe problema apode ser comparado ado ao dos autômatos não determinísticos, onde dois caminhos podem aceitar a mesma cadeia. 24
Gramática Ambígua A eliminação de ambigüidade não é tão simples como a eliminação de não determinismo em autômatos. Existem duas maneiras: Estabelecer uma regra que especifique a cada caso ambíguo qual é o caminho correto. (Sem alterar a gramática) Alterar a gramática para forçar a construção da árvore sintática i correta, removendo a ambigüidade. d 25
Gramática Ambígua Infelizmente só isso não garante que a gramática não possui ambigüidade. 26
Eliminação de Ambigüidade Para tratar o problema de ambigüidade em gramática são utilizados os conceitos de precedência e associatividade. Eles especificam uma ordem na avaliação dos operadores. Operadores es com maior ao precedência c são avaliados aaados primeiro. Operadores com igual precedência são avaliados de acordo com a associatividade (esquerda direita, direta esquerda) esquerda). 27
Eliminação de Ambigüidade Para tratar a precedência dos operadores: Divide se os operadores em grupos de igual precedência Para cada nível de precedência, introduz se um não terminal e uma regra gramatical Para tratar a associatividade dos operadores: Cria se regras gramaticais que serão recursivas à direita ou à esquerda. 28
Eliminação de Ambigüidade Gramática para expressões sem ambigüidade 29
Ambigüidade da declaração Else Considera a seguinte gramática para a declaração do If 30
Ambigüidade da declaração Else Existem duas árvores de derivação para: As duas árvores traduzem diferentemente a parte else: 31
Eliminação da Ambigüidade do Else A eliminação da ambigüidade pode ser feita dessa forma: Esta regra é denominada de regra de aninhamento com o mais próximo; 32