0% encontró este documento útil (0 votos)
20 vistas26 páginas

Análisis Léxico en Lenguajes de Programación

El documento aborda el análisis léxico en lenguajes de programación, definiendo el léxico como el conjunto de palabras y símbolos que lo componen. Describe las funciones del analizador léxico, las unidades léxicas, y los errores léxicos comunes, así como las herramientas y métodos para implementar un analizador léxico. Además, se discuten las responsabilidades del análisis léxico y la importancia de separar esta fase del análisis sintáctico para mejorar la eficiencia del compilador.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
20 vistas26 páginas

Análisis Léxico en Lenguajes de Programación

El documento aborda el análisis léxico en lenguajes de programación, definiendo el léxico como el conjunto de palabras y símbolos que lo componen. Describe las funciones del analizador léxico, las unidades léxicas, y los errores léxicos comunes, así como las herramientas y métodos para implementar un analizador léxico. Además, se discuten las responsabilidades del análisis léxico y la importancia de separar esta fase del análisis sintáctico para mejorar la eficiencia del compilador.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

LENGUAJES Y

TRADUCTORES

Análisis léxico

Profesor:Carlos A. Ruiz De La Cruz Melo


Correo: [email protected]
LEXICO

Definición

❑ El léxico de un lenguaje natural o de


programación esta constituido por todas las
palabras y símbolos que lo componen.

❑ En un lenguaje de programación el léxico


lo constituyen todos los elementos
individuales del lenguaje
FUNCIONES
Función principal

Leer carácter por carácter de la entrada y


elaborar como salida una secuencia de
componentes léxicos (tokens) que utiliza el
analizador sintáctico para hacer el análisis.

Funciones secundarias

▪ Manejar el archivo fuente, es decir, abrirlo,


leer sus caracteres y cerrarlo.
▪ Eliminar comentarios y espacios en blanco
(espacios, tabuladores y fin de línea).
▪ Relacionar los mensajes de error con las
líneas del programa fuente.
▪ Introducir los identificadores en la tabla de
símbolos.
TERMINOLOGIA

UNIDAD LÉXICA

Categorías en que se clasifican las


cadenas de caracteres válidos en un
lenguaje.

Las unidades léxicas son:

1. Palabras reservadas
2. Identificadores
3. Literales
4. Comentarios
5. Operadores
TERMINOLOGIA
#include "iostream.h"
#include "conio.h“
❑ PALABRAS RESERVADAS const int n=23;
class ALUMNO{
Son las palabras definidas por el fabricante del
lenguaje int codigo;
public:
PALABRAS PALABRAS void leer(){}
RESERVADAS RESERVADAS void mostrar(){
cout<<"\n termino";
const include }
int iostream.h };
int main(){
class conio.h int ab=0;
public main XX:
ab++;
void getch if(ab<5) goto XX;
if ALUMNO a;
a.mostrar();
goto getch();
}
TERMINOLOGIA
#include "iostream.h"
#include "conio.h“
❑ IDENTIFICADORES const int n=23;
class ALUMNO{
▪ Nombres de variables ( codigo, ab) int codigo;
▪ Nombres de constantes (n) public:
▪ Nombres de etiquetas (XX) void leer(){}
▪ Nombres de funciones (leer, mostrar) void mostrar(){
▪ Nombres de tipos estructurados(ALUMNO) cout<<"\n termino";
}
};
int main(){
int ab=0;
XX:
ab++;
if(ab<5) goto XX;
ALUMNO a;
a.mostrar();
getch();
}
TERMINOLOGIA
#include "iostream.h"
❑ LITERALES NUMÉRICAS #include "conio.h“

▪ Constantes enteras (345) const int valor=12.45;


▪ Constantes reales (12.45) class OPERACION{
▪ Constantes carácter (A) int codigo;
▪ Constantes cadena (UNMSM) public:
void mostrar(char cadena[]){
cout<<"\n "<<cadena;
}
❑ COMENTARIOS (TODO SALIO BIEN)
};
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 #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;}
❑ OPERADORES void obten(int &i, int &j)
{i=x; j=y;}
▪ Operadores aritméticos (+, *, /, -) opera operator++();
▪ Operadores relacionales(<, >,…) };
▪ Operadores logicos (&&, ||, ) opera opera::operator++(){
▪ Operadorer de asignacion(=) x++;
▪ Operador delimitador(;) y++;
}
int main(){
opera objeto(10,7);
int x,y;
++objeto;
objeto.obten(x,y);
cout<< "x="<<x<<" y="<<y;
getch();
}
TERMINOLOGIA
Letra/digito
PATRON
letra otro

❑ Representa la regla para que


una secuencia de caracteres
sea considerada cierta unidad
léxica.
letra(letra / digito)*
❑ Los patrones generalmente G=(Vn, Vt, P, S)
son expresiones regulares 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 }
TERMINOLOGIA
#include "iostream.h"
const float n=5.4;
class NUMERO{
int n;
public:
LEXEMA void ver(){ }
};
int main(){ }
El valor actual de un conjunto de
caracteres que satisfacen un patrón:

LEXEMA LEXEMA LEXEMA LEXEMA


# n int {
include = public }
iostream.h 5.4 void main
“ ; ver
const class (
float NUMERO )
TERMINOLOGIA
PROGRAMA
TOKEN FUENTE

❑ El token tiene asociado un patrón;

ANALIZADOR
❑ El valor asociado a una categoría o
unidad léxica. Se representa por LEXICO
una constante, generalmente
numérica Solicita envia
token token
❑ El token es el valor que se enviara
al analizador sintáctico y con el ANALIZADOR
cual este construirá las frases
SINTACTICO
TERMINOLOGIA
TOKEN
Palabras reservadas

