Sei sulla pagina 1di 39

LENGUAJES Y

TRADUCTORES
Anlisis lxico

Profesor:Carlos A. Ruiz De La Cruz Melo


Correo: zorroculto69@hotmail.com

LEXICO
Definicin
El lxico de un lenguaje natural o de
programacin esta constituido por todas las
palabras y smbolos que lo componen.
En un lenguaje de programacin el lxico lo
constituyen
todos
los
elementos
individuales del lenguaje

TERMINOLOGIA
UNIDAD LXICA

Categoras en que se clasifican las


cadenas de
caracteres vlidos en un
lenguaje.
Las unidades lxicas son:
1.
2.
3.
4.
5.

Palabras reservadas
Identificadores
Literales
Comentarios
Operadores

TERMINOLOGIA
PALABRAS RESERVADAS
Son las palabras definidas por el fabricante del
lenguaje
PALABRAS
RESERVADAS

PALABRAS
RESERVADAS

const

include

int

iostream.h

class

conio.h

public

main

void

getch

if
goto

#include "iostream.h"
#include "conio.h
const int n=23;
class ALUMNO{
int codigo;
public:
void leer(){}
void mostrar(){
cout<<"\n termino";
}
};
int main(){
int ab=0;
XX:
ab++;
if(ab<5) goto XX;
ALUMNO a;
a.mostrar();
getch();
}

TERMINOLOGIA
IDENTIFICADORES

Nombres de variables ( codigo, ab)


Nombres de constantes (n)
Nombres de etiquetas (XX)
Nombres de funciones (leer, mostrar)
Nombres de tipos estructurados(ALUMNO)

#include "iostream.h"
#include "conio.h
const int n=23;
class ALUMNO{
int codigo;
public:
void leer(){}
void mostrar(){
cout<<"\n termino";
}
};
int main(){
int ab=0;
XX:
ab++;
if(ab<5) goto XX;
ALUMNO a;
a.mostrar();
getch();
}

TERMINOLOGIA
LITERALES NUMRICAS

Constantes enteras (345)


Constantes reales (12.45)
Constantes carcter (A)
Constantes cadena (UNMSM)

COMENTARIOS (TODO SALIO BIEN)

#include "iostream.h"
#include "conio.h
const int valor=12.45;
class OPERACION{
int codigo;
public:
void mostrar(char cadena[]){
cout<<"\n "<<cadena;
}
};
int main(){
OPERACION op;
op.mostrar("UNMSM");
char letra='A';
int suma=345;
cout<<"\n letra="<<letra;
cout<<"\n suma="<<suma;
// TODO SALIO BIEN
getch();
}

TERMINOLOGIA
OPERADORES

Operadores aritmticos (+, *, /, -)


Operadores relacionales(<, >,)
Operadores logicos (&&, ||, )
Operadorer de asignacion(=)
Operador delimitador(;)

#include <iostream.h>
#include <conio.h>
class opera{
int x, y;
public:
opera() {x=0;y=0;}
opera(int i, int j) {x=i;y=j;}
void obten(int &i, int &j)
{i=x; j=y;}
opera operator++();
};
opera opera::operator++(){
x++;
y++;
}
int main(){
opera objeto(10,7);
int x,y;
++objeto;
objeto.obten(x,y);
cout<< "x="<<x<<" y="<<y;
getch();
}

TERMINOLOGIA
PATRON

Representa la regla para que


una secuencia de caracteres
sea considerada cierta unidad
lxica.
Los patrones generalmente
son expresiones regulares

Letra/digito
letra

otro

letra(letra / digito)*
G=(Vn, Vt, P, S)
Vn={ ID, L, D, LD}
Vt={ a,b,c,.z, 0,1,2,.,9}
P={ <ID> <L> <LD>
<LD> <L>/ <D>
<D> 0/1/2/3/4/../9
<L> a/b/c/./z }

#include "iostream.h"
const float n=5.4;
class NUMERO{
int n;
public:
void ver(){ }
};
int main(){ }

TERMINOLOGIA
LEXEMA
El valor actual de un conjunto de
caracteres que satisfacen un patrn:
LEXEMA

