Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007
Conceitos Uma linguagem de programação pode ser definida pela descrição da aparência de seus programas (sintaxe) e do que os mesmos significam (semântica). Para especificar a sintaxe da linguagem usamos gramáticas livres de contexto (gramática). Ela também é usada para guiar a tradução de programas. – –A compilação orientada por gramática é conhecida como tradução dirigida pela sintaxe.
Conceitos Analisador Léxico Tradutor Dirigido pela Sintaxe Fluxo de Caracteres de entrada Fluxo de Tokens Representação Intermediária Estrutura da Vanguarda de nosso Compilador
Conceitos Definição da Sintaxe Uma gramática descreve naturalmente a estrutura hierárquica de muitas construções das linguagens de programação. Exemplo de if- else em C: comando em C: if (expressão) comando else comando Regra de produção: cmd -> if (expr) cmd else cmd ( -> significa poder ter a forma ou produz)
Conceitos Definição da Sintaxe If-else ( ) – são tokens Expr e cmd – Representam sequências de tokens e são chamados não terminais. Uma gramática livre de contexto possui quatro componentes: – –Um conjunto de tokens, conhecidos como símbolos terminais. – –Um conjunto de não-terminais. – –Um conjunto de produções – –Uma designação a um dos não-terminais como o símbolo de partida.
Conceitos Definição da Sintaxe Produções consistem em um não-terminal, chamado de lado esquerdo da produção, uma seta e uma sequência de tokens e/ou não terminais, chamados de lado direito da produção. As gramáticas são especificadas pela listagem de suas produções onde a primeira contém o símbolo de partida. Assumimos que dígitos, sinas ( =, +, -, etc), palavras reservadas sejam terminais.
Conceitos Definição da Sintaxe As produções com o mesmo não terminal a esquerda podem ser agrupadas. Exemplo: digito -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Exemplo 1: Gramática para descrever uma lista de dígitos separados por sinais de mais ou de menos.
Conceitos Definição da Sintaxe Produções: lista -> lista + dígito | lista – dígito | dígito digito -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Tokens: Terminais: Não Terminais: lista e dígito Uma cadeia de tokens é uma sequência de 0 ou mais tokens.
Conceitos Definição da Sintaxe Uma gramática deriva cadeias começando pelo símbolo de partida. As cadeias de tokens geradas formam a linguagem definida pela gramática. Exemplo de cadeia: 9 – Pela gramática anterior temos: a) 9 é uma lista. b) 9 – 5 é uma lista. c) 9 – é uma lista.
Conceitos Exemplo 2: Sequencia de comandos, separados por ponto e vírgula, encontrada nos blocos bengin-end de Pascal. Blocl -> begin cmds_opcs end cmds_opcs -> lista_cmds | E lista_cmds -> lista_cmds; cmd | cmd
Conceitos Árvores Gramaticais Uma árvore gramatical mostra como o símbolo de partida de uma gramática deriva uma cadeia de uma linguagem. Se um não terminal A possui uma produção A -> XYZ, então uma árvore pode ter um nó A com três filhos. A / | \ X Y Z
Conceitos Árvores Gramaticais Formalmente, dada uma gramática livre de contexto, uma árvore gramatical possui as seguintes propriedades: – –A raiz é rotulada pelo símbolo de partida. – –Cada folha é rotulada por um token ou por E. – –Cada nó interior é rotulado por um não-terminal. – –Se A é um não-terminal rotulando algum nó interior e X1, x2,..., Xn são os rótulos dos seus filhos, então A - >X1X2,..,Xn é uma produção.
Conceitos Árvores Gramaticais lista lista dígito dígito Árvore gramatical para 9 – 5 + 2
Conceitos Árvores Gramaticais Na árvore anterior temos: lista – Raiz é rotulada lista (símbolo de partida). lista + dígito – Filhos da raíz. lista -> lista + dígito é uma produção na gramática. As folhas da árvore gramatical, lidas da esquerda para a direita formam o produto da árvore, que é a cadeia gerada ou derivada a partir do não-terminal à raiz da árvore gramatical.
Conceitos Árvores Gramaticais Outra definição da linguagem gerada por uma gramática é a de um conjunto de cadeias que podem ser representadas por alguma árvore gramatical. O processo de encontrar uma árvore gramatical para uma dada cadeia de tokens é chamado de análise gramatical ou análise sintática daquela cadeia.
Conceitos Ambigüidade É importante observar que uma gramática pode ter mais de uma árvore gramatical gerando uma dada cadeia de tokens. Tal gramática é dita ambígua. Exemplo: basta encontrar uma cadeia de tokens que tenha mais de uma árvore gramatical.
Conceitos Ambigüidade Gramática ambígua: Cadeia -> cadeia + cadeia | cadeia – cadeia | cadeia Cadeia -> 0 | 1 |... | 9 Ver exemplos: Precisamos resolver a ambigüidade das gramáticas!
Conceitos Ambigüidade cadeia cadeia cadeia + cadeia cadeia - cadeia cadeia - cadeia cadeia + cadeia Duas Árvores Gramaticais para 9-5+2
Conceitos Associatividade dos Operadores Convencionalmente, é equivalente a (9+5)+2 e a (9-5)-2. Na maioria das linguagens os operadores +, -, * e / são associados à esquerda. Exponenciação tem associação à direita. Em C o operador de atribuição tem associação à direita também direita -> letra = direita | letra letra -> a | b |... | z
Conceitos Associatividade dos Operadores Exemplo: a=b=c e 9 – 5 – 2 direita lista letra = direita lista - digito a letra = direita lista - digito letra digito b c9 5 2 Árvore gramatical para operadores associativos à esquerda e à direita
Precedência de Operadores Para a expressão 9+5*2 existem duas possíveis interpretações para a mesma (9+5)*2 ou 9+(5*2) * e / tem precedência mais alta que + e – Sintaxe das expressões Expr -> expr + termo | expr – termo | termo Termo -> termo * fator | termo/fator | fator Fator -> digito | (expr)
Precedência de Operadores Sintaxe dos comandos cmd -> id := expr | if expr then cmd | if expr then cmd else cmd | while expr do cmd | begin cmds_opcs end