Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
TRADUCTORES
Anlisis lxico
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
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
#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
#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
#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
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
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
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
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
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
ORGANIZACION
EN
LENGUAJES CON ESTRUCTURA
DE BLOQUES
program ejemplo
var uno: integer
procedure dos
(a)
TS
ndice
uno
dos
tres
cuatro
cinco
(a)
uno
dos
procedure seis
(b)
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++);
}
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
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
Ejemplo
Ejemplo
_while
_if
_main
123.08
34.90
71
Tambin en base 2, 8 y 16:
Ejemplo
101010102
7238
A2416