Analizador Lexico-Avance 3

14
PROGRAMA ANALIZADOR LEXICO Y SINTACTICO 1. INTRODUCCION Un analizador léxico es un programa, el cual cumple diferentes funciones específicamente, reconocer un lenguaje, con sus caracteres de entrada, donde se encuentra la cadena a analizar, reconocer subcadenas que correspondan a símbolos del lenguaje y retornar los tokens correspondientes y sus atributos. Pero escribir analizadores léxicos eficientes “a mano” puede resultar una tarea tediosa y complicada, y para evitarla se han creado herramientas de software – los generadores de analizadores léxicos – que generan automáticamente un analizador léxico a partir de una especificación provista por el usuario, pero también se puede realizar mediante programación desde un determinado lenguaje, como, en esta caso, emplearemos el lenguaje C#. En el presente trabajo abordaremos sobre la construcción de un programa para realizar el analisis léxico, para ello empezaremos por definir el lenguaje, sus componentes del lenguaje y sus reglas de sintaxis, además del programa, sus funciones y su interfaz gráfica. Este analizador léxico 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 lógica y funcionamiento de un analizador léxico, además de permitir a nosotros, como alumnos, entender mejor este tema, y de este modo adquirir la idea de la implementación de un programa que ayude en su solución; y dejarlo listo para la siguiente fase de la compilación denominada: Análisis Sintáctico. TEORIA DE LENGUAJES

description

Generacion Codigo Java Analisis Lexico

Transcript of Analizador Lexico-Avance 3

TEORIA DE LENGUAJES

DESARROLLO DE ANALIZADOR LEXICO Y SINTACTICO

PROGRAMA ANALIZADOR LEXICO Y SINTACTICO1. 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.

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: : ::= a|b|c|z

Para el token constantes numricas: : ::= 0|1|2|9

Para el token operadores: : ::= + | - | * | / | %

Para el token smbolo de asignacin: : ::= =

Para el token parntesis: : ::= ( | )

Para el token separador de sentencias: : ::= ;

Para el token indicadores de principio y fin de bloque: ::= { | }

Para el token de la palabra reservada: programa principal: ::= Main

Para el token de la palabra reservada: lectura: ::= Read

Para el token de la palabra reservada: escritura: ::= 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: ::= Main "{" "}" ::= ::= ; | ::= | | ::= = ::=

::= + | - |

::=

::= * | / | % | ::= ( ) | | ::= Read ::= Write ::= a | b | c | ... | z ::= 0 | 1 | ... | 9 :: =

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 System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using 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 { 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(""); //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(); } } ///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; } } }

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(""); //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) {

}

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(""); } }}

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.