Olc2 P1 1S2020
Olc2 P1 1S2020
Olc2 P1 1S2020
Facultad de Ingeniería
Escuela de Ingeniería en Ciencias y Sistemas
Organización de Lenguajes y Compiladores 2
Primer semestre 2020
Catedráticos: Ing. Bayron López, Ing. Edgar Saban, Ing. Erick Navarro e Ing. Luis Espino
Tutores académicos: Luis Lizama, Pavel Vásquez, Rainman Sian, Juan Carlos Maeda
Arit Software
Contenido
1 Competencias .......................................................................................................... 3
1.1 Competencia general .................................................................................... 3
1.2 Competencias específicas ............................................................................ 3
2 Descripción .............................................................................................................. 3
2.1 Componentes de la aplicación ...................................................................... 3
2.2 Flujo del proyecto .......................................................................................... 4
2.3 Notación utilizada para la definición de los lenguajes ................................... 5
3 Generalidades del lenguaje Arit ............................................................................... 6
3.1 Identificadores ............................................................................................... 6
3.2 Case insensitive ............................................................................................ 7
3.3 Comentarios.................................................................................................. 7
3.4 Valor nulo ...................................................................................................... 7
3.5 Tipos de dato ................................................................................................ 7
3.6 Tipos primitivos ............................................................................................. 7
3.7 Tipos compuestos ......................................................................................... 8
3.8 Secuencias de escape .................................................................................. 8
4 Sintaxis del lenguaje Arit .......................................................................................... 8
4.1 Bloques de sentencias .................................................................................. 8
4.2 Signos de agrupación ................................................................................... 9
4.3 Variables ....................................................................................................... 9
4.4 Operadores Aritméticos .............................................................................. 10
4.5 Operadores de comparación ....................................................................... 12
4.6 Operadores lógicos ..................................................................................... 13
4.7 Operador ternario ........................................................................................ 13
4.8 Sentencias de control de flujo ..................................................................... 14
4.9 Sentencias de transferencia........................................................................ 17
4.10 Funciones ................................................................................................... 18
4.11 Mean, Median and Mode ............................................................................ 26
5 Estructuras de datos .............................................................................................. 26
5.1 Vectores ...................................................................................................... 26
5.2 Creación de vectores .................................................................................. 26
5.3 Listas........................................................................................................... 30
5.4 Matrices ...................................................................................................... 33
5.5 Arreglos....................................................................................................... 40
6 Graficas en lenguaje Arit ........................................................................................ 43
6.1 Graficas de Pie ........................................................................................... 43
6.2 Graficas de Barras ...................................................................................... 43
6.3 Gráficos de línea ......................................................................................... 44
6.4 Histogramas ................................................................................................ 45
6.5 Diagrama de dispersión .............................................................................. 46
7 Reportes Generales ............................................................................................... 47
7.1 Reporte de errores ...................................................................................... 47
7.2 Reporte de tabla de símbolos ..................................................................... 48
7.3 Reporte de AST .......................................................................................... 48
8 Gramáticas............................................................................................................. 49
9 Apéndice A: Precedencia y asociatividad de operadores ...................................... 49
10 Entregables y Restricciones ................................................................................ 50
10.1 Entregables ................................................................................................. 50
10.2 Restricciones .............................................................................................. 50
10.3 Consideraciones ......................................................................................... 50
10.4 Entrega del proyecto ................................................................................... 50
1 Competencias
1.1 Competencia general
Que el estudiante realice la fase de análisis de un compilador para un lenguaje de programación de alto
nivel utilizando herramientas.
2 Descripción
Arit Software es un entorno y lenguaje de programación con un enfoque en el análisis estadístico, el cual
está formado por un conjunto de herramientas muy flexibles que pueden ampliarse fácilmente
mediante paquetes, librerías o definiendo nuestras propias funciones. Este software también cuenta con
un entorno de desarrollo integrado (IDE) que proporciona servicios integrales para facilitarle al
programador el desarrollo de aplicaciones.
2.1.1 AritIDE
AritIDE es un entorno de desarrollo que provee las herramientas para la escritura de programas en
lenguaje ARIT. Este IDE nos da la posibilidad de visualizar tanto la salida en consola de la ejecución del
archivo fuente como los diversos reportes de la aplicación que se explican a más adelante.
2.1.1.1 Características básicas
Son las funcionalidades que un entorno de desarrollo integrado debe de tener:
• Múltiples pestañas
• Abrir, guardar y guardar como
• Numero de línea y columna del cursor
• Botón para ejecutar archivo
• Reporte de errores
• Reporte de tabla de símbolos
• Reporte de AST
• Mostrar graficas
2.1.1.2 Consola
La consola es un área especial dentro del IDE que permite visualizar las notificaciones, errores,
advertencias e impresiones que se produjeron durante el proceso de análisis de un archivo de entrada.
Color Token
Azul Palabras reservadas
Naranja Cadenas
Morado Números
Gris Comentarios
Negro Otro
2.3.3 Expresiones
Cuando se haga referencia a una ‘expresión’, se hará referencia a cualquier sentencia que devuelve un
valor. Por ejemplo:
Cuantificador Descripción
+ Indica que el carácter que le
precede debe aparecer al menos
una vez.
* Indica que el carácter que le
precede puede aparecer cero,
una, o más veces.
? Indica que el carácter que le
precede puede aparecer cero o
una vez.
3.1 Identificadores
Un identificador será utilizado para dar un nombre a variables y métodos. Un identificador de arit está
compuesto básicamente por una combinación de letras, dígitos, punto o guion bajo.
IdValido
.id.Valido
id_valido5
_idNoValido
.5ID
TRUE
Tot@l
1d
Consideraciones
• El identificador debe iniciar con una letra o punto.
• Si inicia con un punto el siguiente carácter no debe ser un número.
3.3 Comentarios
Un comentario es un componente léxico del lenguaje que no es tomado en cuenta para el análisis
sintáctico de la entrada.
• Los comentarios de una línea que serán delimitados al inicio con el símbolo de “#” y al final con
un carácter de finalización de línea.
• Los comentarios con múltiples líneas que empezarán con los símbolos “#*” y terminarán con los
símbolos “*#”.
#*
Comentario multilínea
*#
• Cualquier otro tipo de dato que no sea primitivo tomara el valor por defecto de null de ser
necesario.
• Por conveniencia y facilidad de desarrollo, el tipo string será tomado como un tipo primitivo.
• Vectores
• Listas
• Matrices
• Arreglos
Secuencia Descripción
\” Comilla doble
\\ Barra invertida
\n Salto de línea
\r Retorno de carro
\t Tabulación
{
# SENTENCIAS
}
4.2 Signos de agrupación
Para dar orden y jerarquía a ciertas operaciones aritméticas se utilizarán los signos de agrupación. Para
los signos de agrupación se utilizarán los paréntesis.
3 - (1 + 3) * 32 / 90 # 1.58
4.3 Variables
Una variable es un elemento de datos con nombre cuyo valor puede cambiar durante el curso de la
ejecución de un programa. Una variable cuenta con un nombre y un valor, los nombres de variables no
pueden coincidir con una palabra reservada.
El lenguaje arit maneja sus variables con los tipos de las estructuras, lo que significa que las variables
serán estructuras.
Por lo tanto, si declaramos una variable con un tipo primitivo, este se va a convertir en un vector de un
elemento, pero su tipo será el de los elementos que este contenga, o si declaramos una variable con una
expresión list, el tipo de la variable será list, y así con cada estructura.
Para poder utilizar una variable se tiene que definir previamente, la declaración nos permite crear una
variable y asignarle un valor.
Sintaxis
Ejemplo
# Declarando variables
Var1 = 5; # Esta variable pasa a ser un vector
# el tipo de la variable es integer
4.4.1 Suma
La operación suma se produce mediante la suma de número o strings concatenados.
4.4.2 Resta
La resta se produce cuando se sustraen el resultado de los operadores, produciendo su diferencia.
4.4.4 División
El operador división se produce el cociente de la operación donde el operando izquierdo es el dividendo
y el operando derecho es el divisor.
4.4.5 Potencia
El operador de exponenciación devuelve el resultado de elevar el primer operando al segundo operando
de potencia.
4.4.6 Modulo
El operador modulo devuelve el resto que queda cuando un operando se divide por un segundo
operando.
Consideraciones
4.5.2 Relacionales
• Mayor que: Devuelve true si el operando de la izquierda es mayor que el operando de la
derecha.
• Mayor o igual que: Devuelve true si el operando de la izquierda es mayor o igual que el
operando de la derecha.
• Menor que: Devuelve true si el operando de la izquierda es menor que el operando de la
derecha.
• Menor o igual que: Devuelve true si el operando de la izquierda es menor o igual que el
operando de la derecha.
A B A&B A|B !A
true true true true false
true false false true false
false true false true true
false false true false true
Consideraciones
Sintaxis
Ejemplo
Sintaxis
Ejemplo
If( 3 < 4) {
# Sentencias
} else if (2 < 5){
# Sentencias
} else {
# Sentencias
}
If(true){ # Sentencias }
Consideraciones
Si no se encuentra una cláusula de case coincidente, el programa busca la cláusula default opcional, y si
se encuentra, transfiere el control a ese bloque, ejecutando las declaraciones asociadas. Si no se
encuentra un default el programa continúa la ejecución en la instrucción siguiente al final del switch. Por
convención, el default es la última cláusula.
La declaración break es opcional y está asociada con cada etiqueta de case y asegura que el programa
salga del switch una vez que se ejecute la instrucción coincidente y continúe la ejecución en la
instrucción siguiente. Si se omite el break el programa continúa la ejecución en la siguiente instrucción
en la declaración de switch.
Sintaxis
switch (expresión) {
case expr1:
# Declaraciones ejecutadas cuando el resultado de expresión coincide con el expr1
break[;]?
case expr2:
# Declaraciones ejecutadas cuando el resultado de expresión coincide con el expr2
break [;]?
...
case exprN:
# Declaraciones ejecutadas cuando el resultado de expresión coincide con exprN
break [;]?
default:
# Declaraciones ejecutadas cuando ninguno de los valores coincide con el valor de la expresión
break [;]?
}
Ejemplo
switch (3*54) {
case 3:
# Sentencias
break;
case 5:
# Sentencias
break;
case 7:
# Sentencias
[break;]
default:
# Sentencias
break;
}
Consideraciones
Ejemplo
While(false){
Print(“Hola”)
}
Sintaxis
Ejemplo
Do{
Print(2);
}while(true);
Sintaxis
Ejemplo
for(i in 3){
print(i)
}
# Salida
#3
for(i in c(1,2,3,4,5,6)){
print(i)
}
# Salida
#1
#2
#3
#4
#5
#6
B = matrix(c(1,2),2,2,TRUE)
for(i in B){
print(i)
}
# Salida
#1
#1
#2
#2
4.9.1 Break
Termina el bucle actual, sentencia switch y transfiere el control del programa a la siguiente sentencia a
la sentencia de terminación de estos elementos.
Ejemplo
4.9.2 Continue
Termina la ejecución de las sentencias de la iteración actual del bucle actual y continua la ejecución del
bucle con la próxima iteración.
Ejemplo
4.9.3 Return
Finaliza la ejecución de la función y puede especificar un valor para ser devuelto a quien llama a la
función.
Ejemplo
4.10 Funciones
En términos generales, una función es un "subprograma" que puede ser llamado por código externo (o
interno en caso de recursión) a la función. Al igual que el programa en sí mismo, una función se
compone de una secuencia de declaraciones, que conforman el llamado cuerpo de la función. Se
pueden pasar valores a una función, y la función puede devolver un valor.
Para devolver un valor especifico, una función debe tener una sentencia return, que especifique el valor
a devolver.
Ejemplo
factorial = function(n){
if(n <= 0){
return(result = 1);
}
return(result = n*factorial(n-1));
}
Consideraciones
Ejemplo
# La función ahora posee un parámetro con un valor por defecto de 3, si en la llamada no agregamos
el valor del parámetro se tomará el valor de 3.
factorial = (n=3) => {
if(n <= 0){
return(result = 1);
}
return(result = n*factorial(n-1));
}
Además, para indicar que vamos a utilizar un parámetro por defecto, utilizaremos la palabra reservada
default.
Sintaxis
Identificador(<Lista_Expresiones>)[;]?
Ejemplo
• Se debe verificar que la cantidad de parámetros coincida con los de la función que se está
llamando.
Sintaxis
Print(<Expresion>)[;]?
Ejemplo
Vector1 = c(4,5,6)
Print(vector1)
# Salida: 4 5 6
Lista1 = list(c(1,5),2,3)
Print(lista1)
# Salida
# [[1]]
#15
# [[2]]
#2
# [[3]]
#3
Consideraciones
• El estudiante es libre de imprimir las estructuras con el formato que le parezca mejor, siempre y
cuando lo que se imprimió se comprenda de la mejor forma.
4.10.5 Función c
Esta función es de las funciones más importantes del lenguaje, ya que nos ayuda a concatenar
elementos de diferentes formas.
Sintaxis
C(<Lista_Expresiones>)
El valor de retorno de la función c estará dado por los elementos que este contenga, si son distintos
tipos de dato se deberán castear los elementos de la siguiente forma
Tipo Prioridad
List 4
String 3
Numeric 2
Integer 1
Siendo la más alta 4 y la menor 1
• Si existe una función c, con distintos tipos de elementos y algún elemento es una lista, el resto
de los elementos pasaran a ser parte de esa lista.
• Si existen varias listas, las listas se van a concatenar para formar una nueva lista.
• Si existen varios vectores, se formará un nuevo vector con los elementos de todos los vectores y
casteando a los tipos correspondientes.
• Si los elementos tienen distintos tipos de datos se deberá ver cuál es el que tiene más prioridad
y aplicar el tipo de casteo correspondiente.
Ejemplo
Lista1 = list(1,2,3)
Lista2 = c(“hola”,4, list(9,8));
Lista4 = c(list(c(1,2,3)),5)
# Lista4 se convierte en una lista
# contenido [(1,2,3), 5]
# Notar que la posición 1 de la lista es un vector
Sintaxis
Typeof(<expresion>)
Sintaxis
length(<Expresion>)
Ejemplo
Sintaxis
nCol(<Expresion>)
Ejemplo
• Si se manda como parámetro algo que no sea una matriz se deberá reportar el error.
Sintaxis
NRow(<Expresion>)
Ejemplo
• Si se manda como parámetro algo que no sea una matriz se deberá reportar el error.
Sintaxis
StringLength(<Expresion>)
Ejemplo
cant = StringLength(“Cadena”) # cant toma el valor de 6
Consideraciones
• Si se envía un vector string, se debe validar que solo contenga 1 elemento, caso contrario
reportar el error.
4.10.8.2 Remove
Recibe como parámetro dos cadenas. La primera indica la cadena que se quiere modificar y la segunda
indica que caracteres se quieren remover.
Sintaxis
remove(<Expresion>,<Expresion>)
Consideraciones
• Si se envían 2 vectores string, se debe validar que cada vector solo contenga 1 elemento, caso
contrario reportar el error.
Ejemplo
cad = remove (“Cadena”, “Cad”) # cad toma el valor de “ena”
cad = remove (“Cadena”, “cad”) # cad toma el valor de “Cadena”
4.10.8.3 ToLowerCase
Recibe como parámetro una cadena y devuelve una segunda cadena que contiene la palabra indicada en
el parámetro con todas sus letras minúsculas.
Sintaxis
toLowerCase (<Expresión>)
Ejemplo
cad = toLowerCase (“Cadena”) # cad toma el valor de “cadena”
Consideraciones
• Si se envían 1 vector string, se debe validar que solo contenga 1 elemento, caso contrario
reportar el error
4.10.8.4 ToUpperCase
Recibe como parámetro una cadena y devuelve una segunda cadena que contiene la palabra indicada en
el parámetro con todas sus letras mayúsculas.
Sintaxis
toUpperCase (<Expresión>)
Ejemplo
cad = toUpperCase (“Cadena”) # cad toma el valor de “CADENA”
Consideraciones
• Si se envían 1 vector string, se debe validar que solo contenga 1 elemento, caso contrario
reportar el error.
4.10.8.5 Trunk
Recibe como parámetro un valor con punto flotante y devuelve un entero sin los valores decimales.
Sintaxis
trunk (<Expresión>)
Ejemplo
val = trunk (5.8) #val toma el valor de 5
Consideraciones
• Si se envían 1 vector numeric, se debe validar que solo contenga 1 elemento, caso contrario
reportar el error.
4.10.8.6 Round
Recibe como parámetro un valor con punto flotante (real) y devuelve un entero redondeando el valor
decimal según las siguientes reglas:
Sintaxis
round (<Expresión>)
Ejemplo
val = round(5.8) #val tome el valor de 6
val = round(5.5) #val tome el valor de 6
val = round(5.4) #val tome el valor de 5
Consideraciones
• Si se envían 1 vector numeric, se debe validar que solo contenga 1 elemento, caso contrario
reportar el error.
4.11 Mean, Median and Mode
La media, mediana y moda son funciones estadísticas básicas para el procesamiento de datos. Estas
funciones se aplicarán como un conjunto de valores agrupados como un vector.
4.11.1 Sintaxis
La sintaxis para la creación de un diagrama de dispersión es la siguiente:
Vector = c(12,13,15,16,24,15,17,19,17,15)
Donde:
5 Estructuras de datos
Las estructuras de datos en el lenguaje arit son herramientas que nos permiten almacenar distintos
valores, las estructuras básicas que incluye el lenguaje son las siguientes: vectores, listas, matrices y
arreglos.
5.1 Vectores
Los vectores son la estructura más básica del lenguaje arit, los tipos de vectores que existen son con
base a los tipos primitivos del lenguaje.
Ejemplo
Consideraciones
• El tipo del vector estará dado por el tipo de los valores que este contenga.
• Únicamente se pueden crear vectores con tipos primitivos o concatenando otros vectores.
• Si se intenta crear un vector con distintos tipos de dato se debe hacer el casteo correspondiente
para que todos los elementos sean del mismo tipo, el casteo es el mismo que se explica en la
función c.
• Si se crea un vector con un valor NULL, el tipo de este será string.
# Acceso a un vector
<Identificador> ([ < Expresion > ] ) +
El valor de retorno del acceso a un vector, de igual manera será un vector, pero de tamaño 1 y con el
tipo correspondiente a su valor.
Ejemplo
# Declarando vectores
Perro = “Perro”
Gato = “Gato”
Animales = c(Perro, Gato) # Contenido del vector animales -> [“Perro”, “Gato”]
# Acceso vector
Aux = Animales[1] # Recordar que el índice inicia en 1, contenido del vector Aux -> [“Perro”]
• El índice de acceso debe ser un valor entre 1 a la cantidad de elementos del vector, si el índice
estuviera fuera de rango se deberá indicar error.
• Si se accesa un vector que tiene un valor de null, el tipo de valor que va a devolver será de tipo
string.
Ejemplo
# Creando un vector
Vector1 = "hola”; # Se crea un nuevo vector de tamaño 1
Consideraciones
• Se puede agregar o modificar un nuevo elemento en cualquier índice, incluso si este índice es
mayor al tamaño actual del vector.
• Si se agrega un nuevo valor en un índice mayor al tamaño del vector, las posiciones entre la
última posición del vector y el nuevo índice deben tomar el valor por defecto del tipo de vector
que se esté manejando.
• Si agregamos un nuevo valor al vector de un tipo distinto, se debe hacer el casteo
correspondiente explicado en la función c, para mantener el mismo tipo de elementos.
• Si se intenta agregar o modificar un valor utilizando acceso por índice con una expresión función
c, se debe verificar que la cantidad de parámetros sea 1, caso contrario reportar el error.
Ejemplos
# SUMA DE VECTORES
# Creando un nuevo vector
A = c(1, 2, 3, 4, 5)
B = c(5, -2, 1, 2, 8)
# RESTA DE VECTORES
# Creando un vector
A = c(1, 2, 3, 4, 5)
# Aplicando operación OR
B = A | true # nuevo contenido del vector B -> [true, true, true, true, true]
Consideraciones
5.3 Listas
La lista en el lenguaje arit a diferencia de los vectores pueden almacenar diferentes tipos de datos.
Ejemplo
Ejemplo
Lista4 = Lista3[5] # Nos devuelve una nueva lista, pero con un vector en su interior
# Contenido de list Lista4 = [(5,6)]
# Tipo de Lista4 -> list
Consideraciones
• El índice de acceso debe ser un valor entre 1 a la cantidad de elementos del vector, si el índice
estuviera fuera de rango se deberá indicar error.
Ejemplo
Consideraciones
• Si se agrega un nuevo valor en un índice mayor al tamaño de la lista, las posiciones entre la
última posición de la lista y el nuevo índice deben tomar el valor de NULL.
• Cuando se obtenga una posición de la lista cuyo valor sea NULL, el tipo de este a nivel de vector
será string.
5.4 Matrices
Las matrices en arit nos permiten almacenar solamente datos de tipo primitivo, la diferencia principal
entre el vector y la matriz es que esta última organiza sus elementos de forma bidimensional, la primera
dimensión indica fila y la segunda indica columna.
Sintaxis de creación
• Data: Puede ser una función c con tipos primitivos o vectores, un vector existente, o un valor de
tipo primitivo.
• nrow: Es una expresión que indica el número de filas de la matriz.
• ncol: Es una expresión que indica el número de columnas de la matriz.
Ejemplo
• Acceso utilizando ambos índices, [x, y] - esto retorna una posición en específico y será un vector
de 1 elemento.
• Acceso utilizando solo el índice de la fila, [x, ] (notar la coma en la sintaxis) - esto retorna un
vector con los elementos de la fila correspondiente.
• Acceso utilizando solo el índice de la columna, [, y] (notar la coma en la sintaxis) - esto retorna
un vector con los elementos de la columna correspondiente.
• Acceso a un elemento especifico, [z] - esto retorna un elemento en específico y será un vector
de 1 elemento.
Sintaxis de acceso
# Tipo 1
[<Expresión>, <Expresión>]
# Tipo 2
[<Expresión>, ]
# Tipo 3
[, <Expresión>]
# Tipo 4
[<Expresión>]
Ejemplo
# Acceso tipo4
B = A[5] # Contenido de B -> [“1”] ya que es acceso por columna
Consideraciones
• Los índices de acceso deben ser valores entre 1 a la cantidad de elementos de fila o columna
correspondiente, si alguno de los índices estuviera fuera de rango deberá indicar error.
• Si fuera un acceso de tipo 4, se debe verificar que el índice sea un valor de 1 a la cantidad de
posiciones de la matriz, si este estuviera fuera de rango deberá indicar error.
• Modificación utilizando ambos índices, [x, y] - esto reemplaza una posición en específico con el
valor deseado.
• Modificación utilizando solo el índice de la fila, [x, ] - esto reemplaza los elementos de la fila con
el o los valores deseados.
• Modificación utilizando solo el índice de la columna, [, y] - esto reemplaza los elementos de la
columna con el o los valores deseados.
• Modificación utilizando solo un índice, [z] - esto reemplaza una posición en específico con el
valor deseado.
# Tipo 1
[<Expresión>, <Expresión>] = <Expresion>
# Tipo 2
[<Expresión>, ] = <Expresion>
# Tipo 3
[, <Expresión>] = <Expresion>
# Tipo 4
[<Expresión>] = <Expresion>
Ejemplo
# Modificación tipo 1
A[3,3] = 8
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] "1" "4" "3" "2"
# [2,] "2" "1" "4" "3"
# [3,] "3" "2" "8" "4"
# Modificación tipo 2
A[2, ] = 9
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] "1" "4" "3" "2"
# [2,] "9" "9" "9" "9"
# [3,] "3" "2" "1" "4"
# Modificación tipo 2
A[2, ] = c(9)
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] "1" "4" "3" "2"
# [2,] "9" "9" "9" "9"
# [3,] "3" "2" "1" "4"
# Modificación tipo 3
A[ ,4] = 6
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] "1" "4" "3" "6"
# [2,] "2" "1" "4" "6"
# [3,] "3" "2" "1" "6"
# Modificación tipo 3
A[ ,4] = c(6,3,9,45) # Error
# Modificación tipo 3
A[ ,4] = c(6,7,8)
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] "1" "4" "3" "6"
# [2,] "2" "1" "4" "7"
# [3,] "3" "2" "1" "8"
# Modificación tipo 4
A[7] = 0
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] "1" "4" "0" "2"
# [2,] "2" "1" "4" "3"
# [3,] "3" "2" "1" "4"
Consideraciones
• Los índices de acceso deben ser valores entre 1 a la cantidad de elementos de fila o columna
correspondiente, si alguno de los índices estuviera fuera de rango deberá indicar error.
• Si fuera una modificación de tipo 4, se debe verificar que el índice sea un valor de 1 a la cantidad
de posiciones de la matriz, si este estuviera fuera de rango deberá indicar error.
• Si se va a utilizar una función C como expresión para una modificación de tipo 4, esta debe tener
solamente 1 elemento, caso contrario deberá reportar el error.
• Si se va a utilizar una función C como expresión para una modificación de tipo 2, esta puede
tener solamente 1 elemento o exactamente la misma cantidad de elementos que de columnas
de la matriz, caso contrario deberá reportar el error.
• Si se va a utilizar una función C como expresión para una modificación de tipo 3, esta puede
tener solamente 1 elemento o exactamente la misma cantidad de elementos que de filas de la
matriz, caso contrario deberá reportar el error.
• Si se va a utilizar la modificación tipo 2 o 3, con un solo valor, se debe reemplazar TODA la fila o
columna con este único valor.
• Si al reemplazar un valor y este es de tipo diferente al resto de valores de la matriz, se debe
hacer el casteo correspondiente explicado en la función c, para mantener el mismo tipo de
elementos.
Ejemplos
# Suma de matrices
# Creando una nueva matriz
A = matrix(c(1,2,3,4), 3, 4)
# Sumando matrices
A=A+A+A
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] 3 12 9 6
# [2,] 6 3 12 9
# [3,] 9 6 3 12
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] -1 5 3 1
# [2,] 1 -1 5 3
# [3,] 3 1 -1 5
# Operaciones de comparación entre matrices
A = matrix(c(1,2,3,4), 3, 4)
A=A+A<3
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] TRUE FALSE FALSE FALSE
# [2,] FALSE TRUE FALSE FALSE
# [3,] FALSE FALSE TRUE FALSE
# Contenido de la matriz A
# [,1] [,2] [,3] [,4]
# [1,] TRUE FALSE FALSE FALSE
# [2,] FALSE TRUE FALSE FALSE
# [3,] FALSE FALSE TRUE FALSE
Consideraciones
• Las operaciones entre matrices únicamente son válidas si ambas matrices tienen las mismas
dimensiones, sino se debe reportar el error.
• Si hay una operación entre una matriz y un primitivo numérico, este se debe tratar como un
escalar.
• Las operaciones tienen que realizarse celda contra celda como se puede apreciar en los
ejemplos.
5.5 Arreglos
Los arreglos en arit son estructuras que pueden almacenar múltiples dimensiones.
Sintaxis
Ejemplo
Consideraciones
• Si se utiliza una función c como expresión, se deben realizar los casteos correspondientes
explicados en la función c.
• El arreglo se llena por columnas.
• Los valores se irán a agregando hasta agotar las posiciones del arreglo, por lo tanto, si se
agregaron todos los valores y aún restan posiciones en el arreglo se agregarán los valores de
nuevo en las posiciones restantes, y si se agotaron las posiciones del arreglo y aún restan valores
ya no se seguirán agregando elementos.
• Los elementos del arreglo deben de ser del mismo tipo, por ejemplo, solo de tipo primitivo, o de
tipo list, etc.
Sintaxis
Identificador ( [<Expresion>] ) +
Ejemplo
# Declarando un arreglo
result = array(c(5, list(7,8,9,10,11,12)), c(2,3,2))
# Accediendo a un arreglo
Variable1 = result[2][3][1] # Tipo de la variable Variable1 = List
# Contenido de la variable Variable1 -> list(11)
Consideraciones
• Cuando se realice un acceso a un arreglo se debe validar que se esté accediendo a todas sus
dimensiones, caso contrario reportar el error.
• Todos los índices de acceso deben estar dentro del rango definido inicialmente caso contrario
reportar el error.
• El arreglo puede retornar distintos tipos de datos, ya sean vectores, list, etc...
Sintaxis
# Declarando un arreglo
result = array(c(5, list(7,8,9,10,11,12)), c(2,3,2)) # Arreglo de tipo de list
• Para modificar un arreglo se debe verificar que los índices de acceso estén dentro del rango
establecido, caso contrario reportar el error.
• Cuando se realice un acceso a un arreglo se debe validar que se esté accediendo a todas sus
dimensiones, caso contrario reportar el error.
6 Graficas en lenguaje Arit
Arit posee una amplia variedad de funciones que nos permiten realizar una gran cantidad de tablas y
graficas. Estas son:
6.1.1 Sintaxis
La sintaxis para la creación de una gráfica de Pie es la siguiente:
Donde:
• X: Es un vector que contiene los valores numéricos del grafico
• Labels: Un vector que contiene las descripciones de cada una de las secciones
• Main: Indica el título del grafico
Consideraciones
• La cantidad de valores en el vector “labels” debe ser el mismo que el vector “X”, de lo contrario
deberá reportarse un error y agregarle la etiqueta “Desconocido” + n a las secciones faltantes.
Donde:
• H: Es el vector o matriz que contiene los valores numéricos para la gráfica.
• Xlab: Es la etiqueta para el eje X.
• Ylab: Es la etiqueta para el eje Y.
• Main: Es el título de la gráfica.
• Names.arg: Es un vector que contiene los nombres para cada una de las barras de la gráfica.
Consideraciones
• La cantidad de valores en el vector “Names.arg” debe ser el mismo que el vector “X”, de lo
contrario deberá reportarse un error y agregarle la etiqueta “Desconocido”+ n a las barras
faltantes.
6.4 Histogramas
Un histograma representa las frecuencias de los valores de una variable agrupada en rangos. El
histograma es similar al grafico de barras, pero la diferencia es que agrupa los valores en rangos
continuos. Cada barra en el histograma representa la altura del número de valores presentes en ese
rango.
6.4.1 Sintaxis
La sintaxis para la creación de un histograma es la siguiente:
Donde:
• V: Es el vector o matriz que contiene los valores numéricos para la gráfica.
• Xlab: Es la etiqueta para el eje X.
• Main: Es el título de la gráfica.
• Xlim: Recibe un vector de dos elementos numéricos que especifica el mínimo y el máximo
permitido en el eje X.
• Ylim: Recibe un vector de dos elementos numéricos que especifica el mínimo y el máximo
permitido en el eje Y.
Consideraciones
• Si el valor mínimo es mayor que el valor máximo deberá reportarse un error y tomar el valor
mínimo como infinito negativo.
• Si el valor máximo es menor que el valor mínimo deberá reportarse un error y tomar el valor
máximo como infinito positivo.
• Si alguno de los valores del vector V no cumplen con los criterios de valor mínimo o máximo
para la gráfica, el punto se deberá descartar y no aparecerá en la gráfica, además de reportarse
como una advertencia.
6.5.1 Sintaxis
La sintaxis para la creación de un diagrama de dispersión es la siguiente:
Donde:
• MAT: Es la matriz de dos dimensiones que contiene el conjunto de valores x,y.
• Xlab: Es la etiqueta para el eje X.
• Ylab: Es la etiqueta para el eje Y.
• Main: Es el título de la gráfica.
• Xlim: Recibe un vector de dos elementos numéricos que especifica el mínimo y el máximo
permitido en el eje X.
• Ylim: Recibe un vector de dos elementos numéricos que especifica el mínimo y el máximo
permitido en el eje Y.
• Byrow: Es una expresión booleana que indica el orden de la matriz, si fuera verdadero, el eje X
corresponde al primer valor de la matriz, caso contrario corresponde al eje Y
Consideraciones
• Si el valor mínimo es mayor que el valor máximo deberá reportarse un error y tomar el valor
mínimo como infinito negativo.
• Si el valor máximo es menor que el valor mínimo deberá reportarse un error y tomar el valor
máximo como infinito positivo.
• Si alguno de los valores del vector V no cumplen con los criterios de valor mínimo o máximo
para la gráfica, el punto se deberá descartar y no aparecerá en la gráfica, además de reportarse
como una advertencia.
• La cantidad de valores en el vector “Y” debe ser el mismo que el vector “X”, de lo contrario
deberá reportarse un error y descartar los puntos que no coincidan.
7 Reportes Generales
Como se indicaba en la descripción del lenguaje, Arit software genera una serie de reportes sobre el
proceso de análisis de los archivos de entrada. Estos son:
• Errores léxicos.
• Errores sintácticos.
• Errores semánticos
Ejemplo
Variable + 10 = 20; #Se encuentra un error sintáctico, se descartar símbolos hasta el “;”
Print(“Hola mundo”); # Esta sentencia si se ejecuta.
a = 10/0 #Error semántico, la división por 0 no esta definida, se descarta la asignación completa
o Expresiones Regulares.
o Precedencia utilizada.
o Cantidad de símbolos terminales.
o Enumeración de los símbolos terminales.
o Cantidad de símbolos no terminales.
o Explicación de cada uno de los símbolos no terminales (cuál fue su uso dentro de la
gramática)
o Gramática funcional describiendo cada una de las acciones. (Definición dirigida por la
sintaxis o esquema de traducción)
10 Entregables y Restricciones
10.1 Entregables
Deberán entregarse todos los archivos necesarios para la ejecución de la aplicación, así como el
código fuente, la gramática y la documentación. La calificación del proyecto se realizará con los
archivos entregados en la fecha establecida. El usuario es completa y únicamente responsable de
verificar el contenido de los entregables. La calificación se realizará sobre archivos ejecutables. Se
proporcionarán archivos de entrada al momento de calificación.
● Código Fuente
● Aplicación funcional
● Gramáticas
● Manual técnico
● Manual de usuario
10.2 Restricciones
• El proyecto deberá realizarse como una aplicación de escritorio utilizando Java
• Se debe realizar 2 veces la gramática para el mismo lenguaje, pero utilizando diferentes
analizadores, además de agregar las acciones correspondientes a cada gramática para el
correcto funcionamiento de estas.
• Se debe realizar una gramática ascendente utilizando flex y cup.
• Se debe realizar una gramática descendente utilizando JavaCC.
• Copias de proyectos tendrán de manera automática una nota de 0 puntos y serán reportados a
la Escuela de Ciencias y Sistemas los involucrados.
10.3 Consideraciones
• Durante la calificación se realizarán preguntas sobre el código para verificar la autoría de este,
de no responder correctamente la mayoría de las preguntas se reportará la copia.