Proyecto TypeWise: Guía del Estudiante
Proyecto TypeWise: Guía del Estudiante
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Organización de Lenguajes y
Compiladores 1 Primer Semestre 2023
Catedráticos
Ing. Mario Bautista
Ing. Manuel Castillo
Ing. Kevin Lajpop
Tutores Académicos
Mynor Ruiz
José Pérez
Kevin López
Maynor Piló Tuy
TypeWise
Proyecto 2
Contenido
1. Objetivos ............................................................................................................................. 3
1.1 Objetivos Generales .................................................................................................... 3
1.2 Objetivos Específicos .................................................................................................. 3
2. Descripción General ........................................................................................................... 3
3. Entorno de Trabajo ............................................................................................................. 3
3.1 Editor ........................................................................................................................... 3
3.2 Funcionalidades .......................................................................................................... 4
3.3 Características ............................................................................................................ 4
3.4 Herramientas ............................................................................................................... 4
3.5 Reportes ...................................................................................................................... 4
3.6 Área de consola ........................................................................................................... 5
4. Descripción del Lenguaje .................................................................................................... 5
4.1 Case Insensitive ........................................................................................................... 5
4.2 Comentarios ..................................................................................................................5
4.3 Tipos de Datos .................................................................................................... 6
4.4 Secuencias de Escape ................................................................................................ 6
4.5 Operadores Aritméticos ............................................................................................... 7
4.6 Operadores Relacionales............................................................................................11
4.7 Operador Ternario ......................................................................................................12
4.8 Operadores Lógicos ....................................................................................................12
4.9 Signos de Agrupación .................................................................................................13
4.10 Precedencia de Operaciones ......................................................................................13
4.11 Caracteres de finalización y encapsulamiento de sentencias .....................................13
4.12 Declaración y asignación de variables ........................................................................14
4.13 Casteos .......................................................................................................................14
4.14 Incremento y Decremento ...........................................................................................15
4.15 Estructuras de Datos ...................................................................................................15
4.14.1. Vectores ................................................................................................................15
[Link] Declaración de Vectores .......................................................................................16
[Link] Acceso a vectores .................................................................................................16
[Link] Modificación de Vectores ......................................................................................16
4.14.2. Listas ....................................................................................................................17
[Link] Declaración de Listas ............................................................................................17
[Link] Agregar valor a una lista .......................................................................................18
[Link] Acceso a Listas .....................................................................................................18
[Link] Modificación de Vectores ......................................................................................18
4.16 Sentencias de control ..................................................................................................19
4.17 Sentencias cíclicas ......................................................................................................23
4.19 Funciones .....................................................................................................................27
4.22 Función Print ...................................................................................................................30
4.23 Función toLower ..............................................................................................................30
4.24 Función toUpper ..............................................................................................................30
4.24. Funciones nativas ..........................................................................................................30
4.24.1 Length ........................................................................................................................31
4.24.2 Truncate ....................................................................................................................31
4.24.3 Round .......................................................................................................................31
4.24.4 Typeof .......................................................................................................................32
4.24.5 To String....................................................................................................................32
4.24.6 toCharArray ..............................................................................................................32
4.25 Main .......................................................................................................................33
5. Reportes ..............................................................................................................................34
5.1 Tabla de Símbolos .......................................................................................................34
5.2 Tabla de Errores ..........................................................................................................34
5.4 Salidas en Consola ..................................................................................................36
6. Requerimientos Mínimos .....................................................................................................36
7. Entregables .........................................................................................................................36
8. Restricciones .....................................................................................................................37
9. Fecha de Entrega ..............................................................................................................37
1. Objetivos
1.1 Objetivos Generales
Aplicar los conocimientos sobre la fase de análisis léxico y sintáctico de un
compilador para la realización de un intérprete sencillo, con las funcionalidades
principales para que sea funcional.
2. Descripción General
El curso de Organización de Lenguajes y Compiladores 1, perteneciente a la
Facultad de Ingeniería de la Universidad de San Carlos de Guatemala, ha quedado
satisfecho con el programa EXREGAN (que previamente ha entregado), por lo que
nuevamente se interesan en usted para generar el lenguaje TypeWise, que será un
intérprete para que los estudiantes de Introducción a la Programación y
Computación 1 utilicen para sus primeras prácticas.
3. Entorno de Trabajo
3.1 Editor
El editor será parte del entorno de trabajo, cuya finalidad será proporcionar
ciertas funcionalidades, características y herramientas que serán de utilidad al
usuario. La función principal del editor será el ingreso del código fuente que será
analizado. En este se podrán abrir diferentes archivos al mismo tiempo y deberá
mostrar la línea actual. El editor de texto se tendrá que mostrar en el navegador.
Queda a discreción del estudiante el diseño.
PROPUESTA DE INTERFAZ GRÁFICA DE LA WEB APP
3.2 Funcionalidades
• Crear archivos: El editor deberá ser capaz de crear archivos en blanco.
• Abrir archivos: El editor deberá abrir archivos .tw
• Guardar el archivo: El editor deberá guardar el estado del archivo en el que se
estará trabajando.
• Eliminar pestaña: permitirá cerrar la pestaña actual.
3.3 Características
• Múltiples Pestañas: se podrán crear nuevas pestañas con la finalidad de ver y abrir
los archivos de prueba en la aplicación.
3.4 Herramientas
• Ejecutar: hará el llamado al intérprete, el cual se hará cargo de realizar los análisis
léxico, sintáctico, además de ejecutar todas las sentencias.
3.5 Reportes
• Reporte de Errores: Se mostrarán todos los errores encontrados al realizar el
análisis léxico, sintáctico.
• Generar Árbol AST (Árbol de Análisis Sintáctico): se debe generar una imagen
del árbol de análisis sintáctico que se genera al realizar los análisis.
• Reporte de Tabla de Símbolos: Se mostrarán todas las variables, métodos y
funciones que han sido declarados dentro del flujo del programa.
3.6 Área de consola
En esta área se mostrarán los resultados, mensajes y todo lo que sea indicado
dentro del lenguaje.
// Ejemplo
int a=0;
INt A=0;
//Debe dar error la declaración de “A” ya que la variable “a” ya existe previamente
//int es lo mismo que INt
4.2 Comentarios
Los comentarios son una forma elegante de indicar que función tiene cierta sección
del código que se ha escrito simplemente para dejar algún mensaje en específico. El
lenguaje deberá soportar dos tipos de comentarios que son los siguientes:
4.4.1. Comentarios de una línea
Estos comentarios deberán comenzar con // y terminar con un salto de línea.
EJEMPLOS DE COMENTARIOS
/*
Este es un comentario
Multilínea
Para este lenguaje
*/
4.3 Tipos de Datos
Los tipos de dato que soportará el lenguaje en concepto de un tipo de variable se definen
a continuación:
TIPO DEFINICION DESCRIPCION EJEMPLO OBSERVACIONES DEFAULT
Entero Int Este tipo de 1, 50, 100, Del -2147483648 al 0
datos aceptará 25552, etc. 2147483647
solamente números
enteros.
Doble Double Admite valores 1.2, 50.23, Se manejará 0.0
numéricos con 00.34, etc. cualquier cantidad de
decimales. decimales
Booleano Boolean Admite valores que True, false Si se asigna un valor True
indican verdadero booleano a un entero
o falso. se tomará como 1 o 0
respectivamente.
Caracter Char Tipo de dato que 'a', 'b', 'c', En el caso de querer ‘\u0000’
únicamente 'E', 'Z', '1', escribir comilla simple (carácter 0)
aceptará un único '2', '^', '%', ') escribir se escribirá \ y
carácter, y estará ', '=', '!', '&', después comilla simple
delimitado por '/', '\\', '\n', \', si se quiere escribir \
comillas etc. se escribirá dos veces
simples. ' ' \\, existirá también \n,
\t, \r, \".
Observaciones:
• Al sumar dos datos numéricos (entero o doble), el resultado debe ser numérico.
4.5.2. Resta
Es la operación aritmética que consiste en realizar la resta entre dos o más
valores. El símbolo por utilizar es el signo menos -.
Observaciones:
• Al restar dos datos numéricos (entero o doble), el resultado debe ser numérico.
.
4.5.3. Multiplicación
Operación aritmética que consiste en sumar un número (multiplicando) tantas
veces como indica otro número (multiplicador). El sino para representar la operación es
el asterisco*.
Observaciones:
• Al multiplicar dos datos numéricos (entero o doble), el resultado debe ser
numérico.
4.5.4. División
Operación aritmética que consiste en partir un todo en varias partes, al todo se le
conoce como dividendo, al total de partes se le llama divisor y el resultado recibe el
nombre de cociente. El operador de la división es la diagonal /.
Observaciones:
• Al dividir dos datos numéricos (entero o doble), el resultado debe ser numérico.
Observaciones:
• Al potenciar dos datos numéricos (entero o doble), el resultado debe ser
numérico.
Observaciones:
● Al obtener el módulo de un número el resultado debe ser numérico.
Observaciones:
● La negación de un tipo entero o doble debe generar como resultado su
mismo tipo.
-número Resultado
Entero Entero
Doble Doble
Boolean
Carácter
Cadena
Las variables no pueden cambiar de tipo de dato, se deben mantener con el tipo
declarado inicialmente.
identificador = <EXPRESION>;
//Ejemplos
numero = 4;
verdadero = true;
cadena = “valor = “ + valor;
4.13 Casteos
Los casteos son una forma de indicar al lenguaje que convierta un tipo de dato en
otro, por lo que, si queremos cambiar un valor a otro tipo, es la forma adecuada de
hacerlo. Para hacer esto, se colocará la palabra reservada del tipo de dato destino
entre paréntesis seguido de una expresión.
● Int a double
● Double a Int
● Int a String
● Int a Char
● Double a String
● Char a int
● Char a double
‘(’<TIPO>’)’ <EXPRESION>
//Ejemplos
int edad = (int) 18.6; //toma el valor entero de 18
char letra = (char) 70; //tomar el valor ‘F’ ya que el 70 en ascii es F
double numero = (double) 16; //toma el valor 16.0
<EXPRESION>’+’’+’’;’
<EXPRESION> ‘-‘‘-’’;’
//Ejemplos
int edad = 18;
edad++; //tiene el valor de 19
edad--; //tiene el valor 18
int anio=2020;
anio = 1 + anio++; //obtiene el valor de 2022
anio = anio--; //obtiene el valor de 2021
4.14.1. Vectores
Los vectores son una estructura de datos de tamaño fijo que pueden almacenar
valores de forma limitada, y los valores que pueden almacenar son de un único
tipo; int, double, boolean, char o string. El lenguaje permitirá únicamente el
uso de arreglos de una dimensión.
Observaciones:
● La posición de cada vector será N-1. Por ejemplo, si deseo acceder al
primer valor de un vector debo acceder como miVector[0].
[Link] Declaración de Vectores
Al momento de declarar un vector, tenemos dos tipos que son:
● Declaración tipo 1: En esta declaración, se indica por medio de una
expresión numérica del tamaño que se desea el vector, además toma los
valores por default para cada tipo.
//DECLARACION TIPO 1
<TIPO> ‘[’ ‘]’ <ID> = new <TIPO>’[’ <EXPRESION> ’]’ ‘;’
//DECLARACION TIPO 2
<TIPO> ‘[’ ‘]’ <ID> = ‘{’ <LISTAVALORES> ‘}’ ‘;’
Observaciones:
● A una posición de un vector se le puede asignar el valor de otra
posición de otro vector o del mismo vector.
● A una posición de un vector se le puede asignar el valor de una
posición de una lista.
<ID> ‘[’ EXPRESION ‘]’ = EXPRESION‘;’
/*
RESULTADO vector2[0]= “OLC1 ”
vector2[1]= “1er Semestre 2021”
*/
4.14.2. Listas
Las listas son una estructura de datos que pueden crecer de forma iterativa y
pueden almacenar hasta N elementos de un solo tipo; int, double, boolean, char
o string.
Observaciones:
La posición de cada lista será N-1. Por ejemplo si deseo acceder al primer valor
de una lista debo acceder como miLista[[0]] ACCESO A LISTAS EN SECCIÓN
[Link].
//DECLARACION TIPO 1
‘list’‘<’ <TIPO> ’>’ <ID> = new ‘list’‘<’ <TIPO> ’>’ ‘;’
/*
RESULTADO
lista2[[0]]= 5
lista2[[1]]= 4
lista2[[2]]= 100
*/
Observaciones:
● A una posición de una lista se le puede asignar el valor de otra posición
de otra lista o de la misma lista.
● A una posición de una lista se le puede asignar el valor de una posición
de un vector.
<ID> ‘[’’[’ EXPRESION ‘]’’]’ = EXPRESION‘;’
/*
Actualmente listaS[[0]]= “Hola”
listaS[[1]]= “Mundo”
*/
listaS[[0]]=“OLC1 ”;
listaS[[1]]=“1er Semestre ”+vectorNumero[1];
/*
RESULTADO
listaS[[0]]=“OLC1”
listaS[[1]]= “1er Semestre 2021”
*/
OBSERVACIONES:
● También, entre las sentencias pueden tener Ifs anidados.
4.15.1. if
La sentencia if ejecuta las instrucciones sólo si se cumple una condición. Si la
condición es falsa, se omiten las sentencias dentro de la sentencia.
[Link]. if
‘if’ ‘(’ [<EXPRESION>] ‘)’ ‘{‘
[<INSTRUCCIONES>]
‘}’
| ‘if’ ‘(’ [<EXPRESION>] ‘)’ ‘{‘
[<INSTRUCCIONES>]
‘}’ ‘else’ ‘{‘
[<INSTRUCCIONES>]
‘}’
| ‘if’ ‘(’ [<EXPRESION>] ‘)’ ‘{‘
[<INSTRUCCIONES>]
‘}’ ‘else’ [<IF>]
if (x <50)
{
Print(“Menor que 50”);
//Más sentencias
}
[Link]. else
//Ejemplo de cómo se implementar un ciclo if-else
if (x <50)
{
print(“Menor que 50”);
//Más sentencias
}
else
{
print(“Mayor que 100”);
//Más sentencias
}
[Link]. else if
//Ejemplo de cómo se implementar un ciclo else if
if (x > 50)
{
print(“Mayor que 50”);
//Más sentencias
}
else if (x <= 50 && x > 0)
{
print (“Menor que 50”);
if (x > 25)
{
print(“Número mayor que 25”);
//Más sentencias
}
else
{
print(“Número menor que 25”);
//Más sentencias
}
//Más sentencias
}
else
{
print(“Número negativo”);
//Más sentencias
}
[Link]. Default
Estructura que contiene las sentencias si en dado caso no haya salido del switch
por medio de una sentencia break.
‘default’ ‘:’
[<INSTRUCCIONES>]
// EJEMPLO DE SWITCH
int edad = 18;
switch( edad ) {
Case 10:
Print(“Tengo 10 anios.”);
// mas sentencias
Break;
Case 18:
Print(“Tengo 18 anios.”);
// mas sentencias
Case 25:
Print(“Tengo 25 anios.”);
//mas sentencias
Break;
Default:
Print(“No se que edad tengo. :(”);
// mas sentencias
Break;
}
/* Salida esperada Tengo
18 anios.
No se que edad tengo. :(
*/
OBSERVACIONES:
• Si la cláusula “case” no posee ninguna sentencia “break”, al terminar todas las
sentencias del case ingresado, el lenguaje seguirá evaluando las demás opciones.
4.17 Sentencias cíclicas
Los ciclos o bucles, son una secuencia de instrucciones de código que se ejecutan
una vez tras otra mientras la condición, que se ha asignado para que pueda ejecutarse,
sea verdadera. En el lenguaje actual, se podrán realizar 3 sentencias cíclicas que se
describen a continuación.
OBSERVACIONES:
• Es importante destacar que pueden tener ciclos anidados entre las sentencias a
ejecutar.
• También, entre las sentencias pueden tener ciclos diferentes anidados.
4.16.1. While
4.16.2. For
El ciclo o bucle for, es una sentencia que nos permite ejecutar N cantidad de veces
la secuencia de instrucciones que se encuentra dentro de ella.
OBSERVACIONES:
• Para la actualización de la variable del ciclo for, se puede utilizar:
o Incremento | Decremento: i++ | i--
o Asignación: como i=i+1, i=i-1, i=5, i=x, etc, es decir cualquier tipo de
asignación.
• Dentro pueden venir N instrucciones
‘for ‘(’ ([<DECLARACION>|<ASIGNACION>])’;’ [<CONDICION>]’;’ [<[ACTUALIZACION>] ‘)’ ‘{‘
[<INSTRUCCIONES>]
‘}’
/*RESULTADO
i=0
i=1 i=2
*/
4.16.3. Do-While
El ciclo o bucle Do-While, es una sentencia que ejecuta al menos una vez el
conjunto de instrucciones que se encuentran dentro de ella y que se sigue ejecutando
mientras la condición sea verdadera.
‘do’ ‘{‘
[<INSTRUCCIONES>]
‘}’ ‘while’ ‘(’[<EXPRESION>] ‘)’ ‘;’
4.17.1. Break
La sentencia break hace que se salga del ciclo inmediatamente, es decir que el
código que se encuentre después del break en la misma iteración no se ejecutara y
este se saldrá del ciclo.
break;
//Ejemplo en un ciclo for for(int
i = 0; i < 9; i++){
if(i==5){
print(“Me salgo del ciclo en el numero “ + i);
break;
}
print(i);
}
4.17.2. Continue
La sentencia continue puede detener la ejecución de la iteración actual y saltar a
la siguiente. La sentencia continue siempre debe de estar dentro de un ciclo, de lo
contrario será un error.
continue;
//Ejemplo en un ciclo for
for(int i = 0; i < 9; i++){
if(i==5){
print(“Me salte el numero ” + i);
continue;
}
print(i);
}
4.17.3. Return
La sentencia return finaliza la ejecución de un método o función y puede especificar un valor
para ser devuelto a quien llama a la función.
return;
return <EXPRESION>;
//Ejemplos
//--> Dentro de un metodo
void mi_metodo(){
int i;
for(i = 0; i < 9; i++){
if(i==5){
return; //se detiene
}
print(i);
}
}
//--> Dentro de una función
int sumar(int n1, int n2){
int n3;
n3 = n1+n2;
return n3; //retorno el valor
}
4.19 Funciones
Una función es una subrutina de código que se identifica con un nombre, tipo y un
conjunto de parámetros. Para este lenguaje las funciones serán declaradas definiendo
primero su tipo, luego un identificador para la función, seguido de una lista de parámetros
dentro de paréntesis (esta lista de parámetros puede estar vacía en el caso de que la
función no utilice parámetros).
Cada parámetro debe estar compuesto por su tipo seguido de un identificador, para
el caso de que sean varios parámetros se debe utilizar comas para separar cada
parámetro y en el caso de que no se usen parámetros no se deberá incluir nada dentro de
los paréntesis. Luego de definir la función y sus parámetros se declara el cuerpo de la
función, el cual es un conjunto de instrucciones delimitadas por llaves {}.
4.20 Métodos
Un método también es una subrutina de código que se identifica con un nombre, tipo
y un conjunto de parámetros, aunque a diferencia de las funciones estas subrutinas no
deben de retornar un valor. Para este lenguaje los métodos serán declarados haciendo
uso de la palabra reservada ‘void’ al inicio, luego se indicará el identificador del método,
seguido de una lista de parámetros dentro de paréntesis (esta lista de parámetros puede
estar vacía en el caso de que la función no utilice parámetros).
Cada parámetro debe estar compuesto por su tipo seguido de un identificador, para
el caso de que sean varios parámetros se debe utilizar comas para separar cada
parámetro y en el caso de que no se usen parámetros no se deberá incluir nada dentro de
los paréntesis. Luego de definir el método y sus parámetros se declara el cuerpo del
método, el cual es un conjunto de instrucciones delimitadas por llaves {}.
void holamundo(){
print(“Hola mundo”);
}
4.21 Llamadas
La llamada a una función específica la relación entre los parámetros reales y los
formales y ejecuta la función. Los parámetros se asocian normalmente por posición,
aunque, opcionalmente, también se pueden asociar por nombre. Si la función tiene
parámetros formales por omisión, no es necesario asociarles un parámetro real.
Print(“Ejemplo de llamada a
método”); holamundo(); /* Salida
esperada
Ejemplo de llamada a método
Hola Mundo
*/
//Ejemplo de llamada de una función
OBSERVACIONES:
• Al momento de ejecutar cualquier llamada, no se diferenciarán entre métodos y
funciones, por lo tanto, podrá venir una función que retorne un valor como un
método, pero la expresión retornada no se asignará a ninguna variable.
• Se podrán llamar métodos y funciones antes que se encuentren declaradas, para
ello se recomienda realizar 2 pasadas del AST generado: La primera para
almacenar todas las funciones, y la segunda para las variables globales y la
función exec (4.25).
• Para la llamada a métodos como una instrucción se deberá de agregar el punto y
coma (;) como una instrucción.
//Ejemplo
list<int> lista2 =new list<int>; string[
] vector2 = {"hola", "Mundo"};
int tam_lista = length(lista2); // tam_lista = 0
4.24.2 Truncate
Esta función recibe como parámetro un valor numérico. Permite eliminar los decimales de
un número, retornando un entero.
// Ejemplo
4.24.3 Round
Esta función recibe como parámetro un valor numérico. Permite redondear los números
decimales según las siguientes reglas:
Si el decimal es mayor o igual que 0.5, se aproxima al número superior
Si el decimal es menor que 0.5, se aproxima al número inferior
‘round’ ‘(’ <VALOR>‘)’ ‘;’
// Ejemplo
4.24.4 Typeof
Esta función retorna una cadena con el nombre del tipo de dato evaluado.
//Ejemplo
4.24.5 To String
Esta función permite convertir un valor de tipo numérico o booleano en texto.
//Ejemplo
4.24.6 toCharArray
Esta función permite convertir una cadena en una lista de caracteres.
‘toCharArray’ ‘(’ <VALOR> ‘)’ ‘;’
//Ejemplo
4.25 Main
Para poder ejecutar todo el código generado dentro del lenguaje, se utilizará la
sentencia MAIN para indicar que método o función es la que iniciará con la lógica del
programa.
Observaciones:
• Puede venir solo una vez, si viene mas de una vez deberá lanzar error y no podrá
ejecutar ninguna instrucción.
main funcion1();
/*RESULTADO
hola
*/
//Ejemplo 2
void funcion2(string mensaje){
print(mensaje);
}
6. Requerimientos Mínimos
Para que el estudiante tenga derecho a calificación, deberá cumplir con lo siguiente:
Por último, se deberá entregar un documento explicando la gramática utilizada, esto con
el fin de verificar que el estudiante trabajó de forma individual.
Este documento debe contener las especificaciones de un lenguaje formal, tales
como:
- Expresiones regulares
- Terminales
- No terminales
- Inicio de la gramática
- Descripción de las producciones
7. Entregables
• Código Fuente del proyecto.
• Manuales de Usuario.
• Manual Técnico.
• Archivo de Gramática para la solución (El archivo debe de ser limpio, entendible y no
debe ser una copia del archivo de jison).
• Link al repositorio privado de Github en donde se encuentra su proyecto (Se debe de
agregar como colaborador al auxiliar que le califique).
8. Restricciones
1. Lenguajes de programación a usar: Javascript/Typescript.
2. Puede utilizar frameworks como Angular, React, Vuejs, etc para generar su
entorno gráfico. Queda a discreción del estudiante.
3. Puede utilizar herramientas como Nodejs para Javascript.
4. Herramientas de análisis léxico y sintáctico: Jison
5. El Proyecto es Individual.
6. Para graficar se puede utilizar cualquier librería (Se recomienda Graphviz)
7. Copias completas/parciales de: código, gramáticas, etc. serán merecedoras
de una nota de 0 puntos, los responsables serán reportados al catedrático de
la sección y a la Escuela de Ciencias y Sistemas.
8. La calificación tendrá una duración de 30 minutos, acorde al programa del
laboratorio.
9. Fecha de Entrega
Viernes 28 de abril de 2023.
La entrega será por medio de la plataforma UEDI