LEXEMA

LEXEMA

LEXEMA

int

include

public

iostream.h

5.4

void

main

ver

const

class

float

NUMERO

TERMINOLOGIA
TOKEN

PROGRAMA
FUENTE

El token tiene asociado un patrn;


El valor asociado a una categora o
unidad lxica. Se representa por
una
constante,
generalmente
numrica
El token es el valor que se enviara
al analizador sintctico y con el
cual este construir las frases

ANALIZADOR
LEXICO
Solicita
token

envia
token

ANALIZADOR
SINTACTICO

TERMINOLOGIA
TOKEN
Palabras reservadas
if

main

for

while else

10

11

12

13

14

float int

goto

28

30

operadores
*

<

++

--

50

51

52

53

54

88

89

90

Otras unidades lxicas

Token

Identificadores

1000

literales numricas

2000

literales de carcter

3000

literales de cadena

4000

29

Constantes

1010

Variables

1020

Estructuradas 1030
:

Reales

2010

Enteras

2020

HERRAMIENTAS PARA
DESCRIBIR EL LEXICO

Gramticas
Expresiones regulares
Autmatas
Lenguaje natural

ANALIZADOR LEXICO
Un analizador lxico tiene como
funcin principal el tomar secuencias
de caracteres o smbolos del alfabeto
del lenguaje y ubicarlas dentro de
categoras,
conocidas
como
unidades lxicas.
Las
unidades
lxicas
son
empleadas por el analizador
sintctico para determinar si lo
escrito en el programa fuente es
correcto o no gramaticlmente.

ANALIZADOR LEXICO
Algunas de las unidades lxicas
no son empleadas por el analizador
sintctico sino que son descartadas o
filtradas,
como
comentarios,
o
espacios en blanco.
En un compilador, el anlisis lineal
se llama anlisis
lxico o
exploracin .

NO SE TOMAN
EN CUENTA

Comentarios
Espacios en blanco

ANALISIS LEXICO
La compilacin empieza con el
analizador sintctico quien solicita un
token para realizar su trabajo
El analizador lxico rene smbolos y
enva el token correspondiente de la
unidad lxica que conform el
analizador lxico y espera una nueva
solicitud de token.

INICIA LA
COMPILACION

PROGRAMA
FUENTE

ANALIZADOR
LEXICO
Solicita
token

envia
token

ANALIZADOR
SINTACTICO

ANALISIS
FASE

LEXICO

1. Separar el anlisis lxico del anlisis


sintctico
a
menudo
permite
simplificar una u otra de dichas
fases.
2. Se mejora la eficiencia del
compilador. Un analizador lxico
independiente permite construir un
procesador
especializado
y
potencialmente ms eficiente para
esta funcin. Gran parte de tiempo
se consume en leer el programa
fuente y dividirlo en componentes
lxicos.
3. Se mejora la transportabilidad del
compilador. Las peculiaridades del
alfabeto de entrada y otras
anomalas
propias
de
los
dispositivos pueden limitarse al
analizador lxico.

COMO

PROGRAMA
FUENTE

ANALIZADOR
LEXICO
TABLA DE
SIMBOLOS

Solicita
token

envia
token

ANALIZADOR
SINTACTICO

RESPONSABILIDAD
DEL ANALISIS LEXICO
Manejo de apertura y cierre de archivo,
lectura de caracteres y gestin de
posibles errores de apertura.
Eliminar comentarios, espacios en
blanco, tabuladores y saltos de lnea.
Inclusin de archivos y macros.
Contabilizar nmero de lneas y
columnas para emitir mensajes de
error.

TABLA
(TS)

DE

DEFINICIN
La tabla de smbolos es la
estructura de datos usada
por el compilador para
registrar
la
informacin
referente
a
los
identificadores.
Reune informacin sobre los
distintos atributos de cada
identificador.

SIMBOLOS

FUNCIONES DE LA TS
Tambin se la llama tabla de
nombres o tabla de identificadores
y tiene dos funciones principales:
Efectuar chequeos
semnticos.
Generacin de
cdigo.

OPERACIONES DE LA TS
Operaciones :
Insertar un smbolo tras una
declaracin

