Escolar Documentos
Profissional Documentos
Cultura Documentos
2 Anlise Lxica
Fontes: 1. Compiladores Princpios e prticas, Keneth C.Louden, Thomson, 2004. Cap. 1 Introduo Cap. 2 Processo de Varrimento, Anlise lxica 2. Compiladores - Princpios , Tcnicas e Ferramentas, Alfred V. Aho, Monica S. Lam e Ravi Sethi, Pearson, 2 edio, 2007. Cap. 3 Anlise Lxica 3. Processadores de Linguagens da concepo implementao, Rui Gustavo Crespo. IST Press.1998. Cap. 2 Definio de Linguagens
Ana Madureira
Engenharia Informtica Ano Lectivo: 2011/2012
Anlise Lxica
Agrupa sequncias de caracteres em tokens - as unidades bsicas da sintaxe A sequncia de caracteres que formam um token chama-se lexema tokens tpicos: constantes (literais), ids, operadores, palavras--chave, etc. Elimina sequncias de caracteres inteis (espaos, tabs, LF, CR, comentrios) Recorre-se de:
Expresses Regulares - representam padres de cadeias de caracteres Autmatos Finitos forma matemtica de descrever tipos particulares de algoritmos , para descrever o processo de reconhecimento de padres em cadeias de caracteres.
Agrupar os caracteres individuais do programa fonte em palavras, designadas por tokens, que so as unidades bsicas das linguagens de programao, e que sero usados pelo analisador sintctico (parser) ignorar alguns tipos de caracteres (espaos, tabs, LF, CR) e os comentrios produzir mensagens de erro quando algum caracter ou sequncia de caracteres no so reconhecidos localizar os tokens no texto fonte (n de linha, n de coluna) actuar como pr-processador (em certos compiladores)
Tokens e Lexemas
Token representa um conjunto de cadeias de entrada possvel Lexema uma determinada cadeia de entrada associada a um token
Token Alguns lexemas possveis
identificador
i, j, contador, nome_aluno
abr_par
Analisador lxico
O analisador lxico (scanner) actua como uma subrotina do analisador sintctico (parser):
programa fonte Pedido do prximo token
scanner
token
parser
struct TokenRecord { TokenType kind; int linenum; union { char *lexeme; int value; } attribute; }
Uso de parntesis: Uma expresso regular da forma (s), onde s uma expresso regular; se r = (s) ento L(r) = L(s); os parntesis servem apenas para modificar a precedncia das operaes Notar o uso dos caracteres | * ( e ) para designar as operaes entre expresses regulares: estes caracteres com significado especial designam-se por metacaracteres. Se estes caracteres tambm pertencerem ao alfabeto ento o seu uso como caracteres deve ser distinguido de alguma forma ( p. ex. colocando-os entre plicas - (
Exemplos
Concatenao Se S = {aa, b} e T = {a, bb} ento R = ST = {aaa, aabb, ba, bbb}
Fecho de Kleene Se S = {a} ento S* = S0 S1 S2 S3 onde S0 = {}, S1 = S, S2 = SS, S3 = SSS, logo S* = {, a, aa, aaa, aaaa, }
No alfabeto = {a, b, c} a) escrever uma expresso regular que represente todos as strings que contm um s b: (a | c)* b (a | c)* A expresso gera uma linguagem que contm por exemplo: b, abc, abaca, ccbaca, cccccb, etc. b) escrever uma expresso regular que represente todos as strings que contm no mximo um b: (a | c)* | (a | c)* b (a | c)* ou (a | c)* (b | ) (a | c)* Ambas as expresso de cima geram a mesma linguagem que a que foi especificada por palavras
Exemplos
No alfabeto = {a, b, c} escrever uma expresso regular que represente todos as strings que no contm bs consecutivos.
Strings que no contm bs: (a | c)* Strings que tm qualquer coisa a seguir a um b: (b (a | c) )* Combinando os 2 anteriores temos realmente strings sem bs consecutivos: ( (a | c) * | (b (a | c) )* )* = ((a | c) | b (a | c) )* uma vez que (r* | s*)* = (r | s)* No entanto esta ainda no a soluo para o problema inicial, uma vez que no contempla os strings que terminam em b. Para chegar soluo geral basta agora dar essa possibilidade: ((a | c) | b (a | c))* (b | )
Subexpresses:
natural = [0-9]+ natural_com_sinal = (+ | -)? natural
2. Escrever uma expresso regular global (R)agrupando todas as definies anteriores: R = palavra_chave | identificador | inteiro | espao_em_branco | ...
Certas linguagens exigem que se conheam vrios caracteres para alm do fim do token que se est a reconhecer (lookahead) Ex: No FORTRAN as palavras chave no so reservadas nem o espao em branco significativo:
IF ( I F .EQ. 0) THENTHEN=1.0 (instrues vlidas em FORTRAN) DO99I=1,10 DO99I=1.10
As propriedades das expresses regulares mencionadas acima servem para simplificar expresses regulares e provar a equivalncia entre duas expresses regulares.
Que formalismo usar para que possa ser facilmente implementado num programa? Modelo matemtico conhecido por autmato finito (AFD), definido por um vector (S, , s0, F, ): o alfabeto de entrada um conjunto finito de estados S um conjunto de transies entre estados para um carcter de (ou ) do tipo do estado x transita-se para o estado y com a entrada 'c' : S x S (funo parcial) um conjunto de estados de aceitao ou finais F (F S) um estado inicial s0 S
Um autmato finito pode ser representado por uma tabela ou, mais frequentemente por um grafo, em que os ns so estados e os ramos transies, etiquetados com os caracteres que determinam essa transio; os estados inicial e finais devero estar marcados
Representao Grfica
estado 8: erro
3
. . dgito|+|- digto
+ e|-|
digto
1
dgito
2
|+ |- e
|.
4
+ |- |.
outro caracter
|. |+ |- e|-|+|. e
8
qualquer +|-
dgito
7
dgito
6
dgito
f IF i
nessa altura se estivermos num estado final reconhece-se o token respectivo; se no estivermos num estado final recuamos, carcter a carcter, at passarmos por um estado final.
PAREN ESQ
<
6
MENOR
7
MENOR|IGUAL
10
Tipos de autmatos
Seja A=(S, , i, F, ) um autmato finito.
A diz-se autmato finito determinstico (AFD) se, perante um smbolo x de , puder transitar, no mximo, para um nico estado, isto : ( (s, x, s) (s, x, s) ) s = s Caso contrrio, A diz-se no determinstico A diz-se autmato finito se possvel transitar de estado sem usar nenhum smbolo de , isto :
S x ({}) x S
Para o alfabeto = {a, b, c, d}, qualquer palavra com um nmero par de smbolos b.
Os autmatos finitos no determinsticos podem ter transies de estado sem consumirem qualquer entrada - as chamadas transies
11
Aceitao de AFNs
Uma string x1xn aceite por um AFN se existir um caminho comeando no estado inicial e terminando num estado final, cujas etiquetas dos ramos percorridos coincidam, por ordem, com os caracteres x1 a xn, com a possvel incluso, em qualquer local, de qualquer nmero de transies Os autmatos finitos (determinsticos e no determinsticos) definem linguagens, que so exactamente o conjunto de strings aceites pelo autmato Existe equivalncia entre expresses regulares (ER), autmatos finitos determinsticos (AFD) e autmatos finitos no determinsticos (AFN) Dada uma expresso regular sempre possvel construir um AFN que aceita exactamente a mesma linguagem Dado um AFN sempre possvel construir um AFD que aceita exactamente a mesma linguagem algoritmo da construo dos subconjuntos Dado um AFD sempre possvel construir uma ER que aceita exactamente a mesma linguagem
AFN
0|1 0 1 1
4
0
AFD
1
1 0 1
2
0 0 1
12
AFN
AFD
a a a a a a
4
a
Caminho e rtulo
Seja A=(S, , i, F, ) um autmato finito. Um caminho no trivial uma sequncia (s0, a1, s1), (s1, a2, s2), ..., (sn-1, an, sn) onde (si-1, ai, si) Um caminho trivial uma tripla da forma (s, , s), com s S O rtulo do caminho a1 a2 ... an
13
14