if main for while else float int goto


10 11 12 13 14 ••• 28 29 30
operadores
Constantes 1010
* + / - < ++ -- [
Variables 1020
50 51 52 53 54 ••• 88 89 90
Estructuradas 1030
:
Otras unidades léxicas Token
Identificadores 1000
literales numéricas 2000
Reales 2010
literales de carácter 3000
Enteras 2020
literales de cadena 4000
HERRAMIENTAS PARA
DESCRIBIR EL LEXICO

❑ Gramáticas
❑ Expresiones regulares
❑ Autómatas
❑ Lenguaje natural
ANALIZADOR LEXICO
❑ Algunas de las unidades léxicas no
son empleadas por el analizador
sintáctico sino que son descartadas o
filtradas, como comentarios, o
espacios en blanco.

❑ En un compilador, el análisis lineal


se llama análisis léxico o
exploración.

NO SE TOMAN ▪ Comentarios
EN CUENTA ▪ Espacios en blanco
ANALISIS LEXICO
PROGRAMA
❑ La compilación empieza con el
analizador sintáctico quien solicita un FUENTE
token para realizar su trabajo

❑ El analizador de léxico reúne símbolos ANALIZADOR


y envía el token correspondiente de la
unidad léxica que conformó el LEXICO
analizador léxico y espera una nueva
solicitud de token. Solicita envia
token token

INICIA LA ANALIZADOR
COMPILACION SINTACTICO
ANALISIS LEXICO COMO FASE
1. Separar el análisis léxico del análisis
sintáctico a menudo permite
simplificar una u otra de dichas
fases. PROGRAMA
FUENTE
2. Se mejora la eficiencia del
compilador. Un analizador léxico
independiente permite construir un
procesador especializado y
potencialmente más eficiente para ANALIZADOR
esta función. Gran parte de tiempo LEXICO
se consume en leer el programa
fuente y dividirlo en componentes
léxicos. TABLA DE
Solicita envia
SIMBOLOS token token
3. Se mejora la transportabilidad del
compilador. Las peculiaridades del
alfabeto de entrada y otras ANALIZADOR
anomalías propias de los
dispositivos pueden limitarse al SINTACTICO
analizador léxico.
RESPONSABILIDAD
DEL ANALISIS LEXICO
❑ Manejo de apertura y cierre de archivo,
lectura de caracteres y gestión de
posibles errores de apertura.

❑ Eliminar comentarios, espacios en


blanco, tabuladores y saltos de línea.

❑ Inclusión de archivos y macros.

❑ Contabilizar número de líneas y


columnas para emitir mensajes de
error.
ERRORES LEXICOS
Errores léxicos típicos son:

▪ Nombre ilegales de identificadores: un


nombre contiene caracteres inválidos.
for ( ; ; @ )

▪ números incorrectos: un numero contiene


caracteres inválidos o no esta formado 3,14
correctamente, por ejemplo 3,14 en vez
de 3.14 o 0.3.14.

▪ Errores ortográficos en palabras


reservadas: caracteres omitidos, hwhile
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
cant + total ; ma EOF
lexico(ma en lugar de main)
ERRORES LEXICOS
❑ Los errores léxicos se deben a descuidos
del programador. En general, la
recuperación de errores léxicos es sencilla
y siempre se traduce en la generación de
un error de sintaxis que será detectado
más tarde por el analizador sintáctico
cuando el analizador léxico devuelve un
componente léxico que el analizador
sintáctico no espera en esa posición.

❑ Los métodos de recuperación de errores


léxicos se basan bien en saltarse
caracteres en la entrada hasta que un
patrón se ha podido reconocer; o bien
usar otros métodos más sofisticados que
incluyen la inserción, borrado, sustitución
de un carácter 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 visión muy restringida de un
programa fuente.
❑ Posibles acciones de recuperación
de errores son:

▪ Modo pánico
▪ Borrar un caracter extraño
▪ Insertar un caracter que falta
▪ Reemplazar un caracter incorrecto por
otro correcto
▪ Intercambiar dos caracteres adyacentes
ERRORES EN MODO PANICO
Características “ U N M S M 2 3 • 5 < \0

▪ Método más sencillo


▪ Lo pueden usar también BUFFER
analizadores sintácticos.
▪ No entra en lazos infinitos “ UNMSM 23.5 <
Funcionamiento general
▪ El SCANNER desecha símbolos Como no hay comillas
de la entrada, uno por uno, finales tiene que retroceder
hasta encontrar un token de hasta el primer símbolo
sincronización para continuar
Delimitadores (punto y coma, LEXEMA
palabras clave como end) “
Inconvenientes UNMSM
▪ Podrían omitirse gran cantidad 23.5
de símbolos sin analizar <
IMPLEMENTACION DEL
ANALIZADOR LEXICO

1. Utilizando un lenguaje de alto nivel

2. Utilizando un generador de
Analizadores Léxicos

▪ Lex
▪ Flex
▪ jlex
ANALIZADOR LEXICO
Definición del léxico y los tokens
asociados a cada uno de los componentes
léxicos

No COMPONENTE LEXICO TOKEN


1 Identificador 100
2 Operador ( >=) 200
3 Operador ( > ) 201
4 Constantes enteras 300
5 Palabra reservada(for) 400
6 Palabra reservada(end) 401

Observación:
Si en caso entra un carácter que no
este contemplado se envía el código
911 lo cual indica que hay un error
ESPECIFICACION DEL
ANALIZADOR LEXICO

Autómata para el
analizador léxico
ESPECIFICACION DEL
ANALIZADOR LEXICO
Expresiónes regulares
Identificador : L (L/d)*
Entero : dd+
Operadores :
>
>=
Gramática 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

También podría gustarte