• Viernes 24 de Abril de 2026, 06:17

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Tom Cyberspirit

Páginas: [1]
1
C/C++ / Analizador Lexico Simplificado
« en: Martes 24 de Mayo de 2011, 17:46 »
¿Alguien me puede facilitar el código en c++  o Java de un Analizador Léxico simplificado?
Hola a todos. Si alguien me puede facilitar su código, le agradeceré infinitamente.

Les dejo los requisitos que debe llevar el programa:

Para nuestro proyecto utilizaremos un lenguaje hipotético que se conformará de lo siguiente:

Palabras reservadas: { Inicio, Fin, Var }
Operadores aritméticos: { +, *, /, -, = }
Números : { reales, enteros}
Identificadores: ver Gramáticas regulares
Palabra NO valida: Error, cadena que no sea de alguno de los tipos anteriores

Hasta aquí debemos concluir que nuestro programa clasificará cada cadena de nuestra entrada como uno de los cinco elementos anteriores.
Ejemplo
Si tenemos como entrada las siguientes cadenas

var  a, casa, 1fin
inicio
  algo = 50 + 20.5
fin

La salida esperada en pantalla sería

Palabra            Clasificación
var               Palabra reservada
a               Identificador
casa               Identificador
1fin               Error, Palabra NO valida
inicio               Palabra reservada
algo               Identificador
=               Operador
50               Número entero
+               Operador
20.5               Número real
fin               Palabra reservada

Como programar
Un objetivo importante de este proyecto es recalcar la aplicación practica de la materia por lo que nuestro programa lo realizaremos tomando como base el comportamiento de las gramáticas regulares ya que con ellas podemos diseñar lenguajes que producen cualquiera de los cuatro tipos de cadenas que reconocerá nuestro programa. Con este antecedente mostraremos el pseudocódigo de la función que reconoce un identificador.
func Identificador (Cadena cad) regresa boolean
   if cad[1] != LETRA or cad[1] !=’_’ regresa  falso;
      for( x =2 ; x <= longitud(cad);  x++)  
            {
     if cad
  • !=LETRA or cad
  • != NUMERO or cad
  • !=’_’

                regresa  falso;
             }
   regresa  verdadero;
fin func

De la misma forma como vemos la función identificador debemos codificar las funciones Numero,  PalabraReservada, Operador, etc. de manera que un ciclo en la función principal se vería:

func principal ()
   FILE fa  = fopen(“archivo”,”r”)     
   while ( !feof(fa)) {
      if LeeArchivo(fa, cad)>0 {
          if PalabraReservada (cad)
         print( cad + “tt Palabra Reservada”);
          elseif Identificador (cad)
         print( cad + “tt Identificador”);
          elseif Numero(cad)  
         print( cad + “tt Numero”);
          elseif Operador(cad)  
         print( cad + “tt Operador Aritmético”);
          else
         print(cad + “tt  Error: Palabra NO valida”);
          }
   }
fin func
Aclaraciones

a)   El programa deberá ser escrito en C o Java.
b)   No es obligatorio que la entrada se lea de un archivo, puede ser tecleando las cadenas pero NO una por una sino renglones que simulan expresiones completas, ej:  var1 = 67 + var2
c)   Por razones ajenas existe un programa con mucha disponibilidad entre la comunidad que realiza un tarea similar pero es basando en Autómatas Finitos. Este programa se basa en grandes arreglos donde cada estado es un arreglo y el contenido de estos son cada una de las letras, los números y otros símbolos.  ESTE PROGRAMA NO SERA ACEPTADO.
d)    En un analizador léxico real cuando al evaluar una expresión se encuentra un símbolos que no sea parte de un identificador (LETRA, NUMERO, ‘_’) se  da por terminada la cadena y se procesa. Este comportamiento se considerará un agregado. Se da por valido el hecho de que cada cadena de un reglón vaya separada por un espacio en blanco.

Páginas: [1]