exemplos compilador automatos

Upload: fabio-jasevicius

Post on 10-Jul-2015

120 views

Category:

Documents


0 download

TRANSCRIPT

COMPILADORES

2. AUTMATO FINITO E ANLISE LXICACONCEITOS BSICOS EM GRAMTICAS E LINGUAGENS Alfabeto ou Classe de Caracteres denota um conjunto finito de smbolos (smbolo e caracter sero usados como sinnimos nesse curso). Exemplo: O conjunto {0, 1} um alfabeto, composto dos dois smbolos 0 e 1, freqentemente chamado de alfabeto binrio. Cadeia uma seqncia finita de smbolos de um alfabeto, tal como 001. O tamanho de uma cadeia x, normalmente denotado por |x|, o nmero total de smbolos em x. Uma cadeia especial a cadeia vazia, denotada por &. O tamanho da cadeia vazia 0 (zero). Exemplo: x = 010110 |x| = 6

Se x e y so cadeias, ento a concatenao de x e y, com notao x.y ou simplesmente xy, a cadeia formada pelos smbolos de x imediatamente seguidos pelos smbolos de y. Exemplo: x = abc y = def x.y = abcdefPg. 1

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

COMPILADORES A concatenao de qualquer cadeia x com a cadeia vazia resulta na mesma cadeia x. Formalmente expressamos x.& = &.x = x. Se x uma cadeia, qualquer cadeia formada a partir da eliminao de zero ou mais smbolos finais de x chamada de prefixo (ou cabea) de x. Exemplo: x = abcde Prefixos de x = &, a, ab, abc, abcd, abcde Do mesmo modo, um sufixo (ou rabo) de x qualquer cadeia formada a partir da eliminao de zero ou mais smbolos iniciais de x. Exemplo: x = abcde Sufixos de x = &, e, de, cde, bcde, abcde Uma subcadeia de x qualquer cadeia formada pela eliminao de um prefixo e um sufixo de x.

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 2

COMPILADORES Podemos chegar ento s concluses: 1. para qualquer cadeia x, ambos x e & so prefixos, sufixos e subcadeias de x; 2. qualquer prefixo ou sufixo de x uma subcadeia de x, mas uma subcadeia no necessariamente um prefixo ou sufixo. Exemplo: x = abcde Subcadeia de x = bcd (no prefixo nem sufixo) Dizemos que uma cadeia y um prefixo, sufixo ou subcadeia prpria de x, se ela um prefixo, sufixo ou subcadeia de x e y x. Conjuntos de cadeias de um alfabeto so denotados usualmente por letras maisculas A, B, ..., Z. O produto AB de dois conjuntos de cadeias A e B definido por AB = {xy | x A e y B} Exemplo: A = {a, b} B = {c, d}

AB = {ac, ad, bc, bd} UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico Pg. 3

COMPILADORES Vale para conjuntos de cadeias a regra {&}.A = A.{&} = A Podemos definir agora potncia de cadeias. Se x uma cadeia, x0 a cadeia vazia, x1 = x, x2 = xx e, em geral, xn = xxx...x (n vezes). Podemos definir tambm potncia de um alfabeto A: A0 = {&}, A1 = A, ..., An = A.An-1 para n > 0 Chegamos ento definio de fechamento positivo e fechamento de um conjunto A: A+ = A1 A2 ... An A* = A0 A+ Exemplo: A = {a, b} A* = {&, a, b, aa, ab, ba, bb, aaa, aab, ...} Note que A+ = A(A*) = (A*)A. UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico Pg. 4

COMPILADORES s vezes mais conveniente (e mais claro) escrever x... z = x... z = ...x z = ...x... z = S... z = ...S z = ...S... indicando indicando indicando indicando indicando indicando indicando xy x prefixo (cabea) de z x sufixo (rabo) de z x subcadeia de z S o primeiro smbolo de z S o ltimo smbolo de z o smbolo S aparece em z

Finalmente podemos definir (genericamente) linguagem como sendo qualquer conjunto de cadeias formadas a partir de um alfabeto dado. Uma produo ou (U, x), usualmente escrito U ::= x onde U um smbolo e x uma cadeia finita no vazia de smbolos. U a parte esquerda e x a parte direita da produo. Ns usaremos a abreviao regra para nos referirmos a regra de produo. regra de produo um par ordenado

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 5

COMPILADORES Uma gramtica G[ Z ] um conjunto finito no vazio de regras. Z o smbolo que deve aparecer como parte esquerda de pelo menos uma regra. Ele chamado de smbolo inicial. Todos os smbolos usados nas partes esquerdas e direitas das regras formam o vocabulrio V. Exemplo: V = ::= ::= ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , }

