URICER Universidade Regional Integrada do Alto Uruguai e das Missões Campus de Erechim Apostila de COMPILADORES



Documentos relacionados
Aula 8: Gramáticas Livres de Contexto

Analisadores Sintáticos. Análise Recursiva com Retrocesso. Análise Recursiva Preditiva. Análise Recursiva Preditiva 05/04/2010

Algoritmos de Busca de Palavras em Texto

Capítulo 3. Autómatos e respectivas linguagens

POLINÔMIOS. Definição: Um polinômio de grau n é uma função que pode ser escrita na forma. n em que cada a i é um número complexo (ou

Faculdade de Computação

Análise Léxica. Construção de Compiladores. Capítulo 2. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Simbolicamente, para. e 1. a tem-se

Resumo da última aula. Compiladores. Conjuntos de itens LR(0) Exercício SLR(1) Análise semântica

Aula 4: Autômatos Finitos Autômatos Finitos Não-Determinísticos

Acoplamento. Tipos de acoplamento. Acoplamento por dados. Acoplamento por imagem. Exemplo. É o grau de dependência entre dois módulos.

CENTRO UNIVERSITÁRIO CATÓLICA DE SANTA CATARINA Pró-Reitoria Acadêmica Setor de Pesquisa

Semelhança e áreas 1,5

EXAME DE INGRESSO º Período

Hierarquia de Chomsky

LRE LSC LLC. Autômatos Finitos são reconhecedores para linguagens regulares. Se não existe um AF a linguagem não é regular.

Alocação sequencial - Pilhas

Teoria da Computação. Unidade 3 Máquinas Universais (cont.) Referência Teoria da Computação (Divério, 2000)

Linguagens Formais Capítulo 5: Linguagens e gramáticas livres de contexto

CONJUNTOS NUMÉRICOS Símbolos Matemáticos

LINGUAGEM DE PROGRAMAÇÃO ESTRUTURADA CAPÍTULO 6 ARRAYS (VETORES E MATRIZES)

Característica de Regulação do Gerador de Corrente Contínua com Excitação em Derivação

São possíveis ladrilhamentos com um único molde na forma de qualquer quadrilátero, de alguns tipos de pentágonos irregulares, etc.

Busca Digital (Trie e Árvore Patrícia) Estrutura de Dados II Jairo Francisco de Souza

push (c) pop () retorna-se c topo b a topo Figura 10.1: Funcionamento da pilha.

Transporte de solvente através de membranas: estado estacionário

Programação Linear Introdução

UFU Universidade Federal de Uberlândia Faculdade de Computação Apostila de Lógica Proposicional (Fundamentos Básicos)

Português. Manual de Instruções. Função USB. Transferindo padrões de bordado para a máquina Atualização fácil da sua máquina

1 Fórmulas de Newton-Cotes

Análise Sintática I: Analisadores Descendentes com Retrocesso

AULA 1. 1 NÚMEROS E OPERAÇÕES 1.1 Linguagem Matemática

Pontifícia Universidade Católica de Campinas Centro de Ciências Exatas, Ambientais e de Tecnologias Faculdade de Engenharia de Computação

Cálculo Numérico Faculdade de Engenharia, Arquiteturas e Urbanismo FEAU

1. VARIÁVEL ALEATÓRIA 2. DISTRIBUIÇÃO DE PROBABILIDADE

3.3 Autómatos finitos não determinísticos com transições por ε (AFND-ε)

Aula 27 Integrais impróprias segunda parte Critérios de convergência

DCC-UFRJ Linguagens Formais Primeira Prova 2008/1

1º semestre de Engenharia Civil/Mecânica Cálculo 1 Profa Olga (1º sem de 2015) Função Exponencial

Operadores momento e energia e o Princípio da Incerteza

Professores Edu Vicente e Marcos José Colégio Pedro II Departamento de Matemática Potências e Radicais

A MODELAGEM MATEMÁTICA NA CONSTRUÇÃO DE TELHADOS COM DIFERENTES TIPOS DE TELHAS

3. Seja Σ um alfabeto. Explique que palavras pertencem a cada uma das seguintes linguagens:

Formas Quadráticas. FUNÇÕES QUADRÁTICAS: denominação de uma função especial, definida genericamente por: 1 2 n ij i j i,j 1.

SERVIÇO PÚBLICO FEDERAL Ministério da Educação

APONTAMENTOS DE ÁLGEBRA LINEAR E GEOMETRIA ANALÍTICA

ÁLGEBRA LINEAR Equações Lineares na Álgebra Linear EQUAÇÃO LINEAR SISTEMA LINEAR GEOMETRIA DA ESQUAÇÕES LINEARES RESOLUÇÃO DOS SISTEMAS

Linguagens Formais e Autômatos (LFA)

Aula 09 Equações de Estado (parte II)

CINÉTICA QUÍMICA CINÉTICA QUÍMICA. Lei de Velocidade

Comprimento de arco. Universidade de Brasília Departamento de Matemática

Resolução Numérica de Sistemas Lineares Parte I

Problemas e Algoritmos

Função de onda e Equação de Schrödinger

6.1 Recursos de Curto Prazo ADMINISTRAÇÃO DO CAPITAL DE GIRO. Capital de giro. Capital circulante. Recursos aplicados em ativos circulantes (ativos

COPEL INSTRUÇÕES PARA CÁLCULO DA DEMANDA EM EDIFÍCIOS NTC

ALGEBRA LINEAR AUTOVALORES E AUTOVETORES. Prof. Ademilson

Capítulo 1 Introdução à Física

a a 3,88965 $ % 7 $ % a 5, 03295

Relações em triângulos retângulos semelhantes

Gabarito - Matemática Grupo G

Projeto de Compiladores Professor Carlos de Salles

ANÁLISE DE SISTEMAS DE ENERGIA REPRESENTAÇÃO DE SISTEMAS DE ENERGIA ELÉTRICA EM REGIME PERMANENTE 4

Circuitos Elétricos II Experimento 1 Experimento 1: Sistema Trifásico

Autor: Carlos Otávio Schocair Mendes

Conversão de Energia II

Incertezas e Propagação de Incertezas. Biologia Marinha

Área entre curvas e a Integral definida

Linguagens Formais e Autômatos (LFA)

ESTATÍSTICA APLICADA. 1 Introdução à Estatística. 1.1 Definição

Fluxo de execução e blocos básicos

PROJETO E ANÁLISES DE EXPERIMENTOS (PAE) EXPERIMENTOS COM UM ÚNICO FATOR E A ANÁLISE DE VARIÂNCIA

Teoria de Linguagens 2 o semestre de 2014 Professor: Newton José Vieira Primeira Lista de Exercícios Entrega: até 16:40h de 23/10.

Aula 10 Estabilidade

Faculdade de Computação

1 MÁQUINAS ELÉTRICAS II 1233 A/C : PROF. CAGNON ENSAIO 01 : OBTENÇÃO DA CARACTERÍSTICA A VAZIO DE UMA MÁQUINA CC

INTRODUÇÃO AOS MÉTODOS NUMÉRICOS

EQUAÇÃO DO 2 GRAU. Seu primeiro passo para a resolução de uma equação do 2 grau é saber identificar os valores de a,b e c.

Módulo 02. Sistemas Lineares. [Poole 58 a 85]

Introdução à Programação Linear

Eletrotécnica. Módulo III Parte I Motores CC. Prof. Sidelmo M. Silva, Dr. Sidelmo M. Silva, Dr.

Circuitos Elétricos II Experimento 1 Experimento 1: Sistema Trifásico

TRIGONOMETRIA. A trigonometria é uma parte importante da Matemática. Começaremos lembrando as relações trigonométricas num triângulo retângulo.

Manual de Operação e Instalação

Pontos onde f (x) = 0 e a < x < b. Suponha que f (x 0 ) existe para a < x 0 < b. Se x 0 é um ponto extremo então f (x 0 ) = 0.

Licença de uso exclusiva para Petrobrás S.A. Licença de uso exclusiva para Petrobrás S.A. NBR 13434

Modelos de Computação -Folha de trabalho n. 2

Física Geral e Experimental I (2011/01)

FUNÇÕES. Mottola. 1) Se f(x) = 6 2x. é igual a (a) 1 (b) 2 (c) 3 (d) 4 (e) 5. 2) (UNIFOR) O gráfico abaixo. 0 x

