TeamPlusPlus es un lenguaje de programación imperativo procedural con componentes básicos para orientación a objetos.
Para compilar la gramática de este lenguaje, se necesita utilizar ANTLR. El lenguaje de implementación es Python 3.
El comando para realizar la compilación es:
antlr4 -Dlanguage=Python3 TeamPlusPlus.g4
El comando para compilar y correr un archivo es:
python TeamPlusPlus.py <archivo>.tpp
El lenguaje incluye múltiples flags, utilizadas principalmente para debugging:
- -d imprime todo el Directorio General y la Lista de Cuádruplos
- -c imprime solamente la Lista de Cuádruplos
- -f imprime solamente el Directorio General
- -o imprime la Pila de Operadores
- -v imprime la Pila de Operandos
Al correr un archivo, se pueden incluir una o varias de estas flags.
- Estatuto program
- Declaración de clases
- Declaración de variables
- Declaración de funciones o métodos
- Main
- Comentarios
Para marcar el principio del archivo, en el encabezado de todo programa se debe incluir un estatuto como el siguiente:
Ejemplo:
program archivo;
TeamPlusPlus soporta la definición de clases por parte del usuario. Cada clase que se define puede contener sus propios atributos y métodos, los cuales siguen las reglas de declaración de variables globales y funciones respectivamente.
Cada atributo y método debe definir su nivel de accesibilidad, ya sea público o privado.
Ejemplo:
class Person {
attributes
private int age;
methods
public func int getAge() {
return(age);
}
public func void setAge(int a) {
age = a;
}
};
class Student inherits Person {
attributes
private float grade;
methods
public func void setGrade(float g) {
grade = g;
}
public func float getGrade(){
return(grade);
}
};
Las declaraciones de variables pueden ser de tipos primitivos o estructurados y además de esto se pueden hacer asignaciones iniciales. Adicionalmente, el lenguaje tiene soporte para arreglos de una y dos dimensiones, pero estos no pueden tener valor inicial.
Ejemplo:
vars
int mat[3, 3];
float x = 3.14, y, z;
char a = 'a';
Person obj, people[5];
El usuario puede declarar sus propias funciones o módulos. Dado que no hay polimorfismo, las funciones deben tener nombres únicos dentro del mismo contexto. Solamente se pueden definir parámetros de tipos primitivos y el tipo de retorno debe ser void o primitivo. En el caso que no sea void, debe haber un estatuto return en el cuerpo de la función.
Ejemplo:
func int cyclicFactorial(int n) {
vars
int result = 1, i;
from i=1 to n {
result = result * i;
}
return(result);
}
Es obligatorio incluir la función main. La estructura básica del main es:
main() {
...
}
TeamPlusPlus soporta comentarios de una sola línea estilo Python:
Ejemplo:
# Comentario
TeamPlusPlus maneja 3 tipos de expresiones:
- Aritméticas (+, -, *. /)
- Relacionales (<, >, <=, >=, ==, !=)
- Lógicas (and, or, not)
También, se pueden incluir operadores unarios de + (positivo) y - (negativo) en las expresiones.
Ejemplo:
vars
int a, b, c, d;
char x, y, z;
a = (b + 2 - -1) * (c / 3);
d = (x == y or z < x) and (not b);
Existe en el lenguaje un estatuto de entrada de datos para una o más variables. Solamente se puede realizar lectura de tipos primitivos.
Ejemplo:
read(a, b);
De la misma forma, también hay un estatuto de salida para uno o más elementos. Aquí, se puede desplegar el resultado de una expresión, o bien un letrero.
Ejemplo:
print("Letrero", expresión);
Se pueden hacer por su cuenta o también pueden usarse como parte de una expresión. Dentro de una expresión no se permiten llamadas a funciones de tipo void.
Ejemplo:
obj.setAge(24);
f = fibonacci(10) + fibonacci(12);
Este es uno de los dos estatutos multicondicionales que TeamPlusPlus soporta. El estatuto puede tener una cantidad infinita de elif's, y tanto el elif como el else son opcionales.
Ejemplo:
if (condición) {
...
} elif (condición) {
...
} else {
...
}
El segundo estatuto multicondicional que es parte del lenguaje es el switch. Aqui debe haber por lo menos un case, mientras que el default es opcional. El switch soporta variables de tipo entero y caracteres solamente.
Ejemplo:
switch(numero) {
case 1 {...}
case 2 {...}
default {...}
}
switch(caracter) {
case 'a' {...}
...
}
TeamPlusPlus también permite el uso de dos estatutos cíclicos pre-condicionados. El primero es el while, que sigue una implementación idéntica a C.
Ejemplo:
while(condición) {
...
}
El segundo estatuto cíclico es el from-to. Aquí primero se asigna un valor inicial a la variable, y luego se define una expresión de terminación. Es importante considerar que el estatuto avanza de inicio a fin, aumentado de uno en uno, y el último valor en el rango sí se incluye en el ciclo.
Ejemplo:
from variable = inicio to fin {
...
}
Haz click en este link para ver una pequeña demostración del lenguaje.