Recuperar informacin de un
smbolo

Eliminar la informacin
smbolo cuando ya no
necesita

de
se

CONTENIDO DE LA TS
Nombre o lexema
Se puede hacer con o sin lmite
Token
Direccin de memoria en que se
guardara
Numero de dimensiones de un
array

CONSIDERACIONES
DE LA TS
La tabla de smbolos puede
inicializarse con cierta informacin
sobre smbolos especiales del
lenguaje, como son las palabras
reservadas, las funciones de librera,
las constantes predefinidas, etc...

LEXEMA

TOKEN

if

10

main

11

goto

30

No toda la informacin se introduce


en la tabla de smbolos a la vez, sino
que se va completando con los
diferentes anlisis que se aplican
sobre el programa fuente.

50

51

90

CONSIDERACIONES
DE LA TS
El analizador sintctico sirve de
armazn de un conjunto de rutinas
del anlisis semntico. Parte de
estas rutinas pueden completar la
informacin de la tabla de smbolos
como por ejemplo sobre el tipo de
un lexema determinado.
El generador de cdigo usa la
informacin de la tabla para
referenciar el cdigo a las
posiciones adecuadas de memoria.

CONSIDERACIONES
DE LA TS
LEXEMA
Conforme van apareciendo nuevas
declaraciones de identificadores, el
analizador lxico, o el analizador
sintctico segn la estrategia que
sigamos, insertar nuevas entradas en la
tabla de smbolos, evitando siempre la
existencia de entradas repetidas.

#include "iostream.h"
int main(){
int dato;
dato=5+dato;
}

TOKEN

if

10

main

11

:
goto

30

50

51