Regras. Resumo do Jogo Resumo do Jogo. Conteúdo. Conteúdo. Objetivo FRENTE do Jogo

6 Conversão Digital/Analógica

Universidade Federal do Rio Grande FURG. Instituto de Matemática, Estatística e Física IMEF Edital 15 - CAPES MATRIZES

TÓPICOS. Equação linear. Sistema de equações lineares. Equação matricial. Soluções do sistema. Método de Gauss-Jordan. Sistemas homogéneos.

CONSTRUÇÃO DE ALGORITMOS E PROGRAMAS

& fé ISSN por Rodolfo Petrônio Unirio.

MODELAGEM DINÂMICA OO: UMA ANÁLISE COMPARATIVA DE TÉCNICAS

Vestibular UFRGS 2013 Resolução da Prova de Matemática

COLÉGIO NAVAL 2016 (1º dia)

TERMO DE REFERÊNCIA PROJETOS DE INCLUSÃO PRODUTIVA

Transcrição:

URICR Universidde Regionl Integrd do Alto Urugui e ds Missões Cmpus de rechim Apostil de COMPILADORS rechim, gosto de 2001.

-2- SUMÁRIO 1 CONCIOS BÁSICOS (revisão)... 4 2 LINGUAGNS SUAS RPRSNAÇÕS... 6 2.1 Conceito... 6 2.2 ipos... 7 2.3 specificção de um lingugem... 8 3 INRODUÇÃO À COMPILAÇÃO... 11 3.1 ipos de Compilção... 11 3.2 Interpretção pur... 13 3.3 Sistems de Interpretção Híbridos... 15 3.4 Construção de Compildores... 16 3.5 Processdores de lingugens... 16 3.6 strutur gerl de um compildor... 19 3.6.1 Anlisdor léxico (ou scnner)... 19 3.6.2 Anlisdor sintático (ou prser)... 20 3.6.3 Anlisdor semântico... 21 3.6.4 Otimizção de código... 22 3.6.5 Gerção de código... 22 3.7 orms de construção de um compildor... 25 3.8 errments pr construção de compildores... 26 4 ANALISADOR LÉXICO... 27 4.1 unção... 27 4.2 Reconhecimento de tokens: utômto finito... 27 4.3 Implementção... 28 5 ANALISADOR SINÁICO... 29 5.1 unção... 29 5.2 specificção ds regrs sintátics: grmátic livre de contexto... 29 5.2.1 Notções... 29 5.2.2 Árvore de derivção ou árvore sintátic... 30 5.2.3 Análise sintátic descendente e scendente... 33 5.3 Autômto de pilh... 36 5.4 ipos de nlisdores sintáticos... 36 5.4.1 Anlisdor sintático scendente (bottom-up)... 36 5.4.2 Anlisdor sintático descendente (top-down)... 37 5.5 A Implementção d Análise Shift-Reduce trvés de pilhs... 38 5.5.1 O Anlisdor de grmátics de precedênci de operdores... 39 5.6 Simplificções de Grmátics Livres de Contexto... 41 5.6.1 Símbolos Inúteis ou Improdutivos... 41 5.6.2 ε - Produções... 44 5.6.3 Produções Unitáris... 47

-3-5.6.4 torção... 47 5.6.5 liminção de Recursão à squerd... 49 5.7 ipos speciis de GLC... 50 5.8 Principis Notções de GLC... 51 5.9 Conjuntos irst e ollow... 51 5.9.1 Conjunto irst... 51 5.9.2 Conjunto ollow... 53 List de xercícios de Simplificção de GLC s... 56 BIBLIOGRAIA... 61

-4-1 CONCIOS BÁSICOS (RVISÃO) Segundo MNZS (1997), os estudos sobre lingugens formis inicirm-se n décd de 50 com o objetivo de definir mtemticmente s estruturs ds lingugens nturis. No entnto, verificou-se que teori desenvolvid plicv-se o estudo ds lingugens de progrmção. A teori de lingugens formis englob, bsicmente, o estudo ds crcterístics, proprieddes e plicções ds lingugens formis, bem com form de representção d estrutur (sintxe) e determinção do significdo (semântic) ds sentençs ds lingugens. Segundo URADO (1992), importânci dest teori é dupl: tnto pói outros spectos teóricos d teori d computção, tis como decibilidde, computbilidde, complexidde, etc. como fundment diverss plicções computcionis, como por exemplo processmento de lingugens, reconhecimento de pdrões, modelgem de sistems, etc. Ms, o que é um lingugem? um lingugem é um form de comunicção, usd por sujeitos de um determind comunidde; um lingugem é o conjunto de SÍMBOLOS e RGRAS pr combinr esses símbolos em sentençs sintticmente correts. "um lingugem é forml qundo pode ser representd trvés de um sistem com sustentção mtemátic" (PRIC; DLWISS, 1989). Assim sendo, são necessários conceitos mtemáticos pr o estudo ds lingugens formis. Símbolo Um símbolo é um entidde bstrt básic sem definição forml. São exemplos de símbolos s letrs, os dígitos, etc. Símbolos são ordenáveis lexicogrficmente e, portnto, podem ser comprdos qunto à iguldde ou precedênci. Por exemplo, tomndo s letrs dos lfbetos, tem-se ordenção A < B < C <... < Z. A principl utilidde dos símbolos está n possibilidde de usá-los como elementos tômicos em definições de lingugens. Sentenç (ou plvr) Um sentenç (ou plvr) é um seqüênci finit de símbolos. Sejm P, R, I, M, e A símbolos, então PRIMA é um sentenç. As sentençs vzis, representds por ε, é um sentenç constituíd por nenhum símbolo. mnho de um sentenç O tmnho (ou comprimento) de um sentenç w, denotdo por w, é ddo pelo número de símbolos que compõem w. Assim, o tmnho d sentenç PRIMA é 5 e o tmnho d sentenç vzi é 0.

-5- Alfbeto Um lfbeto, denotdo por V, é um conjunto finito de símbolos. Assim, considerndo os símbolos dígitos, letrs, etc., tem-se os seguintes lfbetos V binário = {0, 1}; V vogis = {, e, i, o, u}. É importnte observr que um conjunto vzio tmbém pode ser considerdo um lfbeto. O fechmento reflexivo de um lfbeto V, denotdo por V*, é o conjunto infinito de tods s sentençs que podem ser formds com os símbolos de V, inclusive sentenç vzi. O fechmento trnsitivo de um lfbeto V, denotdo por V +, é ddo por V* - {ε}. Sej V o lfbeto dos dígitos binários, V = {0, 1}. O fechmento trnsitivo de V é V + = {0, 1, 00, 01, 10, 11, 000, 001, 010, 011,...}, enqunto que o fechmento reflexivo de V é V* = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011,...}.

-6-2 LINGUAGNS SUAS RPRSNAÇÕS 2.1 CONCIO Um lingugem forml L é um conjunto de sentençs formds por símbolos tomdos de lgum lfbeto V. Isto é, um lingugem sobre o lfbeto V é um subconjunto de V* (L V*). Assim, por exemplo, o conjunto de sentençs válids d língu portugues poderi ser definido extensionlmente como um subconjunto de {, b, c,..., z} +. Um lingugem pode ser: finit: qundo é compost por um conjunto finito de sentençs. Sej V = {, b} um lfbeto, L 1, L 2 e L 3 lingugens definids conforme segue: L 1 = {w w V* w < 3}, ou sej, L 1 é um lingugem constituíd por tods s sentençs de tmnho menor que 3 formds por símbolos de V. Portnto, L 1 = {ε,, b,, b, b, bb} L 2 = L 3 = {ε} As lingugens L 2 e L 3 são diferentes. infinit: qundo é compost por um conjunto infinito de sentençs. Sej V = {, b} um lfbeto, L 1, L 2 e L 3 lingugens definids conforme segue: L 1 = {w w V* w MOD 1 2 = 0}, ou sej, L 1 é um lingugem constituíd por tods s sentençs de tmnho pr formds por símbolos de V. Portnto, L 1 = {ε,, b, b, bb,, b, b,...} L 2 = {w w é um plíndrome 2 }. Portnto L 2 = {ε,, b,, bb, b, bb,...} L 3 = lingugem de progrmção PASCAL, ou sej, o conjunto infinito de progrms escritos n lingugem de progrmção em questão. Como definir/representr um lingugem? Um lingugem finit pode ser definid trvés d enumerção ds sentençs constituintes ou trvés de um descrição lgébric. Um lingugem infinit deve ser definid trvés de representção finit. Reconhecedores ou sistems gerdores são dois tipos de representções finits. Um reconhecedor é um dispositivo forml usdo pr verificr se um determind sentenç pertence ou não à lingugem. São exemplos de reconhecedores utômtos finitos, utômtos de pilh e máquins de uring. Um sistem gerdor é um dispositivo forml usdo pr gerr de form sistemátic s sentençs de um dd lingugem. São exemplos de sistems gerdores s grmátics. odo reconhecedor e todo sistem gerdor pode ser representdo por um lgoritmo. 1 MOD é um operção que represent o resto d divisão inteir. 2 Um plíndrome é um plvr que tem mesm leitur d esquerd pr direit e vice-vers.

