260 likes | 453 Views
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.
E N D
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-NaurForm 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 elsecomando
Gramática Livre de Contexto • Comando if-else • if(expressão) comando elsecomando • cmd if(expr) cmd elsecmd Regra de Produção token token Não-terminais
Gramática Livre de Contexto • Possui quatro componentes • (1) Conjunto de tokens • Símbolos terminais • (2) Conjunto de não-terminais • (3) Conjunto de regras de produção • 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 • lista lista + dígito • lista lista - digito • lista dígito • dígito 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Símbolos não-terminais lista lista + digito | lista - digito | dígito 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 begincmd_opcsend cmd_opcslista_cmds| lista_cmdslista_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 X Y Z A X Y Z
Árvores Gramaticais • Árvore gramatical para 9 – 5 + 2 lista lista lista + digito | lista - digito | dígito + lista dígito 2 – lista dígito 5 dígito 9
Á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 tokenou 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 para a direita lista + lista dígito 2 lista dígito – 5 dígito 9
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 cadeia cadeia cadeia 2 – cadeia cadeia 9 + 5 2 5 cadeia 9
Associatividade dos Operadores • 9 + 5 + 2 • (9 + 5) + 2 • 9 + (5 + 2) • Quando um operando recebe operadores à esquerda e à direita • 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 • direitaletra = direita | letra • 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 direita + lista dígito = letra direita – 2 lista dígito a = letra direita b letra 5 dígito 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 • expretermo • É criado um não-terminal extra para gerar as unidades básicas das expressões • fator • termo termo * fator • | termo / fator • | fator • exprexpr + termo • | expr - termo • | termo • fator digito | (expr)
Sintaxe de Expressões exprexpr + termo | expr – termo | termo termo termo * fator | termo / fator | fator fator digito | (expr)
Sintaxe de Comandos cmd id := expr | ifexprthencmd | ifexprthencmd elsecmd | whileexprdo cmd | begincmd_opcsend