- Proyecto final - Diseño de compiladores
- Febrero - Junio 2021
- Equipo Obj 12
Para iniciar un programa en πler, se necesita declarar la palabra ‘program’ seguida de su nombre y terminación en punto y coma.
programa nombrePrograma;
Estas deben de ser declaradas en 3 lugares importantes:
- Después de la línea de inicio de cada programa
- Después de la declaración de una función o main (SIEMPRE al inicio del bloque)
- En clases, después de la palabra clave de att:
La sintaxis está compuesta de la palabra clave var seguida del tipo y ID de la variable y finalizada con punto y coma. Ejemplo:
var int nombreVariable;
Para arreglos y matrices, se declara el tipo en plural con sus respectivas dimensiones declaradas. Ejemplo:
Arreglos: var ints nombreArr[5] = {1,2,3,4,5}
Matrices: var ints nombreMat[2][2] = {{0,0},{0,0}}
Los tipos de datos pueden ser:
int, flt, boo, cha y str
(con sus plurales)
Un programa siempre debe de tener una función main. Esta se declara con la siguiente sintaxis:
int main () {
/* Aqui va el cuerpo de la función */
}
Con una función main puede funcionar el código, sin embargo, si se desean agregar más funciones, serían antes de la función main.
La declaración de las funciones es únicamente de tipos simples (es decir, sin arreglos ni matrices) o de tipo void.
Las funciones de tipo simple deben de tener su respectivo valor de retorno al igual que su declaración.
func int nombreFunc (int param1, flt param2) {
/* Aqui va el cuerpo de la función */
return valorInt
}
Las funciones de tipo void no pueden tener valor de retorno, de lo contrario habría un error.
func void nombreFunc (int param1, flt param2) {
/* Aqui va el cuerpo de la función */
}
Operadores binarios aritméticos: +, -, *, /
Operadores binarios booleanos: >, >=, <, <=, ==, !=
nombreVariable = expresion
Las condicionales pueden tener un flujo alterno o no, un ejemplo de implementación es el de un solo if.
if (expresionBooleana) then {
/* Aqui va el cuerpo de la condicional */
}; /* No olvidar este punto y coma*/
Si se desea un flujo alterno, simplemente agregar antes del punto y coma lo siguiente:
else {
/* Aqui va el cuerpo de la condicional */
}; /* Mover aqui el punto y coma */
Si se desea tener una condicional de flujo alterno en una sola línea, se pueden usar expresiones ternarias.
expresionBooleana ? opcion1 : opcion2 ;
👀 OJO : a las expresiones ternarias no se les pueden poner valores de retorno ni ciclos anidados, simplemente estatutos de una línea.
Para leer:
read(variable)
Para escribir:
print(expresion)
Existen dos tipos, el while y el do-while. Se componen de la siguiente sintaxis
while (expresionbooleana) then {
/* Aqui va el cuerpo del ciclo */
};
do {
/* Aqui va el cuerpo del ciclo */
} while (expresionbooleana);
Llamarla por su identificador. En caso de ser arreglo o matriz, por su identificador seguido del índice deseado.
nombreVariable /* llamada a tipo simple */
nombreMatriz[2][3] /* llamada a tipo multiple */
Cuando una función es llamada, se deberá de poner su declaración con sus parámetros encasillada entre {} corchetes. Ejemplo:
{nombreFuncion(param1, param2)}
Hay excepciones a esta regla. Si la llamada será lo ÚNICO que hay en la línea, entonces no necesitaría estos corchetes. De lo contrario, si es parte de alguna expresión o asignación, sí debe usarlos.
Ejemplos de código
nombreFuncion(param1) /* llamada simple */
a = {nombreFuncion(param1)} * a /* llamada con expresiones */
Ya que Piler es un lenguaje orientado a objetos, se pueden declarar clases con la siguiente sintaxis.
class nombreClase: {
att:
/* aqui se declaran las variables de la clase */
met:
/* aqui se declaran las funciones de la clase */
};
Las clases son super secretas pero afortunadamente tienen una contraseña sencilla: cada que se quiera acceder a algo dentro de esa clase (incluso estando en la misma clase), se necesita llamar por su clase primero.
nombreClase.variableDeClase /* a atributos */
nombreClase.funcionDeClase(params) /* a métodos */
program aritmetica;
var int a, b;
int main() {
a = 8 * (7 - 4) + 5
b = 9
if (a == 2) then {
print(2+2, a)
} else {
print(b)
};
print(a)
}
To start a program in πler, you need to declare the word 'program' followed by its name and ending in a semicolon.
program programName;
These must be declared in 3 important places:
- After the start line of each program
- After the declaration of a function or main (ALWAYS at the beginning of the block)
- In classes, after the att keyword:
The syntax is composed of the keyword var followed by the type and ID of the variable and ended with a semicolon. Example:
var int variableName;
For arrays and arrays, the type is declared in plural with its respective declared dimensions. Example:
Arrays: var ints arrName[5] = {1,2,3,4,5}
Matrices: var ints matName[2][2] = {{0,0},{0,0}}
Data types can be:
int, flt, boo, cha y str
(with their plurals)
A program must always have a main function. This is declared with the following syntax:
int main () {
/* Body of the function goes here */
}
With a main function the code can work, however, if you want to add more functions, they would be before the main function.
The declaration of functions is only of simple types (that is, no arrays or matrices) or of type void.
Simple type functions must have their respective return value as well as their declaration.
func int funcName(int param1, flt param2) {
/* Body of the function goes here */
return intValue
}
Functions of type void cannot have a return value, otherwise there would be an error.
func void funcname (int param1, flt param2) {
/* Body of the function goes here */
}
Arithmetic binary operators: +, -, *, /
Boolean binary operators: >,> =, <, <=, ==,! =
variableName = expression
Conditionals may also have an alternative flow, an example of an implementation is that of a single if.
if (booleanExpression) then {
/* Body of the conditional goes here */
}; /* Don't forget this semicolon */
If an alternate flow is desired, simply add the following before the semicolon:
else {
/* Body of the conditional goes here */
}; /* Move the semicolon here */
If you want to have an alternating flow conditional on a single line, you can use ternary expressions.
Boolean expression? option1: option2;
👀 WARNING: you cannot put return values or nested loops to ternary expressions, just one line statutes.
To read:
read (variable)
To write:
print (expression)
There are two types, the while and the do-while. They consist of the following syntax
while (booleanExpression) then {
/* Body of the loop goes here */
};
do {
/* Body of the loop goes here */
} while (booleanExpression);
Call it by its identifier. In case of being an array or matrix, by its identifier followed by the desired index.
variableName /* simple type call */
arrayName [2][3] /* call to multiple type */
When a function is called, its declaration with its parameters must be enclosed in {} brackets. Example:
{FunctionName (param1, param2)}
There are exceptions to this rule. If the call will be the ONLY thing on the line, then you would not need these brackets. Otherwise, if it's part of some expression or assignment, you must use them.
Code examples
functionName (param1) /* simple call */
a = {functionName(param1)} * a /* called with expressions */
Since Piler is an object-oriented language, classes can be declared with the following syntax.
class className: {
att:
/* here the class variables are declared */
met:
/* here the functions of the class are declared */
};
The classes are super secret but fortunately they have a simple password: every time you want to access something inside that class (even being in the same class), you need to call by its class first.
classname.classVariable /* for attributes */
className.classFunction(params) /* for methods */
program arithmetic;
var int a, b;
int main() {
a = 8 * (7 - 4) + 5
b = 9
if (a == 2) then {
print(2+2, a)
} else {
print(b)
};
print(a)
}
Para instalar este lenguaje es necesario tener Python3 instalado. Esto se puede verificar con el comando python3
en la terminal.
Para instalar Piler, se debe correr el siguiente comando:
git clone https://github.com/paulinagzd/piler.git
Con este paso listo, se puede correr:
python3 piler.py
Esto dará acceso a ingresar el nombre de cualquiera de los archivos de prueba (los de la extensión .pi) para poder usar Piler.
Paulina González Dávalos | Luis Felipe Miranda Icazbalceta |
---|---|
A01194111 | A00820799 |