0% encontró este documento útil (0 votos)
30 vistas

Lab 20241001 Leng Java

El documento describe un laboratorio sobre el desarrollo de un analizador léxico para un subconjunto del lenguaje Java usando Lex y C bajo Linux. Se especifica la gramática a reconocer, la entrada y salida del programa, y consideraciones para la implementación como la generación de una tabla de identificadores.
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)
30 vistas

Lab 20241001 Leng Java

El documento describe un laboratorio sobre el desarrollo de un analizador léxico para un subconjunto del lenguaje Java usando Lex y C bajo Linux. Se especifica la gramática a reconocer, la entrada y salida del programa, y consideraciones para la implementación como la generación de una tabla de identificadores.
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
Está en la página 1/ 3

COMPILADORES

LABORATORIO 1

TITULO: ANALIZADOR LEXICO DE UN SUBCONJUNTO DE LENGUAJE DE


PROGRAMACIÓN JAVA.
LENGUAJE: Lex (Flex) y C Bajo Linux Ubuntu.
FECHA DE INICIO: Marzo 22 de 2024
FECHA DE ENTREGA: Abril 22 de 2024
NOMBRE PROGRAMA: LAB01_Apellido1_Apellido2_Apellido3_Apellido4 (Fuente Lex).
LAB01_Apellido1_Apellido2_Apellido3_Apellido4 (Fuente C).
LAB01_Apellido1_Apellido2_Apellido3_Apellido4 (Ejecutable)
INTEGRANTES: 4 ESTUDIANTES POR GRUPO.

Gramática: Los siguientes son los tokens que hacen parte del conjunto a tener en cuenta:
Palabras claves: if-else, for, while, double, int, String, char, new, public, class,static,void,
Los operadores aritméticos: op-mult (*), op-sum(+), op-sust(-), op-div(/), op-asign(=), op-mod(%)
Los operadores aritméticos espciales: ++,--,+=,-=,*=,/=.
Delimitadores de inicio y final de bloques de instrucción: {,}
Final de instrucción: punto-y-coma(;)
Los paréntesis: parent-a ( ( ), parent-c ( ) ), corchete-a([), corchete-c(])
Los siguientes tokens: Constantes enteras, reales y cadenas (las cadenas están entre comillas dobles)
Los siguientes componentes léxicos: Identificadores (son las variables).
Los operadores relacionales Igual (==), Menor-igual (<=), Mayor-igual (>=), Diferente (<>), Mayor (>)
y Menor (<), Diferente (!=)
Los operadores lógicos: op-y ( && ), op-o ( || ), op-no ( !)
Se deben considerar los comentarios dentro de cada uno de los programas y tratarlos según las reglas del
análisis léxico.
Considerar los arreglos de cualquier dimensión, declaraciones de variables y cadenas en su función básica
de asignación.
No se debe considerar:
Manejo de cadenas
Manejo de funciones o subrutinas
Manejo de funciones predefinidas.
Operaciones de entrada/salida

Entrada: Un archivo llamado entrada.txt, el cual contenga un programa con las indicaciones anteriores
y basado en el lenguaje de programación Java.

Salida: Generación de un archivo de salida llamado salida.txt, el cual contendrá todos los componentes
léxicos que se pueden obtener del archivo programa de entrada. Los componentes léxicos
correspondientes a variables deben presentar en forma de tabla al final y numerados a partir de uno. Un
mismo identificador puede aparecer varias veces y tiene el mismo número. También en este archivo se
debe generar un listado de errores léxicos, si los hay.

Ejecución: El archivo de entrada.txt debe ser dado como un parámetro a continuación del nombre del
programa ejecutable. La salida del programa debe ser direccionada (>) a un archivo de salida llamado
salida.txt. Cada línea del archivo de entrada contiene sentencias Java. El archivo de entrada NO se debe
pedir en forma interactiva.
Ejemplo de ejecución:
.\LAB01 entrada.txt > salida.txt
Donde LAB01 es el programa ejecutable.

Consideraciones adicionales:

1. Generar dentro de la tabla de identificadores sólo una vez para las variables, aunque aparezcan más de
una.
2. Las palabras claves no son identificadores.
3. Cualquier símbolo diferente de los establecidos es un error y se debe señalar en el análisis léxico en el
archivo de salida.
4. Si hay error léxico en algún punto del archivo, se debe continuar el análisis hasta el final.
5. La entrada para el programa que se genere debe ser un archivo con un programa en Java y se debe
generar un archivo de salida como se describió anteriormente.
6. Debe entregar un manual de uso del programa, de no más de dos ( 2 ) páginas.
7. Todo esto lo deben desarrollar sobre el sistema operativo Linux Ubuntu.

Ejemplo:

Dado el siguiente programa en el archivo de entrada prueba.java

public class AnyThing{


public static void main (String[] args){
int i=1;
int j=?20;
char c;
String cadena;
double z;
z=14.9e-8;
z=12.9;
cadena="Hola";
c="a";
i=2i;
for (int k = 1; k < j; k++){
i*=k;
z/=2.0;
}
}
}

Este es el archivo de salida en salida.txt:

PUBLIC CLASS Id1=AnyThing, Llave-a = {


PUBLIC STATIC VOID Id2 = main Parent-a = ( STRING Corchete-a =[ Corchete-c=] Id3 = args
Parent-c = ) Llave-a = {
INT Id4= i, Op_asig= =, Cte-ent=1, Punto-coma=;
INT Id5= j, ERROR= =?, Cte-ent=20, Punto-coma=;
CHAR Id6=c, Punto-coma=;
STRING Id7=cadena, Punto-coma=;
DOUBLE Id8= z, Punto-coma=;
Id8=z, Op-asig= = Cte-real= 14.9e-8 Punto-coma=;
Id8=z, Op-asig= = Cte real= 12.9 Punto-coma=;
Id7=cadena, Op-asig= = Cte-cadena= "Hola", Punto-coma=;
Id6=c, Op-asig= = Cte-cadena= "a", Punto-coma=;
Id4= i, Op-asig= =, ERROR= 2i, Punto-coma=;
FOR Parent-a = (, INT Id9=k, Op-asig = =, Cte-entera = 1, Punto-coma=; Id9=k, Op-Menor = <,
Id5=j, Punto-coma=; ,Id9=k, Op-MasMas = ++, Parent-c=), Llave-a = {
Id4 = i, Op-PorAsig = *=, Id9=k; Punto-coma=;
Id8 = z, Op-DivAsig = /=, Cte-real=2.0, Punto-coma=;
Llave-c=}
Llave-c=}
Llave-c=}

TABLA DE IDENTIFICADORES
Hay 9 identificadores
Id1= AnyThing
Id2=main
Id3=args
Id4= i
Id5= j
Id6= c
Id7= cadena
Id8= z
Id9=k

2 errores léxicos

---------------------------------------------------------------
Observación: Lo que aparece en negrilla es el componente léxico y lo que sigue es el valor o lexema. Las
palabras claves no tienen otro valor de lexema, sino la misma palabra, pero en mayúscula.

También podría gustarte