Este documento contiene la especificación técnica del lenguaje de programación Buttercup.
Aquí se enlistan las correcciones, aclaraciones y cambios que ha sufrido este documento.
En las siguientes secciones, una letra se considera cualquier carácter del alfabeto inglés de la A a la Z mayúscula o minúscula. Un dígito se considera cualquier carácter del 0 al 9. En general los espacios, tabuladores y nuevas líneas sirven como delimitadores entre elementos léxicos, pero fuera de eso son ignorados.
Buttercup sólo cuenta con comentarios de línea: comienzan con el carácter ; (punto y coma) y terminan al finalizar la línea.
Un identificador está conformado por una secuencia de uno o más caracteres de letra. Las letras minúsculas y mayúsculas son consideradas diferentes. Los identificadores pueden tener cualquier longitud.
Una literal entera es una secuencia de uno o más dígitos. Estas literales están en base diez en un rango de 0 a 231 - 1.
Las literales booleanas son #t y #f.
Los elementos en mono-espacio representan símbolos
terminales (tokens).
| ‹program› | → | ‹declaration›* ‹statement›* |
| ‹declaration› | → | ‹type› ‹identifier› |
| ‹type› | → | int | bool |
| ‹statement› | → | ‹assignment› | ‹print› | ‹condition› |
| ‹assignment› | → | ‹identifier› = ‹expression› |
| ‹print› | → | print ‹expression› |
| ‹condition› | → | if ‹expression› then ‹statement›* end |
| ‹expression› | → | ‹expression› ‹operator› ‹simple_expression›
| ‹simple_expression› |
| ‹operator› | → | & | < | + | * |
| ‹simple_expression› | → | ‹identifier› | ‹integer› | ‹boolean› | ( ‹expression› )| - ‹simple_expression› |
Los enunciados se ejecutan de manera secuencial comenzando desde el primero.
Una literal entera es de tipo int.
Las literales #t y #f son de tipo bool.
| Enunciado | Descripción |
|---|---|
var = exp
|
Coloca en la variable var el resultado de evaluar exp. var debe estar declarada previamente. var y exp deben ser del mismo tipo. |
print exp
|
Evalúa exp e imprime el resultado en la salida estándar. |
if exp thenenunciados... end
|
Evalúa exp, el cual debe ser de tipo bool.
Si resulta en #t, ejecuta
enunciados..., de otra forma no tiene efecto alguno.
|
| Operador | Nombre | Tipo | Notas | ||
|---|---|---|---|---|---|
| op1 | op2 | resultado | |||
op1 & op2
|
Conjunción |
bool
|
bool
|
bool
|
Devuelve la conjunción lógica entre op1 y
op2. Es decir, devuelve #t sólo si
tanto op1 y op2 son #t, y
devuelve #f en cualquier otro caso.
|
op1 < op2
|
Menor |
int
|
int
|
bool
|
Devuelve #t si op1 es menor que
op2, #f en otro caso.
|
op1 + op2
|
Suma |
int
|
int
|
int
|
Devuelve la suma aritmética de op1 más op2. Genera una excepción de desbordamiento si el resultado está fuera de rango. |
op1 * op2
|
Multiplicación |
int
|
int
|
int
|
Devuelve el producto aritmético de op1 por op2. Genera una excepción de desbordamiento si el resultado está fuera de rango. |
- op1
|
Negación |
int
|
N/A |
int
|
Devuelve la negación aritmética de op1. Genera una excepción de desbordamiento si el resultado está fuera de rango. |