Enunciado Proyecto 2 - Compi 1 - Semestre - 1 PDF
Enunciado Proyecto 2 - Compi 1 - Semestre - 1 PDF
Enunciado Proyecto 2 - Compi 1 - Semestre - 1 PDF
OLC1 Interpreter
Segundo Proyecto de laboratorio
1. OBJETIVOS
1.1 Objetivo General
Aplicar los conocimientos del curso de Organización de Lenguajes y Compiladores 1 en
la creación de soluciones de software.
3. ENTORNO DE TRABAJO
El entorno de trabajo estará compuesto por un editor y un área de consola y será el principal
medio de comunicación entre la aplicación y usuario. En el editor se ingresará el código
fuente, y en el área de consola, se mostrará el resultado de la ejecución del código fuente.
3.1.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 y columna actual. El editor
deberá contar con lo siguiente:
3.1.1 Funcionalidades
• Crear: El editor deberá ser capaz de crear archivos en blanco.
• Abrir archivos: El editor deberá abrir archivos en formato .fi
• Guardar el archivo: El editor deberá guardar el estado del archivo en el que se estará
trabajando.
• Guardar el archivo como: el editor deberá guardar el archivo en el que se estará
trabajando con la extensión y ruta que el usuario desee.
• Eliminar pestaña: permitirá cerrar la pestaña actual.
3.1.2 Herramientas
Compilar: Invocará al intérprete.
Iniciar conexión: Servirá como interruptor para iniciar la conexión con el servidor.
3.1.3 Reportes
Reporte de errores: La aplicación deberá poder generar reporte de errores, será
una herramienta que permitirá la identificación de los errores léxicos, sintácticos y
semánticos, en el momento de interpretar el lenguaje de alto nivel. Estos errores
deben ser almacenados en un archivo en formato HTML con estilos CSS.
Generar AST: se debe de generar una imagen con el AST que se genera después
del análisis sintáctico.
4.6.2 Resta
Operación aritmética que consiste en quitar una cantidad (sustraendo) de otra
(minuendo) para averiguar la diferencia entre las dos. El operador de la resta es el
signo menos –
Especificaciones sobre la resta:
Al restar dos datos numéricos (int, double) el resultado será numérico.
En las operaciones entre número y carácter, se deberá convertir el carácter a código
ASCII.
No es posible restar datos numéricos con tipos de datos carácter (string)
No es posible restar tipos de datos lógicos (bool) entre sí.
Todas las demás especificaciones se encuentran en la siguiente tabla.
- int String Double Char Bool
int Int Error Double Int Int
String Error Error Error Error Error
Double Double Error Double Double Double
Char Int Error Double Int Error
Bool int Error Double Error Error
Cualquier otra combinación es inválida y deberá arrojar un error de semántica.
4.6.3 Multiplicación
Operación aritmética que consiste en sumar un número (multiplicando) tantas veces
como indica otro número (multiplicador). Multiplicación es el asterisco *. Las operaciones
se podrán realizar solo entre valores o variables del mismo tipo en base a la siguiente
tabla cualquier otra combinación es inválida y deberá arrojar un error de semántica.
4.6.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 /
Especificaciones sobre la división:
Al dividir dos datos numéricos (int, double) el resultado será numérico.
No es posible dividir datos numéricos con tipos de datos de tipo carácter (string)
No es posible dividir tipos de datos lógicos (bool) entre sí.
Al dividir un dato numérico entre 0 deberá arrojarse un error de ejecución.
Todas las demás especificaciones se encuentran en la siguiente tabla.
/ int String Double Char Bool
int Double Error Double Double Int
String Error Error Error Error Error
Double Double Error Double Double Double
Char Double Error Double Double Int
Bool Double Error Double Double Error
Cualquier otra combinación es inválida y deberá arrojar un error de semántica.
4.6.5 Potencia
Operación aritmética que consiste en multiplicar varias veces un mismo factor. El
operador de la potencia es el acento circunflejo ^
Especificaciones sobre la potencia:
Al potenciar dos datos numéricos (int, double) el resultado será numérico.
En las operaciones entre número y carácter, se deberá convertir el carácter a código
ASCII.
No es posible potenciar tipos de datos lógicos (bool) entre sí.
* int String Double Char Bool
int Int Error Double Int Int
String Error Error Error Error Error
Double Double Error Double Double Double
Char Int Error Double Int Int
Bool int Error Double Int Bool
Cualquier otra combinación es inválida y deberá arrojar un error de semántica.
4.6.6 Precedencia de análisis y operación de las expresiones lógicas y aritméticas:
Nivel Operador
0 ^
1 /, *
2 +, -
3 ==, !=, <, <=, >, >=
4 !
5 &&
6 ||
Para las variables declaradas en un mismo lugar separadas por coma y que se les
asigna un valor, a todas se les asigna el mismo valor. Ejemplo:
double contador, contador2 =30.55;
bool f2, f1=true ;
string palabra2, palabra3 = “esto es un ejemplo :D ”+‟v‟;
bool bandera2,bandera3=getFlag();
bool flag2, flag3=!false;
bool flag4 = flag2 ;
char letra = ’A’ ;
bool estado = verdadero && falso;
int contador = 0 * 9 – getValor() + 2;
double nota = getNota();
4.7.2 Asignación
Esta instrucción nos permite asignarle un valor a una variable ya existente. Debe verificarse
que el valor a asignar sea del mismo tipo con el que la variable se ha asignado y que la
variable esté ya declarada.
Ejemplo:
4.7.3 Aumento
Operación aritmética que consiste en añadir una unidad a un dato numérico. El aumento es
una operación de un solo operando. El aumento sólo podrá venir del lado derecho de un dato.
El operador del aumento es el doble signo más ++.
Especificaciones sobre el aumento:
• Al aumentar un tipo de dato numérico (int, double, char) el resultado será numérico.
• No es posible aumentar el tipo de dato string.
• No es posible aumentar tipos de datos lógicos (boolean).
• El aumento podrá realizarse sobre números o sobre identificadores de tipo numérico.
Operando Tipo de dato resultante Ejemplos
double++ double 4.56++ = 5.56
int++ Int 15++ = 16
char++ ‘a’++ = 98 = ‘b’
4.7.4 Decremento
Operación aritmética que consiste en quitar una unidad a un dato numérico. El decremento
es una operación de un solo operando. El decremento sólo podrá venir del lado derecho
de un dato. El operador del decremento es el doble signo menos -
Especificaciones sobre el decremento:
Al decrementar un tipo de dato numérico (int, double, carácter) el resultado será
numérico.
No es posible decrementar tipos de datos cadena.
No es posible decrementar tipos de datos lógicos (boolean).
El decremento podrá realizarse sobre números o sobre identificadores de tipo
numérico.
Operandos Tipo de dato resultante Ejemplos
double-- double 4.56-- = 3.56
int-- Int 15-- = 14
char-- ‘b’-- = 97 = ‘a’
Nota: Lo que está encerrado entre corchetes es opcional, y lo que está dentro de los tags
es arbitrario.
Las dimensiones serán limitadas a un máximo de 3 dimensiones, esto con el fin de poder
facilitar la programación.
Estructura:
[<expresión>][<expresión>]......[<expresión>]
Ejemplo:
int array arr0 [1+2] = {5, 10, 15}; //En este caso arr0 tiene en la primera posición
5,10 en la segunda y 15 en la tercera. Es un arreglo con 3 posiciones.
Ejemplo:
Print(suma1 + suma2);
Int acceso1 = 1;
Print (2+arr1[ acceso1*2 ] );
Print (c2.retornarsuma(3*6+7, 4));
}
privado funcionSuma double(double d1, double d2){
return d1 + d2;
}
}
clase Clase2{
int variable;
publico retornarSUma(double num1, double num2){
RETURN num1 + num2;
}
}
Ejemplo:
Clase1 c1 = new Clase1();
Clase1 c2;
4.8.3 Acceso a variables, funciones y métodos de una clase
Para acceder a una variable se usará el nombre de la clase, un punto y después el nombre
de la variable, función o método que se quiere acceder.
<Nombre Clase> . <ID>
<Nombre Clase> . <ID> ( )
<Nombre Clase> . <ID> ( <L PARAMETROS>)
Ejemplo:
Int numero1 = c1.num1;
Int num2 = c1.funcion1(2*var1, 4.5*var3, 45);
Clase2 c2 = c1.funcionRetornarClase();
String cad1 = c2.concatenar(“hola”, “mundo”);
String array arreglo1[2] = funcionRetornarArreglo();
C2.metodoPrintEnConsola();
Ejemplo:
4.8.6.1. Publico
Este tipo de visibilidad es el más restrictivo de todos. Cualquier componente
perteneciente a un objeto privado solo podrá ser accedido por ese mismo objeto y
nada más
clase Clase2 importar clase1, clase2, clase3{
Privado int entero2;
Privado funcion1 int (int var1, int var2){
Return var1 + var2;
}
}
Ejemplo:
Publico Inicio void (int n, string m)
{
repetir(n)
{
print(m);
}
}
Return EXPL;
Ejemplo:
Return 10 + id;
Return count();
Return flag && flag2;
4.8.10 Funciones con retorno
Una función con retorno es un bloque de instrucciones encapsuladas bajo un id que pueden
o no recibir parámetros para su ejecución. Al terminar su ejecución, este deberá de retornar
un valor del tipo del cual se haya declarado utilizando la sentencia RETURN.
La función puede retornar los siguientes tipos:
Int, double, bool, char, string, ARREGLOS, OBJETOS
La sintaxis para la declaración de una función es la siguiente.
IniciarMensajes();
funcionSuma(2, var2+5*4)
int var1 = 3;
int array arreglo1[var1] = {1, 2, 3};
funcion1(arreglo1)
print(“Hola mundo”);
show(“Bienvenido”, “Calificación compiladores 1”);
Cabe resaltar que, en cuanto a las funciones con retorno, se deberá asignar su valor de
retorno, es decir, se invocarán como parte de EXPL para la asignación o declaración de una
variable. Se debe agregar el no terminal CALL (recomendación de nombre) como una
producción del no terminal EXPA (expresiones aritméticas).
Esta función será llamada a través de la palabra reservada “print” y contará con un único
parámetro que puede ser de cualquier tipo y cualquier tipo de operación. Se agregará el
texto resultante a la consola de salida. Tendrá la siguiente sintaxis:
print ( EXPL) ;
Ejemplo:
print (verdadero);
print (“Resultado “ + resultado());
print (“Resultado “ + verdadero);
show(titulo(), “Saludo”);
show(“Resultado”, “Mi nota es : “ + getNota());
Ejemplo:
Ejemplo
Repeat(5*2)
{ print(“Iteracion #”+contador);
contador++;
}
While (true) {
Print(“ciclo…”);
}
NOTA IMPORTANTE: Aquí se introduce una nueva palabra reservada, “salir”, por medio
de la cual se podrá salir de cualquier ciclo o sentencia de control sin ejecutar el código que
se encuentre por debajo de esta palabra.
comprobar(var1) {
caso valor1:
String cad = “ ”;
Salir;
caso valor 2:
Print(“Valor 2”);
salir;
caso valor 3:
Print(“valor 3”);
salir;
defecto:
Print(“Defecto”);
}
4.11.6 Hacer-Mientras
Este ciclo ejecutará al menos 1 vez su contenido, luego comprobará la condición para
determinar si debe o no ejecutarse nuevamente. La estructura de un ciclo “Hacer-Mientras”
es la siguiente:
Hacer{
// Sentencia 1;
// Sentencia 2;
// Sentencia 3;
…
// Sentencia n;
} mientras(condición);
Ejemplo:
Hacer{
// Sentencia 1;
// Sentencia 2;
// Sentencia 3;
…
// Sentencia n;
} mientras ((1+2)<=(a+b+c)&&(a==b)) ;
Hacer{
// Sentencia 1;
// Sentencia 2;
Continuar;
// Sentencia 3;
}mientras((1+2)<=(a+b+c)&&(a==b));
Se ejecutarían las sentencias 1 y 2 y se obviaría la sentencia 3, para todas las iteraciones del
ciclo.
Nota: Para el uso de las sentencias salir o continuar se debe verificar el ambiente, si el
ambiente no es el correcto deberá marcar error.
4.12 Otras Funciones Nativas del lenguaje
Las funciones nativas del lenguaje se podrán llamar desde cualquier parte de código, es
decir, dentro de funciones, ciclos, etc.
Sintaxis:
addFigure( circle(EColor, ERadius, ESolid, EPosX, EPosy));
Ejemplo:
Boolean flag = 10<2;
Int varx = 10;
Int vary = 20;
addFigure( circle(“red”, 10+20+3, flag, varX, varY));
Sintaxis:
addFigure( square(EColor, ESolid, EX, EY, EWeigth, Eheight));
Ejemplo:
Esta función generará una imagen en donde se encuentren todas las figuras agregadas al
búfer. Además, limpiará el búfer.
Sintaxis
Figure (EXPL);
Figure (“Flor “ + “de” + “ loto”);
6. Requisitos mínimos
Los requerimientos mínimos son funcionalidades que garantizan una ejecución básica del
sistema, para tener derecho de calificación se debe de cumplir con los siguientes
requerimientos:
Entorno de trabajo
o Crear archivos
o Abrir archivos
o Ejecutar
o Reporte de errores
Funcionalidades OLC
o Clases
o Extensión
o Manejo de Procedimientos y Funciones
o Funciones nativas
o Declaración y Asignación de variables
o Operadores Aritméticos, Relacionales y Lógicos
o Ciclos y Bifurcaciones
Si/Sino
Para
Mientras
Método Principal
Sentencia de “retorno” (todos los tipos de datos y arreglos)
Sentencia salir
o Arreglos
7. Entregables
● Aplicación funcional.
● Código fuente.
● Gramática escrita en Irony