-7-2.2 IPOS Nom Chomsky definiu um hierrqui de lingugens como modelos pr lingugens nturis. As clsses de lingugens são: regulr, livre de contexto, sensível o contexto e irrestrit. As inclusões dos tipos de lingugens são presentds n figur bixo. LINGUAGM IRRSRIA (ou tipo 0) LINGUAGM SNSÍVL AO CONXO (ou tipo 1) LINGUAGM LIVR D CONXO (ou tipo 2) LINGUAGM RGULAR (ou tipo 3) IGURA 8: hierrqui de Chomsky Pode-se ver que um lingugem do tipo 3 é tmbém do tipo 2, um lingugem do tipo 2 é tmbém do tipo 1, e um lingugem do tipo 1 é tmbém do tipo 0. sts inclusões são estrits, isto é, existem lingugens do tipo 0 que não são do tipo 1, existem lingugens do tipo 1 que não são do tipo 2 e existem lingugens do tipo 2 que não são do tipo 3. As lingugens regulres constituem um conjunto de lingugens bstnte simples. sss lingugens podem ser reconhecids por utômtos finitos, gerds por grmátics regulres e fcilmente descrits por expressões simples, chmds expressões regulres. Segundo MNZS (1997), lgoritmos pr reconhecimento e gerção de lingugens regulres são de grnde eficiênci, fácil implementção e pouc complexidde. HOPCRO; ULLMAN (1979) firmm que vários são os problems cujo desenvolvimento pode ser fcilitdo pel conversão d especificção feit em termos de expressões regulres n implementção de um utômto finito correspondente. Dentre s váris plicções, podemos citr: nlisdores léxicos e editores de texto. Pr descrever precismente regr de formção (pdrão) de tokens mis complexos de lingugens de progrmção, tis como identificdores, plvrs reservds, constntes e comentários, us-se notção ds expressões regulres, s quis podem ser utomticmente convertids em utômtos finitos equivlentes cuj implementção é trivil. A operção de busc e substituição de plvrs (ou trechos de plvrs) tmbém pode ser relizd trvés d implementção de um utômto finito prtir d especificção d expressão regulr correspondente. A importânci ds lingugens livres de contexto reside no fto de que especificm dequdmente s estruturs sintátics ds lingugens de progrmção, tis como prênteses blncedos, construções ninhds, entre outrs. A miori ds lingugens de progrmção pertence o conjunto ds lingugens livre de contexto e pode ser nlisd por lgoritmos eficientes. sss lingugens podem ser reconhecids por utômtos de pilh e gerds por grmátics livre de contexto(glc). Segundo URADO (1992), dentre s váris plicções dos conceitos de lingugens livre de contexto, podemos citr: definição e

-8- especificção de lingugens de progrmção; implementção eficiente de nlisdores sintáticos; implementção de trdutores de lingugens e processdores de texto em gerl; estruturção forml e nálise computcionl de lingugens nturis. Segundo MNZS (1997), s lingugens sensíveis o contexto e irrestrits "permitem explorr os limites d cpcidde de desenvolvimento de reconhecedores ou gerdores de lingugens, ou sej, estud solucionbilidde do problem d existênci de lgum reconhecedor ou gerdor pr determind lingugem". sss lingugens podem ser respectivmente reconhecids por máquins de uring limitds e gerds por grmátics sensíveis o contexto(gsc); reconhecids por máquins de uring e gerds por grmátics irrestrits. MNZS (1997) observ que nem sempre s lingugens de progrmção são trtds dequdmente n hierrqui de Chomsky. Assim, pr especificção de determinds lingugens de progrmção pode-se fzer necessário o uso de outros formlismos como por exemplo grmátic de grfos. 2.3 SPCIICAÇÃO D UMA LINGUAGM oi dito que um lingugem L é qulquer subconjunto de sentençs sobre um lfbeto V. Ms, qul subconjunto é esse, como defini-lo? Um grmátic é um dispositivo forml usdo pr definir qul subconjunto de V* form determind lingugem. A grmátic define um estrutur sobre um lfbeto de form permitir que pens determinds combinções de símbolos sejm considerds sentençs. O que é GRAMÁICA? É um sistem gerdor de lingugens; é um sistem de reescrit; é um mneir finit de descrever um lingugem; é um dispositivo forml usdo pr especificr de mneir finit e precis um lingugem infinit. Grmátic ormlmente um grmátic G é definid como sendo um quádrupl G = (N,, P, S), onde: N é um conjunto finito de símbolos denomindos símbolos não-terminis, usdos n descrição d lingugem; é um conjunto finito de símbolos denomindos símbolos terminis, os quis são os símbolos proprimente ditos; P é conjunto finito de pres (α, β) denomindos regrs de produção (ou regrs grmticis) que relcionm os símbolos terminis e não-terminis; S é o símbolo inicil d grmátic pertencente N, prtir do qul s sentençs de um lingugem podem ser gerds. As regrs grmticis são representds por α ::= β ou α β, onde α e β são sentençs sobre V, com α envolvendo pelo menos um símbolo pertencente V N. Um seqüênci de regrs de produção d form α β 1, α β 2,... α β n, ou sej, com mesm componente do ldo esquerdo, pode ser brevid como um únic produção n form: α β 1 β 2... β n. O significdo de um regr de produção α β é α produz β ou α é definido por β.

-9- Abixo se encontr um exemplo de um grmátic: XMPLO 1: lingugem dos números inteiros sem sinl é gerd pel seguinte grmátic G: onde G = (N,, P, S) V N = {N, D} V = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} P = { N D N D D 0 1 2 3 4 5 6 7 8 9 } S = N Observ-se que grmátic presentd no XMPLO 1 não é regulr. Grmátics Regulres (tipo 3) Um grmátic G é de tipo 3, ou regulr, se cd produção é d form : A ::= B, A ::= ou A ::= ε, onde A e B são não-terminis e é um terminl. xemplo de Grmátic Regulr: S ::= 0A 1A A ::= 0B 1A B ::= 0A 1B ε Grmátics Livres de Contexto - GLC (tipo2) As lingugens livres de contexto são definids por grmátics livres de contexto (GLC) que podem ser utilizds pr especificr prte sintátic de um lingugem de progrmção. Um grmátic livre de contexto é um quádrupl G = (V N, V, P, S), onde: P = {A α A V N, α é um sentenç em (V N V )*}. m outrs plvrs, um grmátic livre de contexto dmite pens regrs de produção cujo o ldo esquerdo contém extmente um não-terminl. Segundo MNZS (1997), signific que o não-terminl "A deriv α sem depender ('livre') de qulquer nálise dos símbolos que ntecedem ou sucedem A ('contexto') n sentenç que está sendo derivd". XMPLO: lingugem L = {x x {, b} + x segue o pdrão de formção n b n n 0} é gerd pel seguinte grmátic livre de contexto: S S b ε Pode-se estbelecer um nlogi entre est lingugem e os blocos estruturdos do tipo BGIN ND, ou s expressões com prênteses blncedos n form ( n ) n. Grmátics Sensíveis o Contexto - GSC (tipo 1)

