Sunteți pe pagina 1din 11

TEORIA DE LENGUAJES

PROGRAMA ANALIZADOR LEXICO Y SINTACTICO


1. INTRODUCCION
Un analizador lxico es un programa, el cual cumple diferentes
funciones especficamente, reconocer un lenguaje, con sus caracteres de
entrada, donde se encuentra la cadena a analizar, reconocer subcadenas que
correspondan a smbolos del lenguaje y retornar los tokens correspondientes
y sus atributos. Pero escribir analizadores lxicos eficientes a mano puede
resultar una tarea tediosa y complicada, y para evitarla se han creado
herramientas de software los generadores de analizadores lxicos que
generan automticamente un analizador lxico a partir de una especificacin
provista por el usuario, pero tambin se puede realizar mediante
programacin desde un determinado lenguaje, como, en esta caso,
emplearemos el lenguaje C#.
En el presente trabajo abordaremos sobre la construccin de un
programa para realizar el analisis lxico, para ello empezaremos por definir el
lenguaje, sus componentes del lenguaje y sus reglas de sintaxis, adems del
programa, sus funciones y su interfaz grfica. Este analizador lxico lee
caracteres del archivo de entrada, donde se encuentra la cadena a analizar,
reconoce lexemas y retorna tokens.
Este trabajo tiene el objetivo de dar a conocer
la lgica y
funcionamiento de un analizador lxico, adems de permitir a nosotros, como
alumnos, entender mejor este tema, y de este modo adquirir la idea de la
implementacin de un programa que ayude en su solucin; y dejarlo listo
para la siguiente fase de la compilacin denominada: Anlisis Sintctico.

TEORIA DE LENGUAJES

2. DEFINICION DEL LENGUAJE: COMPONENTES LEXICOS Y REGLAS DE SINTAXIS


(DIAGRAMA DE ESTADOS DE LOS COMPONENTES LEXICOS)
2.1 Componentes Lxicos:
El lenguaje del programa ANALIZADOR LEXICO tiene los siguientes tipos de
componentes lxicos o tokens:
Identificadores, que slo son nombres de variables y estn compuestos
por una nica letra minscula de rango: a. . . z.
Constantes numricas de un slo dgito, de rango: 0. . . 9.
Operadores: +, -, *, / y %.
Smbolo de asignacin: = (igual).
Parntesis: (y ).
Separador de sentencias: ; (punto y coma).
Indicadores de principio y fin de bloque: { y }.
Palabras reservadas, estn formadas por una letra mayscula. Tan slo
son tres: R (lectura), W (escritura) y M (programa principal).
2.2 Diagrama de Estado de los Componentes Lxicos:
Realizaremos a cabo el diagrama de estados de cada componente lxico:
Para el token identificadores: <id>:
<id> ::= a|b|c|z

Para el token constantes numricas: <const_num>:


<const_num> ::= 0|1|2|9

TEORIA DE LENGUAJES

Para el token operadores: <op>:


<op> ::= + | - | * | / | %

Para el token smbolo de asignacin: <simb_asig>:


<simb_asig> ::= =

Para el token parntesis: <parent>:


<parent> ::= ( | )

Para el token separador de sentencias: <separador>:


<separador> ::= ;

TEORIA DE LENGUAJES

Para el token indicadores de principio y fin de bloque: <IFB>


<IFB> ::= { | }

Para el token de la palabra reservada: programa principal: <M>


<Main> ::= Main

Para el token de la palabra reservada: lectura: <R>


<Read> ::= Read

Para el token de la palabra reservada: escritura: <W>


<Write> ::= Write

2.2 Reglas de sintaxis:


Se realizar formalmente mediante una gramtica EBNF, es decir el analizador
sintctico conoceque regla de produccin ha de seguir con slo conocer el
token por el que comienza la sentencia. La gramtica en EBNF del lenguaje del
programa ANALIZADOR LEXICO es:

TEORIA DE LENGUAJES

<Programa> ::= Main "{" <bloque> "}"


