¿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.