An´alise L´exica
1. Processo de an´alise:
l´exica: identificac¸˜ao das palavras ou “tokens” da linguagem no programa.
sint´atica: organiza os tokens de acordo com a regras gramticais da linguagem.
semˆantica: calcula o significado do programa.
2. Exemplos de tokens: identificadores, n ´umeros, parˆentesis.
3. “N˜ao-exemplos”: coment´arios, diretivas de preprocessador, macros, caracteres especiais como branco, de tabulac¸˜ao e quebra-de-linha.
4. A an´alise l´exica do programa
float match0(char* s)
if (!strncmp(s, "0.0", 3)) return 0.0 ;
retorna o “stream”: FLOAT ID(match0) LPAREN CHAR STAR ID(s) RPAREN IF LPAREN BANG ID(strncmp) LPAREN
ID(s) COMMA STRING(0.0) COMMA NUM(3) RPAREN RPAREN RETURN REAL(0.0) SEMI RBRACE EOF
5. A linguagem formal para a especificac¸˜ao do (analisador) l´exico de uma linguagem ´e a de express˜oes regulares, cujo significador ´e um autˆomato finito determin´ıstico.
6. A (meta-)linguagem de express ˜oes regulares ´e:
s´ımbolo: a, b, c alternativa: |
concatenac¸˜ao: a b ou simplesmente ab string vazia:
repetic¸˜ao: a zero ou mais strings (fecho de Kleene)
( 0 | 1 ) 0 – n´umeros bin´arios m´ultiplos de .
b (abb) (a | ) – strings de as e bs sem as consecutivos.
8. Abreviac¸ ˜oes:
[abcd] (a | b | c | d) [b-g] [bcdefg]
M? (M | ) M
(M M )
9. Exemplos:
if IF
[a-z][a-z0-9] ID
[0-9] NUM
([0-9] "."[0-9] ) | REAL ([0-9] "."[0-9] )
("--"[a-z] " n") | Caracteres a serem ignorados (" " | " n" | " t") pelo scanner.
10. Ambiguidade: O l´exico deve ser completo, sempre reconhecendo ou n˜ao uma cadeia. Exemplo: if8 deve ser analisado como sendo um ou dois tokens?
11. Regras para soluc¸˜ao da ambiguidade:
o casamento deve ser o mais longo – o pr ´oximo token ´e a maior substring da entrada que “case” com uma express˜ao regular.
prioridade nas regras – dada a cadeia mais longa, o tipo do token
´e dado pela primeira regra que “casar”. (Da tipo aos tokens da string.)
12. A semˆantica da linguagem de express ˜oes regulares ´e exatamente um autˆomato finito. (Fig. 2.4, pg 22 do livro.)
13. Um autˆomato finito ´e dito n˜ao-determin´ıstico quando a partir de um estado ´e poss´ıvel transitar para dois outros estados diferentes com um mesmo s´ımbolo.
?>=<
89:;
?>=< 89:;
**
tt
?>=< 89:;
14. Express˜oes regulares podem ser expressas como aut ˆomatos finitos n˜ao determin´ısticos, fazendo-se uso da transic¸ ˜oes- que permitem a mudanc¸a de estado sem o consumo de um s´ımbolo. (Fig. 2.6, pg. 26 do livro.)
15. A figura 2.7, pg. 27 do livro mostra o aut ˆomato finito
n˜ao-determin´ıstico associado aos tokens IF, ID e NUM.
16. Um autˆomato finitos n˜ao-determin´ıstico pode ser transformado num determin´ıstico atrav´es do c´alculo do fecho- . Intuitivamente, o
fecho- colapsa os estados do aut ˆomato n˜ao-determin´ıstico produzindo o determin´ıstico associado.
17. Considere a figura 2.7, pg 27 do livro. A t´ıtulo de exemplo,
simulemos a entrada in neste aut ˆomato. Comec¸ando no estado , ao inv´es de “adivinhar” qual transic¸˜ao- tomar, consideremos que a
m´aquina possa estar em qualquer dos estados no conjunto
. Em outras palavras, computamos o fecho- de . 18. Uma vez consumindo i do estado alcanc¸amos o estado , de
alcanc¸amos , de lugar nenhum e de chegamos a , constitu´ındo o conjunto
. Mas o estado s ´o ´e definido
quando concluirmos a computac¸˜ao do fecho- : de chegamos a e
os estados e , no autˆomato determin´ısitico associado ao autˆomato n˜ao-determin´ısitco representado na figura 2.7.
19. O algoritmo que formaliza esta transformac¸˜ao pode ser encontrada nas p´ags. 28 e 29 do livro texto.
20. Neste curso estaremos utilizando a ferramenta SableCC, que ´e um gerador de analisador sint´atico. SableCC possui uma
meta-linguagem para a especificac¸˜ao do l´exico (e obviamente do sint´atico, i.e. a gram´atica) da linguagem para a qual estamos
construindo o compilador.
21. Um exemplo de uma especificac¸˜ao l´exica ´e a seguinte:
Helpers
digit = [’0’ .. ’9’] ; Tokens
if = ’if’ ;
id = [’a’..’z’]([’a’..’z’] | (digit))* ; number = digit+ ;
real = ((digit)+ ’.’ (digit)*) | (digit)* ’.’ (digit)+) ; whitespace = (’ ’ | ’\t’ | ’\n’ ; comments = (’--’ [’a’..’z’]* ’\n’) ; Ignored Tokens
whitespace, comments;