OBS. usamos a notao Backus-Normal-Form (BNF) Dada uma gramtica G, os smbolos que aparecem como parte esquerda de uma regra so chamados no-terminais ou entidades sintticas. Eles formam o conjunto de no-terminais VN. Os smbolos no presentes em VN so chamados terminais. Eles formam o conjunto VT. Ento, V = VN VT. Exemplo: Da gramtica do exemplo anterior, temos: VN = {, } VT = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico Pg. 6

COMPILADORES Agora que temos uma gramtica, como indicar a linguagem correspondente essa gramtica? Quais so as sentenas geradas pela gramtica? Vamos usar os smbolos => e =>+ para indicar a derivao de sentenas. Dada a gramtica G, dizemos que a cadeia v produz diretamente a cadeia w, v => w se ns podemos escrever v = xUy, w = xuy para alguma cadeia x e y, e U ::= u uma regra de G. Ns podemos dizer tambm que w uma derivao direta de v, ou que w reduz-se diretamente a v. OBS. Como x e y podem U ::= u de G, ns temos U => u. ser a cadeia vazia, para cada regra

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 7

COMPILADORES Dada a gramtica G, dizemos que v produz w, ou que w reduz-se a v, v =>+ w se existe uma seqncia de derivaes diretas v = u0 => u1 => u2 => ... => un = w com n > tamanho n. 0. Essa seqncia chamada de derivao de

Finalmente, ns escrevemos v =>* w se v =>+ w ou v = w. Dada uma gramtica G[ Z ], ns dizemos que uma cadeia x uma forma sentencial de G, se x derivada do smbolo inicial Z - indicamos por Z =>* x. Uma sentena uma forma sentencial que contm somente smbolos terminais. A linguagem L( G[ Z ] ) o conjunto de sentenas L( G ) = {x | Z =>* x e x VT+ }

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 8

COMPILADORES Exemplo: 123 1234

::= ::= ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 => =>+ =>* 123 forma sentencial sentena

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 9

COMPILADORES ANALISADOR LXICO O analisador lxico (scanner) a parte do compilador responsvel por ler caracteres do programa fonte e transform-los em uma representao conveniente para o analisador sinttico. O analisador lxico l o programa fonte caracter a caracter, agrupando os caracteres lidos para formar os smbolos bsicos (tokens) da linguagem identificadores, palavras-chaves, operadores, parentisadores e sinais de pontuao. O analisador lxico interage diretamente com o analisador sinttico de duas possveis formas, como vemos na figura 2.1.

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 10

COMPILADORES

Figura 2.1 - Relao Lxico x Sinttico O esquema 2 , em geral, melhor porque no necessitamos de que todo o programa fonte seja transformado em uma seqncia de smbolos (expressos por meio de uma codificao) de uma s vez (o que implica na necessidade de rea de armazenamento para toda essa informao - imagine um programa fonte de 25.000 linhas).

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 11

COMPILADORES Os smbolos reconhecidos pelo lxico se enquadram em uma das seguintes classes:

Identificadores (do usurio, da linguagem - palavras-chaves, funes embutidas); Nmeros (inteiros, reais, complexos); Operadores (aritmticos, relacionais, lgicos); Parentisadores (abre/fecha aspas, abre/fecha parnteses, abre/fecha colchetes, abre/fecha chaves, BEGIN/END); Sinais de pontuao (ponto, vrgula, ponto-e-vrgula).

Vejamos um exemplo. Seja a seguinte gramtica: ::= IDENT = ::= + | ::= * | ::= ** | ::= IDENT | ( ) | NMERO

As sentenas geradas por essa gramtica so atribuies de expresses aritmticas, parentisadas ou no, envolvendo operaes de adio, multiplicao e exponenciao entre operandos denominados genericamente de IDENT e NMERO.

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 12

COMPILADORES Digamos, por exemplo, que IDENT define uma classe de identificadores que poderiam ser A, ALO, B612, C3PO, etc., e que NMERO define uma classe de inteiros naturais como 123, 004, 32767, etc. A funo do analisador lxico para a linguagem gerada pela gramtica acima seria interpretar as cadeias de caracteres de entrada, agrupa-las e classifica-las como identificador, nmero, operador +, operador *, operador **, parentisador '(' e parentisador ')'. Para a sentena A = A + BC ** 32, o lxico poderia produzir: Chamada 1a 2a 3a 4a 5a 6a 7a Cadeia Lida A = A + BC ** 32 Smbolo IDENT op = IDENT op + IDENT op ** NMERO Cdigo 1 11 1 12 1 14 2

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 13

COMPILADORES Onde usamos a seguinte codificao de smbolos: Smbolo IDENT NMERO = + Cdigo 1 2 11 12 Smbolo * ** ( ) Cdigo 13 14 21 22

