Escolar Documentos
Profissional Documentos
Cultura Documentos
Feltrim
DIN UEM
programa-fonte
analisador lxico
Tabela de smbolos
analisador sinttico
analisador semntico
Tabela de palavras e
smbolos reservados
sada
Manipulao
de erros
Classes de tokens:
Identificadores
Nmeros
Palavras reservadas
Delimitadores e operadores
Token
t_id
:=
t_atrib
t_id
t_mult
t_num
t_ptvg
Cdigo
Cadeia
Token
t_id
t_num
:=
t_mult
t_atrib
t_ptvg
program p;
var x: integer;
begin
x:=1;
while (x<3) do
x:=x+1;
end.
Cadeia
Token
program
t_program
t_id
t_ptvg
t_id
var
t_var
<
t_menor
t_id
t_num
t_doispt
t_fechapar
integer
t_tipo
do
t_do
t_ptvg
t_id
begin
t_begin
:=
t_atrib
t_id
t_id
:=
t_atrib
t_mais
t_num
t_num
t_ptvg
t_ptvg
while
t_while
end
t_end
t_abrepar
t_pt
Analisador
lxico
obter
prximo token
token
Analisador
sinttico
Exemplos:
O que delimita um token?
Diferenciao de letras maisculas/minsculas?
Qual o conjunto de palavras reservadas?
Qual as regras para a formao de identificadores?
Quais os operadores aceitos?
Quais os delimitadores aceitos? ( . ; : ) [ ] { }
Quais as regras para a formao de nmeros?
Quais as regras para a formao de comentrios?
etc.
Fragmento de gramtica:
cmd if expr then cmd
| if expr then cmd else cmd
expr termo relop termo
| termo
Regras de
termo id
lxicos:
| num
if
then
else
relop
id
num
if
then
else
< | <= | = | <> | > | >=
letra ( letra | digito )*
digito+(.digito+)?(E(+|-)?digito+)?
Erros
Smbolo no pertencente ao conjunto de smbolos terminais da
linguagem: @
Identificador mal formado: j@, 1a
Tamanho do identificador: minha_varivel_para_...
Nmero mal formado: 2.a3
Tamanho excessivo do nmero: 5555555555555555
Fim de arquivo inesperado (comentrio no fechado): {...
Char ou string mal formados: a, hello world
Notaes
Gramticas ou expresses regulares: especificao de tokens
Autmatos finitos: reconhecimento de tokens
Exemplos
Identificador: letra ( letra | dgito )*
Nmero inteiro sem sinal: dgito+
Nmero inteiro com sinal: ( + | - ) dgito+
Modelo matemtico
Conjunto de estados S
Conjunto de smbolos de entrada (alfabeto)
Funes de transio que mapeiam um par estado-smbolo de
entrada em um novo estado ()
Um estado inicial s0
Um conjunto de estados finais F para aceitao de cadeias
b
Estado
Smbolo de entrada
a
{0,1}
{0}
---
{2}
---
{3}
s:=s0
c:=prximo_caractere()
enquanto (c<>eof e s for um estado vlido) faa
s:=transio(s,c)
c:=prximo_caractere()
fim
se s for um estado final
ento retornar cadeia aceita
seno retornar falhou
Estado
Smbolo de entrada
a
{1}
{0}
---
{2}
---
---
Teoria da
Computao
! "
Exemplos de tokens possveis
Identificadores: x, y, minha_varivel, meu_procedimento, ...
Palavras reservadas e smbolos especiais: while, for, :=, <>, ...
Nmeros: inteiros, reais, ...
! "
Autmato para os smbolos := e :
q0
q1
q2
retornar(:=, t_atrib)
q3
retornar(:, t_dp)
retroceder()
outro
! "
Exerccio: autmato para operadores relacionais >, >=, <, <=, = e <>
q0
<
q1
q2
retornar(<=, t_menor_igual)
q3
retornar(<>, t_dif)
q4
retornar(<, t_menor)
retroceder()
q5
retornar(=, t_igual)
q7
retornar(>=, t_maior_igual)
q8
retornar(>, t_maior)
retroceder()
>
>
q6
outro
=
outro
! "
Autmato para identificadores: letra seguida de qualquer
combinao de letras e dgitos
letra|dgito
q0
letra
q1
outro
q2
retornar(cadeia,t_id)
retroceder()
Opcionalmente:
retornar(ptr, t_id)
retroceder()
! "
Autmato para palavras reservadas: while, if, for, array, etc.
Opes
Fazer um autmato para cada palavra-reservada
Trabalhoso e ineficiente
q0
letra
q1
outro
q2
se busca_tabela(cadeia)=verdadeiro
ento retornar(cadeia,t_cadeia)
seno retornar(cadeia,t_id)
retroceder()
! "
Autmato para consumir caracteres no imprimveis: espaos
em branco, tabulaes e cdigos de nova linha
O analisador lxico no deve produzir tokens para esses
smbolos
letra|dgito
| \t | \n
q0
letra
q1
outro
q2
se busca_tabela(cadeia)=verdadeiro
ento retornar(cadeia,t_cadeia)
seno retornar(cadeia,t_id)
retroceder()
! "
Exerccios
Construir autmatos para se reconhecer
Nmeros inteiros com e sem sinal: 5, -1, 100
Nmeros reais: 3.11, 0.1
!
Smbolo no pertencente ao conjunto de smbolos terminais da
linguagem / identificador mal formado: v@r
No h autmato para reconhecer esses smbolos
!
Idealmente, a compilao no pode parar
Opes para recuperao de erro Exemplo: beg#in
Deletar caracteres lidos at o erro e comear a anlise no prximo
caractere no lido
Retorna par <in,t_id>
#
Palavras reservadas
Carregadas no incio da execuo do compilador
Busca deve ser eficiente
Usar a mesma estrutura da Tabela de Smbolos ou uma
tabela separada (Tabela de Palavras Reservadas)
Reconhecimento de tokens
Criao e manuteno de um buffer
Facilidade de leitura e devoluo de caracteres no caso de
arquivos grandes
Arquivos pequenos podem ser lidos de uma vez para a memria
$
Para cada definio regular da linguagem, ser
construdo um autmato finito determinstico
Com exceo para as palavras reservadas, pois
inicialmente sero tratadas como identificadores
Fragmento de gramtica:
cmd if expr then cmd
| if expr then cmd else cmd
expr termo relop termo
| termo
termo id
| num
"
q0
<
q1
q2
retornar(<=, t_menor_igual)
q3
retornar(<>, t_dif)
q4
retornar(<, t_menor)
retroceder()
q5
retornar(=, t_igual)
q7
retornar(>=, t_maior_igual)
q8
retornar(>, t_maior)
retroceder()
>
>
q6
outro
=
outro
"
letra | dgito
letra
10
outro
11
se busca_tabela(cadeia)=verdadeiro
ento retornar(cadeia,t_cadeia)
seno retornar(cadeia,t_id)
retroceder()
"
A definio da forma dgito frao? expoente?
Faremos 3 autmatos:
dgito
dgito frao?
dgito frao? expoente?
"
dgito
12
dgito
13
dgito
dgito
dgito
14
15
16
+|
20
dgito
21
dgito
dgito
E
dgito
17
dgito
outro
19
retornar(cadeia,t_num)
retroceder()
dgito
22
dgito
23
outro
24
retornar(cadeia, t_num)
retroceder()
dgito
25
18
26
outro
27
retornar(cadeia, t_num)
retroceder()
"
Opcionalmente
dgito
12
dgito
13
dgito
dgito
14
dgito
15
16
20
17
dgito
18
dgito
E
outro
+|
outro
retornar(cadeia,t_num)
retroceder()
21
retornar(cadeia,t_num)
retroceder()
outro
19
retornar(cadeia,t_num)
retroceder()
$
Se pusermos todos os autmatos anteriores juntos,
teremos a seqncia de autmatos para o
reconhecimento dos tokens do 1slide
Estados iniciais com numerao mais baixa so testados antes
%
Uma seqncia de autmatos pode ser convertida em
um programa que procure pelos tokens especificados
Enfoque sistemtico:
Cada estado recebe um segmento de cdigo
Se existem transies deixando o estado corrente, ento seu cdigo
l um caracter e determina que transio seguir (se possvel)
Se existe uma transio (caracter lido, estado E), o caracter
reconhecido e o controle transferido para o cdigo do estado E
Seno, o estado corrente no aceita o caracter lido e, nesse caso,
ocorre uma falha (chama-se a rotina falha(), que determina um novo
autmato para ser testado)
token proxToken(){
Consumo de caracteres
while (1) {
no imprimveis
switch (estado) {
case 0: c = proxChar();
if (c == || c ==\t || c ==\n){
estado = 0; inicio_lexema++;
} else if (c ==<) estado = 1;
else if (c ===) estado = 5;
else if (c ==>) estado = 6;
else estado = falha(); break;
...
case 9: c = proxChar();
if (isletter(c)) estado = 10;
else estado = falha(); break;
...
case 25: c = proxChar();
Conforme
if (isdigit(c)) estado = 26;
caracteres vlidos
else estado = falha(); break;
so lidos, devem
case 26: c = proxChar();
ser concatenados
if (isdigit(c)) estado = 26;
else estado = 27; break;
case 27: retrocede(1); instala_num(); return(t_num);
} //switch
Coloca o lexema em uma
} //while
varivel global
} //token
%
Rotina falha()
Retrocede o ponteiro de leitura para o incio do lexema
Decide qual ser o prximo estado de partida (qual autmato vai
ser testado)
int estado = 0, partida = 0; /* variveis globais */
int falha() {
ptr_leitura = inicio_lexema;
switch (partida) {
case 0: partida = 9; break;
case 9: partida = 12; break;
case 12: partida = 20; break;
case 20: partida = 25; break;
case 25: recupera(); break;
default: /* erro do compilador */
}
retornar partida;
estado
estado atual (rotina proxToken())
}
partida