Sunteți pe pagina 1din 29

Compiladores

Anlisis Lxico

Oscar Bonilla
obonilla@galileo.edu
Universidad Galileo
Qu es un analizador lxico?
Source Program Text Tokens

Ejemplos de 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 */
Otro Ejemplo:

float match0(char s) /* find a zero */


{if (!strncmp(s, "0.0", 3))
return 0.;
}

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

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

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
abc

(a|) (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
abc

(a|) (a|
)

ab* a
(b*)

Asumimos que la concatenacin tiene


precedencia sobre la alternacin.
Abreviaturas usadas en esta clase

A las cuerdas les llamamos strings.

a b c
abc

(a|) (a|
)

ab* a
(b*)

ab | c (a b) |
c
Ms abreviaturas

[abcd] ( a | b | c | d)

[b -g] [bcd

[b -gM -Qkr] [bcdefgMNOPQkr]

M?

M+ M M*
En resumen
a un caracter ordinario.
El string vaco.
Otra forma de escribir el string vac
M|N Alternacin, elegir M o N.
MN Concatenacin, M seguida de N
MN Otra forma de escribir concatenacin.
M* Repeticin (cero o ms veces).
M+ Repeticin (una o ms veces)
M? Opcional, cero o una ocurrencia de
[a -zA -Z] Alternacin de un conjunto de caracteres.
. Un punto sustituye cualquier caract
excepto nueva lnea.
"a.+*" Strings entre comillas no son interp
Algunos ejemplos

( 0 | 1 )* 0 Nmeros binarios mltiplos de 2.


b*abb*a? Strings de a's y b's sin a's consecutiv
[ab]*aa[ab]* Strings de a's y b's que contienen a's
consecutivas.
(0|1|2|3|4|5|6|7|8|9) Un dgito.
dgito dgito* Un entero positivo (posint).
-?posint Un entero (int).
int (. posint)? Un real
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.

S-ar putea să vă placă și