DESCRIO DE SMBOLOS COM GRAMTICAS REGULARES Os smbolos de uma linguagem podem ser descritos facilmente atravs de gramticas regulares1. Para a gramtica do exemplo anterior, poderamos ter: ::= L2 | L ::= L | D3 | L | D ::= D | D ::= = | + | * | ** ::= ( | )

1 2 3

Gramtica Regular aquela que tem regras da forma ::= ou ::= , com , VN e VT. L = Letra. D = Dgito.

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 14

COMPILADORES DESCRIO DE SMBOLOS COM AUTMATOS FINITOS Outra forma de descrever os smbolos de uma linguagem seria com o uso de autmatos de estados finitos (que tm a vantagem de permitir uma traduo quase direta para cdigo de programao). Para a gramtica do exemplo anterior teramos os autmatos da figura 2.2. Obter algoritmos a partir dos autmatos uma tarefa bastante simples. Vejamos alguns exemplos a seguir.

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 15

COMPILADORES

Figura 2.2 - Autmatos para reconhecimento de smbolos

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 16

COMPILADORES RECONHECIMENTO DE IDENTIFICADOR procedimento identificador; { enquanto caracter LETRA ou DGITO faa { smbolo = smbolo || caracter; caracter = leia_caracter(); } return( 1, smbolo); }

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 17

COMPILADORES RECONHECIMENTO DE NMERO procedimento nmero; { enquanto caracter DGITO { smbolo = smbolo || caracter; caracter = leia_caracter(); } return( 2, smbolo ); }

Nas linguagens de programao comum a existncia de identificadores que pertenam linguagem e tm seu uso reservado para o compilador (facilitando a tarefa de reconhecimento sinttico). No procedimento de reconhecimento de identificador, portanto, deve ser feita uma consulta uma tabela de palavras reservadas para verificar se um identificador reconhecido uma palavra reservada ou no ( um nome definido pelo programador).

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 18

COMPILADORES IMPLEMENTAO DO ANALISADOR LXICO Para implementar o analisador lxico mais facilmente, podemos agrupar os autmatos para reconhecimento de identificadores, nmeros e operadores em um nico autmato que seria o prprio analisador. Vejamos isso na figura 2.3.

Figura 2.3 - Autmato final do analisador lxico UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico Pg. 19

COMPILADORES ROTINAS NECESSRIAS

leia_caracter(): funo que obtm o prximo caracter do programa fonte; leia_caracter_no_branco(): funo que obtm o prximo caracter diferente de branco (espao, tabulao, mudana de linha, mudana de pgina) do programa fonte.

VARIVEIS NECESSRIAS

caracter: armazena o ltimo caracter lido e que est sendo analisado; smbolo: armazena a cadeia de caracteres que compem o smbolo sendo formado.

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 20

COMPILADORES ALGORITMO procedimento analisador lxico; { obteve_smbolo = FALSE; enquanto no obteve_smbolo { caracter = leia_caracter_nao_branco(); smbolo = &; se caracter LETRA ento identificador(); seno se caracter DGITO ento nmero(); seno operador(); } return( cdigo, smbolo ); }

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 21

COMPILADORES procedimento identificador() { enquanto caracter LETRA ou DGITO { smbolo = smbolo || caracter; caracter = leia_caracter(); } se tamanho( smbolo ) > MXIMO_PERMITIDO { escreva advertncia; considere apenas o MXIMO_PERMITIDO; } se smbolo palavra reservada ento cdigo = cdigo_referente__palavra; seno cdigo = cdigo_de_identificador; obteve_smbolo = TRUE; }

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 22

COMPILADORES procedimento numero() { enquanto caracter DGITO { smbolo = smbolo || caracter; caracter = leia_caracter(); } se valor( smbolo ) < MNIMO_ACEITO { escreva advertncia; considere apenas o MNIMO_ACEITO; seno se valor( smbolo ) > MXIMO_ACEITO { escreva advertncia; considere apenas o MXIMO_ACEITO; } cdigo = cdigo_de_nmero; obteve_smbolo = TRUE; }

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 23

COMPILADORES procedimento operador() { obteve_smbolo = TRUE; se caracter = + { cdigo = cdigo_de_adio; } seno se caracter = * { caracter = leia_caracter(); se caracter = * { cdigo = cdigo_de_exponenciao; } seno { cdigo = cdigo_de_multiplicao; } } seno se caracter = = { cdigo = cdigo_atribuio; } seno { escreva advertncia; obteve_smbolo = FALSE; } }

UFCG / DSC / PSN, 2005 Parte 2: Gramticas e Linguagens & Analisador Lxico

Pg. 24