<bloque> ::= <sentencia> <otra_sentencia>
<otra_sentencia> ::= ; <sentencia>
<otra_sentencia> | <vacio> <sentencia> ::=
<asignacin> | <lectura> | <escritura>
<asignacin> ::= <variable> = <expresin>
<expresin> ::= <trmino> <ms terminos>
<ms trminos> ::= + <trmino> <ms trminos>| - <trmino> <ms
trminos> | <vacio>
<trmino> ::= <factor> <ms factores>
<ms factores> ::= * <factor> <ms factores> | / <factor>
<ms factores> | % <factor> <ms factores> | <vacio>
<factor> ::= ( <expresin> ) | <variable> | <constante>
<lectura> ::= Read <variable>
<escritura> ::= Write <variable>
<variable> ::= a | b | c | ... | z
<constante> ::= 0 | 1 | ... | 9
<vaco> :: =

TEORIA DE LENGUAJES

3. LENGUAJE DE DESARROLLO
El lenguaje de desarrollo que utilizaremos es el LENGUAJE c#. A continuacin
se presenta las lneas de cdigo para la creacin de las ventanas:
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;

namespace Teoria_de_Lenguajes
{
public partial class AnalizadorLexico : Form
{
string error = "";
string lexema = ""; string caracter = "";
public AnalizadorLexico()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{ //Limpiar cuadro de caracteres y mensaje para nueva ejecucuion
lista_Token.Items.Clear();
lbxSecuencia.Items.Clear();
lbxErrores.Items.Clear();
string a = cuadro_Codigo.Text;
if (cuadro_Codigo.Text != "")
{
int fila = 1, columna = 1;
int verificador=0;
for (int i = 0; i < cuadro_Codigo.Text.Length; i++)
{
//Compara caracter con Palabras reservas
if (a.Substring(i, 1) == "M" || a.Substring(i, 1) == "R" || a.Substring(i,1)=="W")
{
if (a.Substring(i, 1) == "M")
{
lexema = "PROG PRINCIPAL";
AgregaSecuencia();
}
else if (a.Substring(i, 1) == "R")
{
lexema = " LECTURA";
AgregaSecuencia();
}
else

TEORIA DE LENGUAJES

lexema = "ESCRITURA";
AgregaSecuencia();

}
}
//Compara Caracter con elementos Desconocidos
else if (a.Substring(i, 1) == "A" || a.Substring(i, 1) == "B"||
a.Substring(i, 1) == "C" || a.Substring(i, 1) == "D"||
a.Substring(i, 1) == "E" || a.Substring(i, 1) == "F"||
a.Substring(i, 1) == "G" || a.Substring(i, 1) == "H"||
a.Substring(i, 1) == "I" || a.Substring(i, 1) == "J"||
a.Substring(i, 1) == "K" || a.Substring(i, 1) == "L"||
a.Substring(i, 1) == "N" || a.Substring(i, 1) == ""||
a.Substring(i, 1) == "O" || a.Substring(i, 1) == "P"||
a.Substring(i, 1) == "Q" || a.Substring(i, 1) == "S"||
a.Substring(i, 1) == "T" || a.Substring(i, 1) == "U"||
a.Substring(i, 1) == "V" || a.Substring(i, 1) == "X"||
a.Substring(i, 1) == "Y" || a.Substring(i, 1) == "Z")
{
lexema = "DESCONOCIDO";
//Poner la secuencia en rojo como advertencia
lbxSecuencia.Items.Add("<" + lexema + ">");
//Mostrando Los Mensajes de error
error = "Elemento desconocido en la fila "+fila+" columna "+columna;
lbxErrores.Items.Add(error);
lbxErrores.ForeColor = System.Drawing.Color.Red;
}
///Compara el Caracter con Operadores
else if (a.Substring(i, 1) == "+" || a.Substring(i, 1) == "-" || a.Substring(i, 1) == "*" ||
a.Substring(i, 1) == "/" || a.Substring(i, 1) == "%")
{
if (a.Substring(i, 1) == "+")
{
lexema = "OPER SUMA";
AgregaSecuencia();
}
else if (a.Substring(i, 1) == "-")
{
lexema = "OPER RESTA";
AgregaSecuencia();
}
else if (a.Substring(i, 1) == "*")
{
lexema = "OPER MULTIPLIC";
AgregaSecuencia();
}
else if (a.Substring(i, 1) == "/")
{
lexema = "OPER COCIENTE";
AgregaSecuencia();
}
else
{
lexema = "OPER RESIDUO";
AgregaSecuencia();

TEORIA DE LENGUAJES

///Compara con Carateres Especiales


else if (a.Substring(i, 1) == "(" || a.Substring(i, 1) == ")" )
{
lexema = "PARENTESIS";
AgregaSecuencia();
}
else if (a.Substring(i, 1) == ";")
{
lexema = "PUNTO Y COMA";
AgregaSecuencia();
}
else if (a.Substring(i, 1) == "{" || a.Substring(i, 1) == "}")
{
if (a.Substring(i, 1) == "{")
{
lexema = "INDIC PRINCIPIO";
AgregaSecuencia();
}
else
{
lexema = "FIN DE BLOQUE";
AgregaSecuencia();
}
}
else if (a.Substring(i, 1) == "=")
{
lexema = "SIMB ASIGNACION";
AgregaSecuencia();
}
else if (a.Substring(i, 1) == "1" || a.Substring(i, 1) == "2" || a.Substring(i, 1) == "3"
|| a.Substring(i, 1) == "4" || a.Substring(i, 1) == "5" || a.Substring(i, 1) == "6" || a.Substring(i, 1)
== "7" || a.Substring(i, 1) == "8" || a.Substring(i, 1) == "9" || a.Substring(i, 1) == "0")
{
lexema = "CTE NUMERICAS";
AgregaSecuencia();
}
//Comparacion con saltos de linea y espacios en blanco
else if (a.Substring(i, 1) == "\n" || a.Substring(i, 1) == "\r" || a.Substring(i, 1) == " ")
{
if(verificador==0)
{
verificador = 1;
if (a.Substring(i, 1) == " ")
{
caracter = "espacio";
}
else
{
fila = fila + 1; lexema = "salto"; columna = 1;
}
}
}

TEORIA DE LENGUAJES

else if (a.Substring(i, 1) == "a" || a.Substring(i, 1) == "b" || a.Substring(i, 1) == "c" ||


a.Substring(i, 1) == "d" || a.Substring(i, 1) == "e" || a.Substring(i, 1) == "f" ||
a.Substring(i, 1) == "g" || a.Substring(i, 1) == "h" || a.Substring(i, 1) == "i" ||
a.Substring(i, 1) == "j" || a.Substring(i, 1) == "k" || a.Substring(i, 1) == "l" ||
a.Substring(i, 1) == "m" || a.Substring(i, 1) == "n" || a.Substring(i, 1) == "o" ||
a.Substring(i, 1) == "p" || a.Substring(i, 1) == "q" || a.Substring(i, 1) == "r" ||
a.Substring(i, 1) == "s" || a.Substring(i, 1) == "t" || a.Substring(i, 1) == "u" ||
a.Substring(i, 1) == "v" || a.Substring(i, 1) == "w" || a.Substring(i, 1) == "x" ||
a.Substring(i, 1) == "y" || a.Substring(i, 1) == "z")
{
lexema = "IDENTIFICADOR";
AgregaSecuencia();
}
else{
lexema = "DESCONOCIDO";
//Poner la secuencia en rojo como advertencia
lbxSecuencia.Items.Add("<" + lexema + ">");
//Mostrar mensajes de error
error = "Elemento desconocido en la fila " + fila + " columna " + columna;
lbxErrores.Items.Add(error);
lbxErrores.ForeColor = System.Drawing.Color.Red;
}
///Agregando elemento a la lista
if(lexema!="salto")
{
if (caracter != "espacio")
{
lista_Token.Items.Add("\t" + a.Substring(i, 1) + "\t" + lexema + "\t" + fila + "\t"
" + columna);
columna = columna + 1; verificador = 0; caracter = "";
}
else
{
verificador = 0; caracter = "";
}

+"

}
}
}

private void boton_Integrantes_Click(object sender, EventArgs e)


{//Invocacion a la ventana integrantes
Integrantes objIntegrantes = new Integrantes();
objIntegrantes.Show();
}
private void cuadro_Codigo_TextChanged(object sender, EventArgs e)
{
}

TEORIA DE LENGUAJES

private void AnalizadorLexico_Load(object sender, EventArgs e)


{
cuadro_Codigo.Focus();
}
private void btnSalir_Click(object sender, EventArgs e)
{
this.Close();
}
private void AgregaSecuencia()
{
//Cargando la lista de secuencia, Pero sin errores
lbxSecuencia.Items.Add("<" + lexema + ">");
}
}

4. DISEO DE PANTALLAS
El diseo de pantalla quedaria de la siguiente manera:
TABLA: Servir para mostrar la tabla que contienen los tokens y
lexemas.
TABLA DE SIMBOLOS : Servir para mostrar la tabla de smbolos
y las veces en que aparecen en el programa.

TEORIA DE LENGUAJES

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