-10-1. O Símbolo inicil S não prece no ldo direito de nenhum produção, e 2. Pr cd produção α1 ::= α2, é verdde que α1 <= α2, ou sej, o ldo esquerdo d produção é <= o ldo direito(com exceção d regr S ::= ε), então se diz que G é um grmátic do tipo 1, ou Grmátic Sensível o Contexto. XMPLO: lingugem L = {x x {, b, c} + x segue o pdrão de formção n (b c) n n 1 é gerd pel seguinte grmátic sensível o contexto: S S B C B C B C C B C B B C B b C c Lingugens Irrestrits (tipo 0) As lingugens irrestrits representm tods s lingugens que podem ser reconhecids mecnicmente e em um tempo finito. São definids por grmátics irrestrits (GI). Um grmátic irrestrit é um quádrupl G = (N,, P, S) que não possui qulquer restrição qunto à form ds regrs de produção. Qulquer um ds grmátics especificds nteriormente é um exemplo de um grmátic irrestrit. Observ-se que um lingugem com dois ou mis símbolos terminis que possuem um relção quntittiv e posicionl não pode ser representd por GR; um lingugem com três ou mis símbolos terminis que possuem um relção quntittiv e posicionl não pode ser representd por GLC; qunto mis brngente o tipo d grmátic mis complex é nálise.

-11-3 INRODUÇÃO À COMPILAÇÃO 3.1 IPOS D COMPILAÇÃO Os progrms podem ser trduzidos pr lingugem de máquin, qul pode ser executd diretmente no computdor. Isso é chmdo de implementção compild. sse método tem vntgem de um execução de progrm muito rápid, ssim que o processo de trdução for concluído. A miori ds implementções de lingugens de produção como C, COBOL e Ad dáse por meio de compildores. A lingugem que um compildor trduz é chmd de lingugem-fonte. O processo de compilção desenvolve-se em diverss etps, miori ds quis mostrd n figur 3.1. O nlisdor léxico reúne os crcteres do progrm-fonte em uniddes léxics que são os identificdores, s plvrs especiis, os operdores e os símbolos de pontução. O nlisdor léxico ignor os comentários no progrm-fonte, porque eles não têm nenhum utilidde pr o compildor. O nlisdor sintático peg s uniddes do nlisdor léxico e us-s pr construir estruturs hierárquics chmds árvores de nálise, s quis representm estrutur sintátic do progrm (árvores de derivção, lembr?). m muitos csos, nenhum estrutur de árvore de nálise rel é construíd; o contrário, informção que seri necessári pr construí-l é gerd e usd. O gerdor de código intermediário produz um progrm em um lingugem diferente, no nível intermediário entre o progrm-fonte e síd finl do compildor, o progrm em lingugem de máquin (note que s plvrs lingugem e código muits vezes são usds de mneir intercmbiável). As lingugens intermediáris, às vezes, precem-se muito com s lingugens ssembly. m outros csos, o código intermediário está em um nível bem mis lto que o ssembly. O nlisdor semântico fz prte integrlmente do gerdor de código intermediário e verific se há erros difíceis, se não impossíveis, de serem detectdos durnte nálise sintátic, como por exemplo, erros de tipo.

-12- Progrm-fonte Anlisdor Léxico Uniddes léxics Anlisdor Sintático Árvores de nálise bels de Símbolos Gerdor de código intermediário e Anlisdor Sintático Otimizção (opcionl) Gerdor de Código Código Intermediário Lingugem de máquin Ddos de entrd Computdor Resultdos igur 3.1 - O processo de compilção.

-13- A otimizção, que melhor os progrms tornndo-os menores ou mis rápidos, ou mbos, muits vezes, é um prte opcionl d compilção. De fto, lguns compildores são incpzes de fzer qulquer otimizção significtiv. sse tipo de compildor seri usdo em situções em que velocidde de execução do progrm trduzido é bem menos importnte do que velocidde de compilção. Um exemplo dess situção é um lbortório de computção pr progrmdores principintes. N miori ds situções comerciis e industriis, velocidde de execução é mis importnte do que velocidde de compilção, de modo que otimizção é rotineirmente desejável. Um vez que muitos tipos de otimizção não podem ser feitos em lingugem de máquin, miori ds otimizções é feit no código intermediário. O gerdor de código converte versão do código intermediário otimizdo do progrm pr um progrm em lingugem de máquin equivlente. A tbel de símbolos serve como um bnco de ddos pr o processo de compilção. Seu principl conteúdo são informções sobre tipos e tributos de cd nome definido pelo usuário no progrm. sss informções são colocds n tbel de símbolos pelos nlisdores léxico e sintático e usds pelo nlisdor semântico e pelo gerdor de código. Conforme firmou-se cim, não obstnte lingugem de máquin gerd por um compildor poss ser executd diretmente no hrdwre, quse sempre el deve ser executd juntmente com lgum outro código. A miori dos progrms de usuário tmbém exige progrms do sistem opercionl. ntre os mis comuns, estão queles pr entrd (input) e síd (output) de ddos. O compildor cri chmds progrms do sistem necessários qundo o progrm de usuário necessit deles. Antes que os progrms em lingugem de máquin produzidos pelo compildor possm ser executdos, os progrms necessários do sistem opercionl devem ser encontrdos e vinculdos o usuário. A operção de vinculção conect o progrm de usuário os de sistem, colocndo os endereços dos pontos de entrd dos progrms de sistem ns chmds eles no de usuário. O código de usuário e o de sistems juntos, às vezes, são chmdos de módulo de crg ou imgem de executável. O processo de coletr progrms de sistem e vinculá-los os progrms de usuário é chmdo de vinculção e crregmento ou, às vezes, pens de vinculção. le é relizdo por um progrm de sistem chmdo linkeditor. Além dos progrms de sistems, os progrms de usuário muits vezes devem ser vinculdos progrms de usuário compildos nteriormente, que residem em bibliotecs. Assim, o linkeditor não somente vincul lgum ddo progrm os progrms de sistem, ms tmbém o vincul outros progrms de usuário. 3.2 INRPRAÇÃO PURA N extremidde opost dos métodos de implementção, os progrms podem ser interpretdos por outro progrm chmdo interpretdor, sem nenhum conversão. O progrm interpretdor ge como um simulção de softwre de um máquin cujo ciclo buscr-executr lid com instruções de progrm em lingugem de lto nível em vez de instruções de máquin. ss simulção de softwre, evidentemente, fornece um máquin virtul pr lingugem. ss técnic, chmd de interpretção pur ou, simplesmente de interpretção, tem vntgem de permitir um fácil implementção de muits operções de depurção do códigofonte, porque tods s mensgens de erro em tempo de execução podem referir-se uniddes do código. Por exemplo, se for considerdo que um índice de rry está for d fix, mensgem de erro poderá fcilmente indicr linh d fonte e o nome do rry. Por outro ldo, esse método tem séri desvntgem de que execução é de 10 100 vezes mis lent que em sistems compildos. A principl cus dess lentidão é decodificção ds instruções de lto nível, bem mis complexs do que s instruções em lingugem de máquin (não obstnte poss hver um número menor de comndos do que de instruções de código de máquin

-14- equivlente). Portnto, decodificção de comndos, em vez d conexão entre o processdor e memóri, é o grglo de um interpretdor puro. Outr desvntgem d interpretção pur é que el freqüentemente exige mis espço. Além do progrm-fonte, tbel de símbolos deve estr presente n interpretção. Além disso, o progrm-fonte deve ser rmzendo em um form projetd pr permitir fácil cesso e modificção, em vez de um tmnho mínimo. A interpretção é um processo difícil em progrms escritos em um lingugem complicd, porque o significdo de cd expressão e instrução deve ser determindo diretmente do progrm-fonte em tempo de execução. Lingugens com estruturs mis simples prestm-se à interpretção pur. Por exemplo, APL e LIS, às vezes são implementds como sistems interprettivos puros. A miori dos comndos do sistem opercionl, como por exemplo, o conteúdo dos scripts do shell do UNIX e dos rquivos.bt do DOS, são implementdos com interpretdores puros. Lingugens mis complexs, como o ORRAN e o C, rrmente são implementds com interpretdores puros. O processo de interpretção pur é mostrdo n figur 3.2. Progrm-fonte Ddos de entrd Interpretdor Resultdos igur 3.2 - Interpretção pur.

-15-3.3 SISMAS D INRPRAÇÃO HÍBRIDOS Alguns sistems de implementção de lingugem são um meio-termo entre os compildores e os interpretdores puros; eles trduzem progrms em lingugem de lto nível pr um lingugem intermediári projetd pr permitir fácil interpretção. sse método é mis rápido do que interpretção pur porque s instruções d lingugem fonte são decodificds somente um vez. sss implementções são chmds de sistems de implementção híbridos. O processo usdo em um sistem de implementção híbrido é mostrdo n figur 3 em vez de trduzir código em lingugem intermediári pr código de máquin, ele simplesmente interpret o código intermediário. A Perl é implementd com um sistem híbrido. l se desenvolveu prtir d lingugem impertiv sh e wk, ms é prcilmente compild pr detectr erros ntes d interpretção e pr simplificr o interpretdor. As implementções iniciis de Jv erm tods híbrids. Su form intermediári, chmd código de bytes, oferece portbilidde qulquer máquin que tenh um interpretdor de código de bytes e um sistem run-time ssocido. Juntos, eles são chmdos de Jv Virtul Mchine. Agor há sistems que trduzem código de bytes Jv pr código de máquin pr permitir um execução mis rápid. Porém os pplets Jv são sempre descrregdos do servidor Web n form de código de bytes. Às vezes, um interpretdor pode oferecer tnto implementções compilds como interpretds pr um lingugem. Nesses csos, o interpretdor é usdo pr desenvolver e pr depurr progrms. ntão, depois de que um estdo (reltivmente) livre de problems (bugs) é lcnçdo, os progrms são compildos pr umentr su velocidde de execução.

-16- Progrm-fonte Anlisdor Léxico Uniddes léxics Anlisdor Sintático Árvores de nálise Gerdor de código intermediário Código intermediário Ddos de entrd Interpretdor Resultdos igur 3.3 - Sistem de implementção híbrido. 3.4 CONSRUÇÃO D COMPILADORS A construção de compildores englob váris áres desde teori de lingugens de progrmção té engenhri de softwre, pssndo por rquitetur de máquin, sistems opercionis e lgoritmos. Algums técnics básics de construção de compildores podem ser usds n construção de ferrments vrids pr o processmento de lingugens, como por exemplo: compildores pr lingugens de progrmção: um compildor trduz um progrm escrito num lingugem fonte em um progrm escrito em um lingugem objeto; formtdores de texto: um formtdor de texto mnipul um conjunto de crcteres composto pelo documento ser formtdo e por comndos de formtção (prágrfos, figurs, fórmuls mtemátics, negrito, itálico, etc). São exemplos de textos formtdos os documentos escritos em editores convencionis, os documentos escritos em HML (Hyperext Mrkup Lnguge), os documentos escritos em Ltex, etc.; interpretdores de queries (consults bnco de ddos): um interpretdor de queries trduz um query compost por operdores lógicos ou relcionis em comndos pr percorrer um bnco de ddos. 3.5 PROCSSADORS D LINGUAGNS

-17- Um processdor é um progrm que permite o computdor entender os comndos de lto nível escritos pelos usuários. xistem dois tipos principis de processdores de lingugem: os interpretdores e os trdutores. Um interpretdor (IGURA 3.4) é um progrm que ceit como entrd um progrm escrito em um lingugem chmd lingugem fonte e execut diretmente s instruções dds nest lingugem. P fonte /L qq INRPRADOR resultdos IGURA 3.4: interpretdor Um trdutor (IGURA 3.5) é um progrm que ceit como entrd um progrm escrito em um lingugem fonte e produz como síd um progrm escrito em um lingugem objeto. Muits vezes lingugem objeto é própri lingugem de máquin do computdor. Nesse cso, o progrm objeto pode ser diretmente executdo pel máquin. IGURA 3.5: trdutor P fonte /L qq RADUOR P objeto /L qq rdutores são divididos em dois tipos: montdores e compildores, os quis trduzem lingugens de bixo nível e lingugens de lto nível, respectivmente. xistem tmbém o préprocessdor que trduz um lingugem de lto nível em outr lingugem de lto nível e o crosscompiler que ger código pr outr máquin diferente d utilizd pr compilção. A figur bixo (IGURA 3.6) esquemtiz os três tipos de trdutores. P fonte /L qq COMPILADOR P objeto /L ssemmbl P fonte /L ssemmbly MONADOR P objeto /L máquin P fonte /L qq PRÉ-PROCSSADOR P objeto /L QQ IGURA 3.6: tipos de trdutores No processmento de lingugens pode ser necessário o uso de vários processdores pr trduzir um progrm fonte composto por módulos em um progrm objeto. A figur bixo (IGURA 3.7) present o exemplo de um sistem de processmento de lingugem:

-18- esqueleto do progrm fonte / L qq PRÉ-PROCSSADOR progrm fonte / L qq COMPILADOR progrm objeto / L ssembly MONADOR progrm objeto / L máquin IGURA 3.7: um sistem de processmento de lingugem

-19-3.6 SRUURA GRAL D UM COMPILADOR O objetivo de um compildor é trduzir s seqüêncis de crcteres que representm o progrm fonte em código executável. ss tref é complex o suficiente de form que um compildor pode ser dividido em processos menores interconectdos. A IGURA 3.8 mostr os processos constituintes de um compildor: progrm fonte / L qq nlisdor léxico nlisdor sintático gerencimento d tbel de símbolos nlisdor semântico gerdor de código intermediário trtmento de erros otimizdor de código gerdor de código progrm objeto / L máquin IGURA 3.8: estrutur gerl de um compildor Cd um dos processos tem cesso tbels de informções globis sobre o progrm fonte. N compilção existe tmbém um módulo responsável pelo trtmento ou recuperção de erros cuj função é dignosticr trvés de mensgens dequds os erros léxicos, sintáticos e semânticos encontrdos. 3.6.1 Anlisdor léxico (ou scnner) O nlisdor léxico sepr seqüênci de crcteres que represent o progrm fonte em entiddes ou tokens, símbolos básicos d lingugem. Durnte nálise léxic, os tokens são clssificdos como plvrs reservds, identificdores, símbolos especiis, constntes de tipos básicos (inteiro rel, literl, etc.), entre outrs ctegoris. Considere, por exemplo, seqüênci de crcteres:

-20- SOMA := SOMA + 35 os quis podem ser grupdos, pelo nlisdor léxico, em 5 entiddes: (VALOR) (CLASS) SOMA identificdor := comndo de tribuição SOMA identificdor + operdor ritmético de dição 35 constnte numéric inteir Um token consiste de um pr ordendo (vlor, clsse). A clsse indic nturez d informção contid em vlor. Outrs funções tribuíds o nlisdor léxico são: ignorr espços em brnco e comentários, e detectr erros léxicos. 3.6.2 Anlisdor sintático (ou prser) O nlisdor sintático grup os tokens fornecidos pelo nlisdor léxico em estruturs sintátics, construindo árvore sintátic correspondente. Pr isso, utiliz um série de regrs de sintxe, que constituem grmátic d lingugem fonte. É grmátic d lingugem que define estrutur sintátic do progrm fonte. Por exemplo, pr list de tokens exemplificdos n seção nterior, o nlisdor sintático construiri árvore de derivção presentd bixo: tribuição. identificdor := expressão expressão + expressão identificdor número SOMA SOMA 35 IGURA 3.9: árvore de derivção O nlisdor sintático tem tmbém por tref o reconhecimento de erros sintáticos, que são construções do progrm fonte que não estão de cordo com s regrs de formção de estruturs sintátics como especificdo pel grmátic.

-21-3.6.3 Anlisdor semântico O compildor execut ind nálise semântic 3. O nlisdor semântico utiliz árvore sintátic determind pelo nlisdor sintático pr: identificr operdores e operndos ds expressões, reconhecer erros semânticos, fzer verificções de comptibilidde de tipo, nlisr o escopo ds vriáveis, fzer verificções de correspondênci entre prâmetros tuis e formis. Por exemplo, pr o comndo de tribuição SOMA:= SOMA + 35, é necessário fzer seguinte nálise: o identificdor SOMA foi declrdo? em cso negtivo, erro semântico. o identificdor SOMA é um vriável? em cso negtivo, erro semântico. qul o escopo d declrção d vriável SOMA: locl ou globl? qul o tipo d vriável SOMA? o vlor tribuído no ldo direito do comndo de tribuição é comptível? undmentlmente, nálise semântic trt os spectos sensíveis o contexto d sintxe ds lingugens de progrmção. Por exemplo, não é possível representr em um grmátic livre de contexto um regr como "odo identificdor deve ser declrdo ntes de ser usdo.", e verificção de que ess regr foi plicd cbe à nálise semântic. A regr pode ser representd em um grmátic sensível o contexto, ms não existem lgoritmos rápidos pr ess clsse de grmátics. A idéi fundmentl é de usr tbels externs o processo de nálise sintátic, em que s informções são coletds pr posterior consult. Por exemplo, um tbel de símbolos (ou tbel de identificdores) pode gurdr informções sobre s declrções dos identificdores, e esss informções podem ser consultds pr verificr correção de cd uso de um identificdor. sse processo é implementdo de form dirigid pel sintxe: ssoci-se cd regr d grmátic um ção (ção semântic) ser executd qundo o nlisdor sintático sinliz um uso d regr. sss ções são freqüentemente implementds como chmds de rotins semântics, e podem ser responsáveis por efetur nálise semântic e gerção de código, pelo menos prcilmente. od vez que o nlisdor sintático indicr o uso de um regr ssocid um declrção, rotin semântic ssocid ess regr é chmd pr crescentr à tbel o identificdor correspondente, fornecido pelo nlisdor léxico. Qundo um regr ssocid um uso de um identificdor for sinlizd, rotin semântic correspondente será chmd pr verificr se o identificdor (novmente fornecido pelo nlisdor léxico) const d tbel. Não existe um fronteir definid entre o que deve ser trtdo pelo nlisdor sintático e o que deve ser trtdo pelo nlisdor semântico, cbendo o progrmdor do compildor escolh, segundo sus preferêncis. Alguns compildores incluem gerção de um representção intermediári pr o progrm fonte. Um representção intermediári é um código pr um máquin bstrt e deve ser fácil de produzir e trduzir no progrm objeto. Por exemplo, pode ser usd como form intermediári o código de três endereços (AHO et. l., 1995). O código de três endereços consiste em um seqüênci de instruções, cd um possuindo no máximo três operndos. Pr o comndo de tribuição SOMA:= SOMA + 35 tem-se: 3 semântic nesse cso englob pens um pequen prte do que vem ser relmente semântic de um progrm.

-22- temp 1 := 35 temp 2 := SOMA + temp 1 SOMA:= temp 2 3.6.4 Otimizção de código O processo de otimizção de código consiste em melhorr o código intermediário de tl form que o progrm objeto resultnte sej mis rápido em tempo de execução. Por exemplo, um lgoritmo pr gerção do código intermediário ger um instrução pr cd operdor n árvore sintátic, mesmo que exist um mneir mis otimizd de relizr o mesmo comndo. Assim, o código intermediário: temp 1 := 35 temp 2 := SOMA + temp 1 SOMA:= temp 2 poderi ser otimizdo pr: SOMA:= SOMA + 35 No entnto, não existe nd errdo com o lgoritmo de gerção de código intermediário, desde que o problem pode ser corrigido durnte fse de otimizção de código. 3.6.5 Gerção de código A fse finl do compildor é gerção do código pr o progrm objeto, consistindo normlmente de código em lingugem ssembly ou de código em lingugem de máquin: MOV AX, [som] % cópi do conteúdo do endereço de memóri correspondente o rótulo SOMA pr o registrdor AX ADD AX, 35 % som do vlor constnte 35 o conteúdo do registrdor AX MOV [som], AX % cópi do conteúdo do registrdor AX pr o endereço de memóri correspondente o rótulo som 3.6.5.1 Gerção de Código e Otimizção Dependente de Máquin Observmos ntes que um representção intermediári do progrm fonte deve ser construíd durnte fse de nálise, pr ser usd como bse pr gerção do progrm objeto. Se form dess representção intermediári é bem escolhid, complexidde do processo de gerção de código depende pens d rquitetur d máquin (rel ou virtul) pr qul o código está sendo gerdo. Máquins mis simples oferecem poucs opções e por isso o processo de gerção de código é mis direto. Por exemplo, se um máquin tem pens um registrdor (cumuldor) em que s operções ritmétics são relizds, e pens um instrução pr relizr cd operção (um instrução pr som, um pr produto,...), existe pouc ou nenhum possibilidde de vrição no código que pode ser gerdo. Considere o comndo de tribuição: x := + b * c

-23- A primeir operção ser relizd é o produto de b por c. Seu vlor deve ser gurddo num posição temporári, que indicremos qui por t1. (Pr sistemtizr o processo, todos os resultdos de operções ritmétics serão rmzendos em posições temporáris.) m seguid, devemos relizr som de com t1, cujo vlor será gurddo num posição temporári t2. (Nturlmente, neste cso prticulr, o vlor poderi ser rmzendo diretmente em x, ms no cso gerl, temporári é necessári.) inlmente, o vlor de t2 é rmzendo em x. t1:=b*c t2:=+t1 x:=t2 Podemos fzer um gerdor de código reltivmente simples usndo regrs como: 1. tod operção ritmétic (binári) ger 3 instruções: instrução crreg o primeiro operndo no cumuldor us instrução correspondente operção com o segundo operndo, deixndo o resultdo no cumuldor rmzen o resultdo em um temporári nov exemplo: b * c Lod b Mult c Store t1 2. um comndo de tribuição ger sempre dus instruções: instrução exemplo: x := t2 crreg o vlor d expressão no cumuldor Lod t2 rmzen o resultdo n vriável Store x O comndo de tribuição: x := + b * c, ger o código: 1 Lod b { t1:=b*c } 2 Mult c 3 Store t1 4 Lod { t2:=+t1 } 5 Add t1 6 Store t2 7 Lod t2 { x:=t2 } 8 Store x mbor correto, este código pode obvimente ser melhordo: instrução 7 é desnecessári e pode ser retird: copi pr o cumuldor o vlor de t2, que já se encontr lá. (pós remoção d instrução 7) instrução 6 é desnecessári e pode ser retird: o vlor d vriável t2 nunc é utilizdo. (considerndo que som é comuttiv) s instruções 4 e 5 podem ser trocds por 4' e 5', preprndo novs lterções: 4' Lod t1

-24-5' Add As instruções 3 e 4' são desnecessáris e podem ser retirds (pels mesms rzões que 6 e 7 cim). O código finl pós s trnsformções é considervelmente melhor que o originl: 1 Lod b 2 Mult c 5' Add 8 Store x Normlmente, s máquins oferecem váris instruções (ou vrintes de instruções) com crcterístics semelhntes, e o gerdor deve escolher mis proprid entre els. Como exemplo, vmos exminr o cso d operção de som. m gerl, podemos observr os seguintes pontos: há váris instruções de som, correspondendo vários tipos de ddos e vários modos de endereçmento; há instruções de som plicáveis csos prticulres importntes, como instruções de incremento e decremento: som com ±1; lgums ds soms serem efetuds não form especificds explicitmente pelo progrmdor. ntre esss citmos s soms usds no cálculo de endereços de vriáveis componentes de vetores, mtrizes e estruturs situds em registros de tivção de procedimentos ou funções. reqüentemente, esss soms podem ser incluíds no código de form implícit trvés d escolh de modos de endereçmento dequdos; instruções cuj finlidde principl não é som podem mesmo ssim efetur soms. Por exemplo, s instruções que mnipulm pilh de hrdwre, incrementm ou decrementm o registrdor pontdor do topo d pilh. sses pontos devem ser levdos em considerção pelo gerdor de código n seleção de instruções. Outro problem que tmbém deve ser trtdo é o d escolh do locl pr gurd dos vlores ds vriáveis definids pelo usuário e ds vriáveis temporáris introduzids pelo compildor. Além d locção de posições de memóri esss vriáveis, é freqüente disponibilidde de vários registrdores de uso gerl, que tmbém podem ser usdos com ess finlidde. A locção de registrdores, entretnto, não é independente d seleção de instruções, já que muits instruções usm registrdores ou combinções de registrdores pr operções específics. Cbe o projetist do gerdor de código decidir como implementr gerção de código de mneir fzer bom uso dos recursos disponíveis n máquin. Cbe tmbém o projetist decidir se gerção do código deve ser feit com cuiddo, gerndo diretmente código de qulidde ceitável, ou se é preferível usr um esquem mis simples de gerção de código, seguido por um otimizção do código depois de gerdo. st otimizção do código lev em considerção principlmente s crcterístics d máquin lvo, e por isso é normlmente chmd de otimizção dependente de máquin. 3.6.5.2 Otimizção independente de máquin Algums trnsformções feits no código gerdo por um compildor independem d máquin pr o qul o código está sendo gerdo. Normlmente ests trnsformções são feits no código intermediário, pel fcilidde de cesso já menciond nteriormente. Vmos nest seção presentr lguns exemplos deste tipo de otimizção. xemplo 1: Sub-expressões comuns. Considere seqüênci de comndos de tribuição d primeir colun d tbel.

-25- onte código intermediário originl Código intermediário otimizdo w:=(+b)+c; t1:=+b t2:=t1+c w:=t2 t1:=+b t2:=t1+c w:=t2 x:=(+b)*d; y:=(+b)+c; z:=(+b)*d+e; t3:=+b t4:=t3*d x:=t4 t5:=+b t6:=t5+c y:=t6 t7:=+b t8:=t7*d t9:=t8+e z:=t9 t4:=t1*d x:=t4 y:=t2 t9:=t4+e z:=t9 Clrmente, s (sub-)expressões +b, (+b)+c, e (+b)*d não precism ser clculds mis de um vez. (Isto só é verdde porque os vlores de, b, c e d não se lterm no trecho em questão.) Podemos lterr representção intermediári correspondente (segund colun) pr form intermediári equivlente otimizd presentd n terceir colun. xemplo: Retird de comndos invrintes de loop. Considere o trecho de código seguir: for i:=1 to n do begin pi:=3.1416; pi4:=pi/4.; d[i]:=pi4 * r[i] * r[i]; end; Clrmente, os dois primeiros comndos de tribuição podem ser retirdos do loop, um vez que seu funcionmento é independente do funcionmento do loop. Obterímos pi:=3.1416; pi4:=pi/4.; for i:=1 to n do d[i]:=pi4 * r[i] * r[i]; que é um versão "otimizd" do trecho de código nterior. Note, entretnto, que só há um melhor no tempo de execução se o vlor de n for mior que zero. Se n=0, o código foi piordo: os dois comndos de tribuição serão sempre executdos. Normlmente, s trnsformções relizds no progrm durnte otimizção são simples: eliminr ou lterr instruções, ou ind mover instruções pr outrs posições. A prte mis trblhos é verificr que trnsformção pode ser feit. Por exemplo, pr eliminr um comndo d form v:=e, é preciso verificr que o vlor de v clculdo neste comndo não será usdo por nenhum outro comndo, e, portnto, exminr tod prte do progrm que poderá ser executd seguir. Por ess rzão, nálise de fluxo de ddos (dtflow nlysis) é um prte essencil do estudo d otimizção, pois vis obter informção sobre o funcionmento do progrm, em prticulr especificndo os pontos do progrm onde s vriáveis recebem vlores, e onde os vlores são usdos. 3.7 ORMAS D CONSRUÇÃO D UM COMPILADOR Um compildor pode ser composto de váris fses denominds de pssos do compildor.

-26- Dependendo d implementção, certos pssos podem ser executdos seqüencilmente ou ter execução entrelçd, enqunto lguns pssos podem ser omitidos. Num compilção em vários pssos, execução de um psso termin ntes de inicir-se execução dos pssos seguintes. Assim, o compildor de dois pssos, por exemplo, poderi combinr nálise léxic e nálise sintátic num primeiro psso e nálise semântic e gerção de código num segundo psso. De outr form, pode-se utilizr o nlisdor sintático como módulo principl: pr construir árvore sintátic, obtém os tokens necessários trvés de chmds o nlisdor léxico e chm o processo de gerção de código pr executr nálise semântic e gerção de código objeto. Os critérios pr escolh d form de implementção envolvem: memóri disponível, tempo de compilção ou tempo de execução, crcterístics d lingugem e equipe de desenvolvimento. A principl vntgem de se construir compildores de vários pssos é modulrizção lcnçd no projeto e n implementção dos processos que constituem o compildor. A principl desvntgem é o umento do projeto totl, com necessidde de introdução ds lingugens intermediáris. A figur bixo (IGURA 3.10) present estrutur gerl de um compildor: Anlisdor Léxico tokens Anlisdor Sintático tbel de literis tbel de constntes Anlisdor Semântico Gerção de Código código HIPO Simulção Máquin HIPOtétic tbel de símbolos Recuperção de RROS resultdos IGURA 3.10: estrutur gerl de um compildor 3.8 RRAMNAS PARA A CONSRUÇÃO D COMPILADORS N construção de compildores fz-se uso de ferrments de softwre tis como mbientes de progrmção, depurdores, gerencidores de versões, etc. ind, form crids lgums ferrments pr projeto e gerção utomátic de lguns processos componentes de compildores. sss ferrments são freqüentemente referids como compildores de compildores, gerdores de compildores ou sistems de escrit de trdutores. Normlmente, são orientdos um modelo prticulr de lingugem e mis dequdos pr construção de compildores de lingugens similres o modelo. Segundo AHO et. l. (1995), lguns tipos de ferrments são: 1. gerdores de nlisdores léxicos: germ utomticmente nlisdores léxicos, normlmente prtir de um especificção bsed em expressões regulres e um list de plvrs-chve d lingugem (LX); 2. gerdores de nlisdores sintáticos: produzem nlisdores sintáticos prtir d especificção de um grmátic livre de contexto (YACC, -gen, JACK).

-27-4 ANALISADOR LÉXICO 4.1 UNÇÃO No processo de compilção, o nlisdor léxico é responsável pel identificção dos tokens, ou sej, ds menores uniddes de informção que constituem lingugem em questão. Assim, pode-se dizer que o nlisdor léxico é responsável pel leitur dos crcteres d entrd, grupndo-os em plvrs, que são clssificds em ctegoris. sts ctegoris podem ser, bsicmente, s seguintes: plvrs reservds: plvrs que devem precer literlmente n lingugem, sem vrições. Algums plvrs reservds d lingugem PASCAL são: BGIN, ND, I, LS. identificdores: plvrs que seguem lgums regrs de escrit, porém podem ssumir diversos vlores. São definidos de form genéric. Gerlmente, s regrs de formção de identificdores são s mesms utilizds pr formção de plvrs reservds. Nesse cso, é necessário lgum mecnismo pr decidir qundo um token form um identificdor ou um plvr reservd. símbolos especiis: seqüêncis de um ou mis símbolos que não podem precer em identificdores nem plvrs reservds. São utilizdos pr composição de expressões ritmétics ou lógics, comndo de tribuição, etc. São exemplos de símbolos especiis: ; (ponto-e-vírgul), : (dois pontos), := (tribuição). constntes: podem ser vlores inteiros, vlores reis, crcteres ou literis. comentário: qulquer cdei de crcteres inicindo com e terminndo com símbolos delimitdores, utilizd n documentção do progrm fonte. Pr construção de um nlisdor léxico é necessário descrever precismente regr de formção (pdrão) de tokens mis complexos, como plvrs reservds, identificdores, constntes e comentários, usdo expressões regulres; converter especificção feit em termos de expressões regulres n implementção de utômtos finitos determinísticos mínimos correspondente; implementr os utômtos finitos determinísticos mínimos em um lingugem de progrmção. 4.2 RCONHCIMNO D OKNS: AUÔMAO INIO Um utômto finito (A) é o tipo mis simples de reconhecedor de lingugens. Um A, dentre outrs plicções, pode ser usdo como reconhecedor de pdrões de processmento de textos e nlisdor léxico em lingugens de progrmção. Um utômto finito pode ser visto como um máquin de estdos. Assume-se que máquin estej em um estdo inicil qundo começ su operção. O novo estdo d máquin é determindo em função do estdo corrente e do evento ocorrido. Assim, por exemplo, um máquin hipotétic cujos estdos possíveis são repouso, mnutenção e tividde, poderi ser representd d seguinte form (IGURA 4.1):

-28- OK mnutenção O PAN repouso tividde IGURA 4.1: exemplo de um máquin de estdos (ZILLR, 1997) Inicilmente máquin está em repouso. A máquin entr em tividde qundo é ligd (evento ON) e volt o estdo de repouso qundo é utomticmente desligd (evento O) pós produção de um determind peç. Assim, o funcionmento norml consiste num seqüênci de eventos ON e O. No entnto, pode ocorrer um pne qundo máquin estiver em tividde. Nesse cso, qundo d ocorrênci do evento PAN, máquin mud pr o estdo de mnutenção, retornndo o estdo de repouso pós serem relizdos os devidos justes (evento OK). ON 4.3 IMPLMNAÇÃO N implementção do nlisdor léxico deve-se: desconsiderr brncos à esquerd; considerr como mrc de finl de sentenç o primeiro crctere que não pertencer o lfbeto d seqüênci que está sendo reconhecid; eliminr delimitdores e comentários usdos por questões de legibilidde pelo progrmdor, os quis são totlmente irrelevntes do ponto de vist de gerção de código. O nlisdor léxico pode ser implementdo de form mist: us-se implementção específic de utômtos pr o reconhecimento do primeiro crctere e implementção genéric de utômtos pr o reconhecimento do restnte d sentenç, exceto os símbolos especiis cujo o reconhecimento poderá ser totlmente efetudo de form específic. Deve-se tmbém implementr estrtégis pr recuperção e trtmento de erros léxicos, quis sejm: símbolos que não fzem prte d lingugem em questão bem como seqüêncis de símbolos que não obedecem às regrs de formção dos tokens especificdos. JOSÉ NO (1987) present lgums técnics pr recuperção de erros léxicos. AHO et. l. (1995) descreve técnic pnic-mode.

-29-5 ANALISADOR SINÁICO 5.1 UNÇÃO O nlisdor sintático grup os tokens fornecidos pelo nlisdor léxico em estruturs sintátics, construindo árvore sintátic correspondente. Pr isso, utiliz um série de regrs de sintxe, que constituem grmátic d lingugem fonte. O nlisdor sintático tem tmbém por tref o reconhecimento de erros sintáticos, que são construções do progrm fonte que não estão de cordo com s regrs de formção de estruturs sintátics especificds trvés de um grmátic livre de contexto. 5.2 SPCIICAÇÃO DAS RGRAS SINÁICAS: GRAMÁICA LIVR D CONXO Segundo PRIC; DLWISS (1989), dentro d hierrqui de Chomsky, s grmátics livres de contexto (GLC) são s mis importntes n áre de compildores e lingugens formis, pois podem especificr mior prte ds construções sintátics usuis. 5.2.1 Notções xistem inúmers notções pels quis representção de um lingugem pode ser especificd. Segundo JOSÉ NO (1987), " tis notções dá-se o nome de metlingugens, já que els própris são lingugens, trvés ds quis s lingugens são especificds". A sintxe de um lingugem de progrmção pode ser descrit usndo-se s seguintes notções: Suponh que um lingugem de progrmção só tem vriáveis do tipo inteiro e que declrção de vriáveis deve ser feit usndo plvr reservd vriáveis seguid do tipo, de um list de identificdores seprdos por vírgul, e de um ponto e vírgul. Pr especificr sintxe dess declrção de vriáveis pode-se escrever seguinte grmátic: XMPLO : sintxe d declrção de vriáveis usndo notção de regrs de produção D vriáveis inteiro L; L identificdor identificdor, L notção BN (Bckus-Nur orm), muito usd pr especificção de lingugens livres de contexto, dot seguinte simbologi: <x> represent um símbolo não-terminl, cujo o nome é ddo pel cdei x de crcteres quisquer. <x>::= β represent s regrs de produção, ssocindo o não-terminl <x> à sentenç β. O significdo de um regr de produção <x> ::= β é <x> é definido por β. sepr s diverss regrs de produção que estão à direit do símbolo ::=, desde que o símbolo não-terminl à esquerd sej o mesmo. O significdo de <x> ::= β 1 β 2... β n é <x> é definido por β 1 OU <x> é definido por β 2 OU... <x> é definido por β n.

-30- x ou X represent um símbolo terminl, ddo pel cdei x ou X de crcteres quisquer e deve ser escrito tl como prece ns sentençs d lingugem. A grmátic presentd nteriormente pode ser escrit d seguinte form usndo notção BN: XMPLO : sintxe d declrção de vriáveis usndo notção BN <declrção de vriáveis> ::= vriáveis inteiro <list de identificdores> ; <list de identificdores> ::= identificdor identificdor, <list de identificdores> digrms de sintxe são "um ferrment muito cômod pr documentção e o estudo d sintxe de lingugens de progrmção, oferecendo possibilidde de obtenção de reconhecedores eficientes prtir d grmátic, medinte um esforço reduzido" (JOSÉ NO, 1987). Um digrm de sintxe present um início e um fim, ligdos por um grfo orientdo, cujos retângulos representm os símbolos não-terminis e s elipses representm os símbolos terminis. Pr ler um digrm de sintxe, deve-se seguir s sets, s quis podem eventulmente presentr cminhos lterntivos ou não obrigtórios. XMPLO : grmátic presentd nteriormente, tem o seguinte digrm de sintxe: declrção de vriáveis =, vriáveis inteiro identificdor ; IGURA 5.1: digrm de sintxe 5.2.2 Árvore de derivção ou árvore sintátic Algums vezes pode ser útil mostrr s derivções de um GLC trvés de representções gráfics. sss representções chmds de árvores de derivção ou árvores sintátics impõem estruturs hierárquics às sentençs ds lingugens gerds. A árvore de derivção é síd lógic d nálise sintátic, constituindo um representção intermediári utilizd n nálise semântic. xemplo: + * ( ) Pels convenções vists, temos: símbolos terminis: { +, *, (, ), } símbolos não terminis: {,, } Símbolo inicil: regrs: { +,, *,, (), } Por exemplo, cdei +* pertence à lingugem d grmátic, por cus d derivção (1) + + + +* +* +* +*

-31- Note que outrs derivções são possíveis pr mesm cdei. Por exemplo, temos (2) + +* +* +* +* +* +* +* (3) + +* +* +* +* +* +* +* As derivções (1), (2) e (3) cim são equivlentes, no sentido de que mbs germ cdei d mesm mneir, plicndo s mesms regrs os mesmos símbolos, e se diferencim pens pel ordem em que s regrs são plicds. A mneir de verificr isso é usr um árvore de derivção, que pr este cso seri descrit n figur bixo: + * igur - Árvore de derivção pr +* Num certo sentido, árvore de derivção crcteriz s grmátics livres de contexto: expnsão correspondente cd sub-árvore pode ser feit de form bsolutmente independente ds demis sub-árvores. Por ess rzão, considermos equivlentes tods s derivções que correspondem à mesm árvore de derivção. Dois tipos de derivção são especilmente interessntes: derivção esquerd (leftmost derivtion), em que um regr é sempre plicd o primeiro não terminl d cdei, o que fic mis à esquerd; derivção direit (rightmost derivtion), em que um regr é sempre plicd o último não terminl d cdei, o que fic mis à direit. Pr especificr um derivção de um cdei x, podemos, equivlentemente, presentr um derivção esquerd de x, um derivção direit de x, ou um árvore de derivção de x. A prtir de um desss três descrições, é possível sempre gerr s outrs dus. Por exemplo, dd um árvore de derivção de x, bst percorrer árvore em pré-ordem (primeiro riz, depois s subárvores em ordem, d esquerd pr direit), e plicr s regrs encontrds sempre o primeiro não terminl, pr construir um derivção esquerd. Pr derivção direit árvore deve ser percorrid em um ordem semelhnte: primeiro riz, depois s sub-árvores em ordem, d direit pr esquerd. xemplo (continução): A derivção (1) é um derivção esquerd, e derivção (2) é um derivção direit. A derivção (3) nem é um derivção esquerd, nem é um derivção direit. Dd um cdei x, tods s derivções possíveis de x correspondem extmente à mesm árvore de derivção. Veremos bixo que isto quer dizer que grmátic nterior não é mbígu. Um grmátic é mbígu se, pr lgum cdei x, existem dus ou mis árvores de derivção. Podemos mostrr que um grmátic é mbígu mostrndo um cdei x e dus árvores de derivção distints de x (ou dus derivções esquerds distints, ou dus derivções direits distints).