Compiladores Prof. Bruno Moreno Aula 4 – 11/03/2011 Especificação de uma LP Uma linguagem de programação pode ser definida pela Descrição da aparência de seus programas Sintaxe Descrição do que os programas significam Semântica Para especificar a sintaxe ... utilizamos uma BNF Backus-Naur Form Gramática Livre de Contexto Gramática Livre de Contexto Utilizada como auxílio para guiar a tradução de programas Tradução dirigida por sintaxe Descreve uma estrutura hierárquica de muitas construções de linguagens de programação Exemplo (C) Comando if-else if (expressão) comando else comando Gramática Livre de Contexto Comando if-else if (expressão) comando else comando cmd if (expr ) cmd else cmd Regra de Produção token token Não-terminais Gramática Livre de Contexto Possui quatro componentes (1) Conjunto de tokens (2) Conjunto de não-terminais (3) Conjunto de regras de produção Símbolos terminais Produção é formada por um não-terminal do lado esquerdo, uma seta e uma seqüência de tokens e/ou não terminais no lado direito da seta (4) Uma designação de um dos não-terminais como símbolos de partida Gramática Livre de Contexto O símbolo de partida figura na frente dos demais Símbolos terminais Dígitos, sinais (<=, <, +, etc) e cadeias de caracters em negrito (e.g while, for) Não-terminais Itálico OU | Gramática Livre de Contexto Exemplo 1 Gramática para construir as seguintes expressões 9–5+2 3–1 7 Símbolos não-terminais lista lista lista dígito lista + dígito lista - digito dígito lista lista + digito | lista - digito | dígito 0|1|2|3|4|5|6|7|8|9 Símbolos terminais = tokens Gramática Livre de Contexto Exemplo 2 A linguagem PASCAL permite definir uma lista vazia A gramática abaixo permite a construção de uma lista em PASCAL bloco begin cmd_opcs end cmd_opcs lista_cmds | lista_cmds lista_cmds ; cmd | cmd Árvores Gramaticais Utilizadas para mostrar como um símbolo de partida, definido em uma gramática, gera uma cadeia de linguagem (frase) A XYZ A X Y Z Árvores Gramaticais Árvore gramatical para 9 – 5 + 2 lista lista lista + digito | lista - digito | dígito lista dígito 9 lista + dígito – dígito 2 5 Árvores Gramaticais Uma árvore gramatical possui as seguintes propriedades 1. A raiz é rotulada pelo símbolo de entrada da gramática 2. Cada folha é um token ou 3. Cada nó interior é um não-terminal 4. Se A é um não-terminal e X1, X2 e Xn são seus filhos A X1 X2 Xn é uma produção 5. Se A , então deve possui um único filho: Árvores Gramaticais A leitura sempre deve ser feita da esquerda lista para a direita + lista lista dígito 9 – dígito 5 dígito 2 Ambiguidade Uma gramática que pode ter mais do que uma árvore gramatical gerando uma mesma cadeia de tokens é dita ambígua Para mostrar que uma gramática é ambigua é necessário encontrar uma cadeia de tokens que tenha mais do que uma árvore gramatical Ambiguidade As LPs devem ser definidas de modo a não permitir amiguidades cadeia cadeia + cadeia | cadeia - cadeia |0|1|2|3|4 |5|6|7|8|9 Qual seria a árvore sintática para a expressão “9 – 5 + 2”? Ambiguidade cadeia cadeia + cadeia – cadeia cadeia 9 5 cadeia cadeia cadeia 2 9 cadeia - cadeia 5 + cadeia 2 Associatividade dos Operadores 9+5+2 Quando um operando recebe operadores à esquerda e à direita (9 + 5) + 2 9 + (5 + 2) São necessárias convenções para saber que operador recebe o operando primeiramente Na maioria das LPs os quatro operadores aritméticos são associativos a esquerda Associatividade dos Operadores O operador de atribuição em C é associativo a direita a=b=c a=c Gramática de geração de operador associativo à direita direita letra letra = direita | letra a | b | ... | z Gramática de geração de operador associativo à esquerda Deve ser provado com uma árvore de decisão Associatividade dos Operadores lista lista lista dígito – + dígito 5 direita dígito letra 2 a = direita letra = b direita letra c 9 Precedência de Operadores 9+5*2 (9 + 5) * 2 9 + (5 * 2) A associatividade de + e de * não resolve essa ambigüidade pelo fato de que os operadores da direita e da esquerda dos operandos são diferentes Precisamos conhecer a precedência relativa dos operadores Precedência de Operadores Na matemática, * e ÷ têm precedência mais alta do que + e – 9+5*2 A precedência e a associatividade de operadores pode ser representada em uma gramática Sintaxe de Expressões São criados dois não-terminais para representar os dois níveis de precedência expr e termo É criado um não-terminal extra para gerar as unidades básicas das expressões fator termo termo * fator | termo / fator | fator fator expr digito | (expr) expr + termo | expr - termo | termo Sintaxe de Expressões expr termo fator expr + termo | expr – termo | termo termo * fator | termo / fator | fator digito | (expr) Sintaxe de Comandos cmd id := expr | if expr then cmd | if expr then cmd else cmd | while expr do cmd | begin cmd_opcs end