:
[

90

dato

1020

ORGANIZACION
TS
Tablas no ordenadas.
(Arrays, Listas, etc.) En general, son
mtodos muy poco eficientes, pero
fciles
de
programar.
Tablas ordenadas.
(Arrays
ordenados,
Listas
ordenadas,
rboles
binarios,
rboles AVL, Tablas Hash, etc.).

DE

LA

ORGANIZACION
TS
Debido a las caractersticas especficas de
funcionamiento de las tablas de smbolos,
los mtodos ms eficientes son los rboles
AVL y las tablas Hash.
Sin embargo, el manejo de las tablas de
smbolos en los lenguajes con estructura de
bloques tiene unas caractersticas propias, y
sugieren el empleo de tcnicas especficas
de organizacin para hacer ms eficaces las
operaciones de bsqueda y desalojo de
registros una vez finalizada la compilacin
de un bloque.

DE

LA

LENGUAJE CON ESTRUCTURA


DE BLOQUES
Un lenguaje con estructura de
bloques es aquel que est compuesto
por mdulos o trozos de cdigo cuya
ejecucin es secuencial.
Estos mdulos a su vez pueden
contener en su secuencia de
instruccines llamadas a otros
mdulos, que a su vez pueden llamar
a
otros
submdulos
y
as
sucesivamente.
En general, un smbolo declarado en
un mdulo es accesible dentro del
mdulo en el que est definido y en
todos los mdulos o submdulos que
contiene

ORGANIZACION
EN
LENGUAJES CON ESTRUCTURA
DE BLOQUES
program ejemplo
var uno: integer
procedure dos

var tres, cuatro: integer;


procedure cinco

(a)

var uno, dos: real;

TS

ndice

uno

dos

tres
cuatro
cinco

(a)

uno
dos

procedure seis

(b)

var uno, tres: real;


begin
:
end.

TS

ndice

uno

dos
seis
uno
tres

4
:

(b)

EJEMPLO
#include "iostream.h"
class EMPLEADO{
};
int main(){
int dato;
dato=5+dato;
for(int k=0; k<20; k++);
}

No van los literales, ni espacios en


blanco, ni palabras reservadas u
operadores porque ya estn

LEXEMA

TOKEN

if

10

main

11

:
goto

30

50

51

:
[

90

EMPLEADO

1020

dato

1020

1020

ERRORES LEXICOS
Errores lxicos tpicos son:
Nombre ilegales de identificadores: un
nombre contiene caracteres invlidos.
nmeros incorrectos: un numero contiene
caracteres invlidos o no esta formado
correctamente, por ejemplo 3,14 en vez de
3.14 o 0.3.14.
Errores ortogrficos en palabras reservadas:
caracteres omitidos, adicionales o cambiados
de sitio, por ejemplo la palabra hwile en vez
de while.
Fin de archivo: se detecta un fin de archivo
a la mitad de un componente lexico(ma en
lugar de main)

for ( ; ; @ )

3,14

hwhile
cant + total ; ma EOF

ERRORES LEXICOS
Los errores lxicos se deben a descuidos
del
programador.
En
general,
la
recuperacin de errores lxicos es sencilla
y siempre se traduce en la generacin de
un error de sintaxis que ser detectado
ms tarde por el analizador sintctico
cuando el analizador lxico devuelve un
componente lxico que el analizador
sintctico no espera en esa posicin.
Los mtodos de recuperacin de errores
lxicos se basan bien en saltarse
caracteres en la entrada hasta que un
patrn se ha podido reconocer; o bien usar
otros mtodos ms sofisticados que
incluyen la insercin, borrado, sustitucin
de un carcter en la entrada o intercambio
de dos caracteres consecutivos.

ERRORES LEXICOS
Son pocos los errores que se
pueden detectar en este nivel debido
a que el analizador lexico tiene
una visin muy restringida de un
programa fuente.
Posibles acciones de recuperacin
de errores son:

Modo pnico

Borrar un caracter extrao

Insertar un caracter que falta

Reemplazar un caracter incorrecto por


otro correcto

Intercambiar dos caracteres adyacentes

ERRORES EN MODO PANICO


Caractersticas

U N M S M

Mtodo ms sencillo
Lo
pueden
usar
tambin
analizadores sintcticos.
No entra en lazos infinitos
Funcionamiento general
El SCANNER desecha smbolos de
la entrada, uno por uno, hasta
encontrar
un
token
de
sincronizacin
para
continuar
Delimitadores (punto y coma,
palabras clave como end)
Inconvenientes
Podran omitirse gran cantidad de
smbolos sin analizar

2 3 5 < \0

BUFFER
UNMSM 23.5 <
Como no hay comillas
finales tiene que retroceder
hasta el primer smbolo

LEXEMA

UNMSM
23.5
<

IMPLEMENTACION
DEL
ANALIZADOR
LEXICO
1. Utilizando un lenguaje de alto nivel
2. Utilizando un generador de
Analizadores Lxicos

Lex
Flex
jlex

ANALIZADOR LEXICO
Definicin del lxico y los tokens
asociados a cada uno de los componentes
lxicos
No

COMPONENTE LEXICO

TOKEN

Identificador

100

Operador ( >=)

200

Operador ( > )

201

Constantes enteras

300

Palabra reservada(for)

400

Palabra reservada(end)

401

Observacin:
Si en caso entra un carcter que no este
contemplado se enva el cdigo 911 lo cual
indica que hay un error

ESPECIFICACION DEL
ANALIZADOR LEXICO

Autmata para el
analizador lxico

ESPECIFICACION DEL
ANALIZADOR LEXICO
Expresines regulares
Identificador : L (L/d)*
Entero
: dd+
Operadores :
>
>=

Gramtica Regular
G=(Vn, Vt, P, 0)
Vn={ 0, 1,2,3, 4} Vt={ L, d,>, =}
P={ 0 L1 / d 3
1 L1 / d 1
0 >2
2 = 4
1
3
2
4 }

ESPECIFICACION DEL
ANALIZADOR LEXICO
INTERFACE DEL
ANALIZADOR LEXICO

LABORATORIO
DISEE UN ANALIZADOR LEXICO
Comentarios de la forma
Ejemplo

Palabras reservadas de la
forma

(* este es un comentario *)
/// este es otro comentario

Con una sola subraya iniciando la


palabra

Nmeros reales y nmeros enteros

Ejemplo

Ejemplo

_while
_if
_main

123.08
34.90
71
Tambin en base 2, 8 y 16:
Ejemplo
101010102
7238
A2416