You are on page 1of 29

Compiladores

Anlisis Lxico

Oscar Bonilla
obonilla@galileo.edu
Universidad Galileo

Anatoma de un compilador
Programa (character stream)
Analizador Lxico (Scanner)
Token stream
Analizador Sintctico (Parser)
Parse Tree
Analizador Semntico
Intermediate Representation
Optimizador de Cdigo
Optmized Intermediate Representation
Generador de Cdigo
Assembly code

Qu es un analizador lxico?
Source Program Text

Ejemplos de Tokens:

Tokens

operadores = + - > ( { := == <>


keywords if while for int double
literales numricos 43 6.035 -3.6e10 0x13f3a
literales de carcter
'a' '~' '\''
strings literales "6.983" "compiladores" "\"\""

Ejemplos de no-tokens

espacios en blanco espacio(' ') tab('\t') eol('\n')


comentarios /* este no es un token */

Los analizadore lxicos deben...


f o r

va r 1

for ID(var1) eq_op

10

va r 1<=

Num(10)

ID(var1) leq_op

Separar precisamente el stream de texto en el stream


correcto de tokens

ID("var1") no ID("var") Num(1)


ID("var1") leq_op no ID("var1<=")

Identificar el tipo de token que hace match con el stream


de input

10 Num(10)
var1 ID("var1")

Los analizadore lxicos deben...


f o r

va r 1

for ID(var1) eq_op

10

va r 1<=

Num(10)

ID(var1) leq_op

Describir diferentes tipos de tokens en diferentes


lenguajes
FORTRAN
DO I=1, 10
C++
for(int i=1; i < 10; i++)
C-shell
foreach i (1 2 3 4 5 6 7 8 9)

Otro Ejemplo:
floatmatch0(chars)/*findazero*/
{if(!strncmp(s,"0.0",3))
return0.;
}
FLOAT ID(match0) LPAREN CHAR STAR ID(s) RPAREN
LBRACE IF LPAREN BANG ID(strncmp) LPAREN ID(s)
COMMA STRING(0.0) COMMA NUM(3) RPAREN RPAREN
RETURN REAL(0.0) SEMI RBRACE EOF

Cmo describimos qu es un token?


Un identificador es una secuencia de letras y dgitos; el
primer caracter debe ser una letra. El guin bajo _ cuenta
como una letra. Las letras en maysculas y minsculas
son distintas. Si el archivo de entrada ha sido procesado
en tokens hasta un caracter dado, el siguiente token debe
incluir el string ms grande de caracteres que podra
constituir un token. Los espacios en blanco, tabuladores,
nuevas lneas, y comentarios son ignorados excepto que
sirven para separar tokens. Se requiere algo de espacio
en blanco para separar identificadores, keywords, y
constantes que de otra forma estaran adyacentes.

Programando un analizador lxico

Podemos implementar un lexer ad hoc en


cualquier lenguaje de programacin
Pero tambin podemos generalizar!
Usamos expresiones regulares para definir
formalmente qu secuencia de strings
constituyen los tokens
Implementamos el lexer usando automata
finitos deterministicos

Estructuras Lgicas II
Alfabeto: conjunto finito de smbolos.
A = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Cuerda: secuencia finita de smbolos del
alfabeto.
s = 543
Cuerda Nula: cuerda especial de
longitud cero.

Lenguaje: conjunto de cuerdas tomadas


de un alfabeto.
L = { 543, 547, 548, 542 }

Estructuras Lgicas II

Expresin Regular: conjunto de cuerdas construido


a partir de reglas.

Construyendo expresiones regulares

Smbolos: cada smbolo se denota a s mismo


a
"a"

Construyendo expresiones regulares

Alternacin: dadas dos expresiones regulares M y N,


el operador de alternacin denotado por | crea una nueva
expresin regular M | N. Una cuerda est en el lenguaje
de M | N si est en el lenguaje de M o est en el lenguaje
de N.
a|b
"a" y "b"

Construyendo expresiones regulares

Concatenacin: dadas dos expresiones regulares M y N,


el operador de concatenacin denotado por crea una nueva
expresin regular M N. Una cuerda est en el lenguaje
de M N si es la concatenacin de cualesquiera dos cuerdas
y tal que est en el lenguaje de M y est en el lenguaje
de N.
ab
"ab"

Construyendo expresiones regulares

Epsilon: La expresin regular epsilon representa un lenguaje


cuya nica cuerda es la cuerda nula.

""

Construyendo expresiones regulares

Repeticin: Dada una expresin regular M, su cerradura de


Kleene es M*. Una cuerda est en M* si es la concatenacin
de cero o ms cuerdas, todas pertenecientes a M.
a*
{ "", "a", "aa", "aaa", ... }

Abreviaturas usadas en esta clase


A las cuerdas les llamamos strings.
Omitimos el smbolo de concatenacin.
Omitimos el smbolo de epsilon.
Asumimos que la cerradura de Kleene
tiene precedencia sobre la concatenacin.
Asumimos que la concatenacin tiene
precedencia sobre la alternacin.

Abreviaturas usadas en esta clase


A las cuerdas les llamamos strings.
Omitimos el smbolo de concatenacin.
Omitimos el smbolo de epsilon.
Asumimos que la cerradura de Kleene
tiene precedencia sobre la concatenacin.
Asumimos que la concatenacin tiene
precedencia sobre la alternacin.

Abreviaturas usadas en esta clase


A las cuerdas les llamamos strings.
a b c

abc

Omitimos el smbolo de epsilon.


Asumimos que la cerradura de Kleene
tiene precedencia sobre la concatenacin.
Asumimos que la concatenacin tiene
precedencia sobre la alternacin.

Abreviaturas usadas en esta clase


A las cuerdas les llamamos strings.
a b c
(a|)

abc

(a|)
Asumimos que la cerradura de Kleene
tiene precedencia sobre la concatenacin.

Asumimos que la concatenacin tiene


precedencia sobre la alternacin.

Abreviaturas usadas en esta clase


A las cuerdas les llamamos strings.
a b c
(a|)

abc

(a|)
ab*

Asumimos que la concatenacin tiene


precedencia sobre la alternacin.

a (b*)

Abreviaturas usadas en esta clase


A las cuerdas les llamamos strings.
a b c
(a|)

(a|)
a (b*)

ab*

ab | c

abc

(a b) | c

Ms abreviaturas
[abcd]

( a | b | c | d)
[b -g]

[b -gM -Qkr]

[bcdefgMNOPQkr]

M?

M+

M M*

[bcd

En resumen
a

M|N
MN
MN
M*
M+
M?
[a -zA -Z]
.
"a.+*"

un caracter ordinario.
El string vaco.
Otra forma de escribir el string vac
Alternacin, elegir M o N.
Concatenacin, M seguida de N
Otra forma de escribir concatenacin.
Repeticin (cero o ms veces).
Repeticin (una o ms veces)
Opcional, cero o una ocurrencia de
Alternacin de un conjunto de caracteres.
Un punto sustituye cualquier caract
excepto nueva lnea.
Strings entre comillas no son interp

Algunos ejemplos
( 0 | 1 )* 0
b*abb*a?
[ab]*aa[ab]*
(0|1|2|3|4|5|6|7|8|9)
dgito dgito*
-?posint
int (. posint)?

Nmeros binarios mltiplos de 2.


Strings de a's y b's sin a's consecutiv
Strings de a's y b's que contienen a's
consecutivas.
Un dgito.
Un entero positivo (posint).
Un entero (int).
Un real

Analizadores Lxicos

Fragmento de Programa en Lex


if
{ return IF; }
[a-z][a-z0-9]*
{ return ID; }
[0-9]+
{ return NUM
([0-9]+"."[0-9]*) | ([0-9]*"."[0-9]+) { return REAL; }
("--"[a-z]*"\n") | (" " | "\n" | "\t")+
{ /* do nothing */ }
.
{ error(); }

Con cul regla hace match el string "if8"?


Con cul regla hace match el string "if 8"?
Necesitamos un par de reglas ms!

Dos reglas ms
Match ms largo
El substring inicial ms largo de la entrada que puede
construirse con una expresin regular es tomado como
el siguiente token.

Prioridad de Reglas
Para un match ms largo en particular, la primer
expresin regular que genere el string determina el
tipo de token. El orden en que se escriben la
expresiones regulares es importante.

Ahora s:

Fragmento de Programa en Lex


if
{ return IF; }
[a-z][a-z0-9]*
{ return ID; }
[0-9]+
{ return NUM
([0-9]+"."[0-9]*) | ([0-9]*"."[0-9]+) { return REAL; }
("--"[a-z]*"\n") | (" " | "\n" | "\t")+
{ /* do nothing */ }
.
{ error(); }

if8
if 8

por match ms largo


por prioridades

ID
IF NUM

Pregunta

Qu expresin regular hace match con los


nmeros desde 0 hasta 256 y nada ms?

Cmo reconocemos RE's?


La expresiones regulares son tiles para describir strings,
pero necesitamos reconocerlos.

Esta es la diferencia entre conocimiento declarativo (qu es)


y conocimiento imperativo (cmo hacerlo).

As que usamos expresiones regulares para describir los strings,


pero usamos automata finitos para reconocerlos.