![]() |
||
| |
||
processadores de linguagens da concepção à implementação |
||
RUI GUSTAVO CRESPO |
||
Vasco Thudichum
Vasconcelos |
||
|
Depois de obter os graus
de Licenciado (1981) e Mestre (1984) em Engenharia Electrotécnica
e de Computadores no Instituto Superior Técnico, Rui Gustavo
Crespo doutorou-se em Engenharia Informática e de Computadores,
também no IST, em 1993. Actualmente é Professor Auxiliar
do IST, tendo sido regente de várias disciplinas na Licenciatura
em Engenharia Informática e de Computadores, nomeadamente “Ambientes
de Desenvolvimento”, “Compiladores” e “Projecto
de Compiladores”. Participou, em 1985, no SINTEF (Trondheim, Noruega),
no projecto de reinstalação do compilador do CHILL no
VAX/VMS. Estagiou, de 1989 a 1991, no Imperial College of London (Department of Computing, sob a orientação do Prof.
Manny Lehman) bem como em 1995 na Ohio State University
(Rensable Software Research Group). |
||
INFORMAÇÕES FORMATO: 235 x 169 mm |
||
| ÍNDICE Preâmbulo ix Prefácio xi I - Linguagens e Processadores: Introdução 1 1 Introdução 5 1.1 Linguagens 71.1.1 O Que É uma Linguagem 7 1.1.2 Como Se Especifica uma Linguagem 9 1.2 Processadores de Linguagens 10 1.2.1 O Que Se Entende por Processador de uma Linguagem 101.2.2 Tarefas dum Processador de Linguagens 12 1.2.3 Estratégias de Processamento 13 1.2.4 Compiladores, Assemblers e Interpretadores 13 1.2.5 Tratamento de Erros 20 1.2.6 Os Primeiros Compiladores 22 2 Definição de Linguagens 25 2.1 Linguagens Formais 272.2 Linguagens e Expressões Regulares 29 2.2.1 Definição de Linguagem Regular 292.2.2 Expressões Regulares 30 2.3 Gramáticas 34 2.3.1 Derivação 372.3.2 Árvores de Derivação 40 2.3.3 Gramáticas Independentes de Contexto 42 2.3.4 Ambiguidade em Gramáticas 43 2.3.5 Recursividade 47 2.3.6 FIRST, FOLLOW e LOOKAHEAD 48 2.4 Gramáticas Reduzidas 51 2.4.1 Eliminação de Símbolos Inactivos 522.4.2 Eliminação de Símbolos Inacessíveis 53 2.5 Gramáticas Regulares 55 2.6 Formas Normais 56 2.6.1 Formal Normal de Chomsky 572.6.2 Formal Normal de Greibach 59 2.7 Gramáticas LL(1) 60 2.8 Gramáticas Atributivas 63 2.8.1 Definição 642.8.2 Grafos de Dependência Local 66 2.9 Sintaxe Abstracta 68 2.9.1 Objectos 682.9.2 Predicados 70 2.9.3 Identificação da Sintaxe Abstracta a partir do BNF 73 2.10 Exercícios 73 II - Análise 77 3 Análise Léxica 81 3.1 Autómatos Finitos 833.1.1 Autómato Finito Não-Determinista-AFND 84 3.1.2 Geração de Um AFND a partir de Uma Expressão Regular 87 3.1.3 Autómato Finito Determinista-AFD 90 3.1.4 Conversão de um AFND num AFD 91 3.1.5 Conversão de Uma Expressão Regular numa Gramática Regular 95 3.2 Codificação em C de Um AFD 96 3.2.1 Rotina de Reconhecimento 973.2.2 Estrutura de Dados de Leitura 98 3.2.3 Funções Auxiliares 98 3.3 Autómatos com Saída 99 3.3.1 Máquinas de Moore 993.3.2 Máquinas de Mealy 101 3.3.3 Equivalência entre Máquinas de Moore e de Mealy 103 3.4 Autómatos Reactivos 107 3.5 Interligação entre os Analisadores Léxico e Sintáctico 109 3.6 Exercícios 110 4 Análise Sintáctica Descendente 113 4.1 Autómato de pilha 1154.2 Reconhecimento Descendente 119 4.2.1 Codificação de Um Analisador Descendente 1214.2.2 Vantagens e Inconvenientes do Método Geral de Análise Descendente 122 4.3 Analisador Descendente Antecipável 123 4.4 Analisador Descendente por Tabela 126 4.4.1 Arquitectura 1264.4.2 Reconhecimento de Uma Frase 127 4.4.3 Construção da Tabela do Analisador Sintáctico 130 4.5 Exercícios 131 5 Análise Sintáctica Ascendente 135 5.1 Princípios Gerais 1375.2 Análise Sintáctica Ascendente CKY 138 5.3 Análise Sintáctica Orientada à Precedência de Operadores 142 5.3.1 Relações de Precedência entre Operadores 1435.3.2 Reconhecimento de Uma Frase 147 5.4 Análise Sintáctica Ascendente LR 149 5.4.1 Arquitectura 1495.4.2 Tabelas do Analisador Sintáctico Ascendente LR 151 5.4.3 Reconhecimento de Uma Frase 152 5.5 Construção de Tabelas SLR 155 5.5.1 Gramática Estendida 1555.5.2 Itens LR(0) de Uma Gramática 156 5.5.3 Autómato LR(0) 156 5.5.4 Tabelas de Acções e de Saltos 160 5.5.5 Conflitos entre Acções 162 5.6 Construção de Tabelas LR Canónico 164 5.6.1 Itens LR(1) de Uma Gramática 1655.6.2 Autómato LR(1) 166 5.6.3 Tabelas de Acções e de Saltos 170 5.7 Construção de Tabelas LALR 172 5.7.1 Tabelas de Acções e de Saltos 1735.7.2 Dimensão das Tabelas 174 5.7.3 Listagem no Yacc das Tabelas do Analisador 175 5.8 Exercícios 176 6 Análise Semântica 179 6.1 Definição de Símbolos 1816.2 Estrutura Global da Tabela de Símbolos 190 6.2.1 Tabelas e Listas 1916.2.2 Árvores 194 6.2.3 Tabelas de Dispersão 199 6.3 Avaliação de atributos 203 6.4 Eliminação de Atributos Herdados 206 6.5 Tradução Orientada pela Sintaxe 210 6.5.1 Tradução Baseada nas Regras Sintácticas 2116.5.2 Tradução Assistida por Atributos 213 6.6 Tradução Orientada pela Semântica 214 6.7 Exercícios 216 III - Geração de Código 221 7 Código Intermédio 225 7.1 Notação em Árvore 2277.1.1 Representação em C de Árvores de Instruções 227 7.1.2 Geração no Yacc de Árvores de Instruções 231 7.1.3 Verificação do Tipo de Uma Árvore de Expressões 238 7.1.4 Grafos Dirigidos Acíclicos 240 7.2 Notação Pós-Fixada 241 7.2.1 Definição da Notação Pós-Fixada 2417.2.2 Representação em C da Notação Pós-Fixada 242 7.2.3 Cálculo de Expressões em Notação Pós-Fixada 242 7.2.4 Geração no Yacc de Expressões Aritméticas 243 7.2.5 Controlo de Execução de Programas 245 7.3 Código de Triplo Endereço 247 7.3.1 Representação do C3E 2477.3.2 Representação em C do C3E 252 7.3.3 Geração no Yacc de Expressões Aritméticas 252 7.3.4 Geração no Yacc de Acessos a Tabelas 259 7.3.5 Geração no Yacc de Expressões Booleanas 268 7.3.6 Geração no Yacc do Controlo de Fluxo de Programas 278 7.3.7 Acesso a Valores Retornados por Funções 282 7.4 Exercícios 282 8 Código Final 285 8.1 Geração de Código Final a partir de C3E 2878.1.1 Distribuição de Memória 288 8.1.2 Geração de Código para um Bloco Básico 300 8.1.3 Entradas e Saídas de Dados 316 8.2 Geração de Código Final a partir de Árvores 318 8.2.1 Programação Dinâmica 3188.2.2 Reescrita de Árvores 324 8.3 Exercícios 329 9 Optimização de Código 331 9.1 Optimização Local 3349.1.1 Optimização Individual 335 9.1.2 Optimização de Subexpressões 340 9.2 Optimização entre Blocos 348 9.2.1 Eliminação de Código Inacessível 3489.2.2 Deslocamento de Código Invariante 351 9.2.3 Substituição de Variáveis de Ciclo 355 9.2.4 Substituição de Variáveis Induzidas 358 9.3 Optimização Global 361 9.4 Exercícios 363 A Lex e Yacc 365 A.1 Gerador de Analisadores Léxicos LEX 367 A.2 Gerador de Analisadores Sintácticos YACC 377 A.3 Interacção entre o LEX e o YACC 386 B PRECC 389 B.1 Passos na Geração de Um Analisador Sintáctico 391 B.2 Formato do Ficheiro de Especificação 392 B.2.1 Operadores 396B.2.2 Atributos 396 B.2.3 Gestão de Erros 398 C Ox 401 C.1 Inserção de Gramáticas Atributivas no Lex e no Yacc 403 C.2 Declaração de Atributos e Acesso às Suas Instâncias 404 C.2.1 Declaração de Atributos 404C.2.2 Acesso às Instâncias de Atributos 405 C.2.3 Modos Anunciadores de Definições 407 C.2.4 Acesso a Instâncias de Atributos em Ficheiros L 409 C.3 Percurso de Árvores Semânticas 410 D BURG 413 D.1 Passos na Geração de Um Gerador de Código 415 D.2 Organização do Ficheiro de Especificações 416 D.2.1 Zona de Configuração 416D.2.2 Zona de Declarações 417 D.2.3 Regras 418 D.3 Rotinas do Burg 418 Referências Bibliográficas 425 Índice Remissivo 430 |
||
| |
||
|
IST
Press | Instituto Superior
Técnico | Av. Rovisco Pais | 1049-001 LISBOA Actualizado em 27 de Julho de 2010 | © Copyright 1999 IST Press |
||