intprom — Interprete del lenguaje prom
, apropiado para efectuar promedios y cálculos sencillos
intprom [opciones
] arch-prom
[arch-prom ...
]
intprom recibe uno o más
programas en lenguaje prom
. Por defecto chequea
sintacticamente e interpreta cada uno de los programas que recibe
(ver opciones -interp
y -interp-no
)
ejecutando antes el prologo si lo hay (ver opción -prologo
).
Opcionalmente
Si se indica el tipo del valor que debe retornar, puede realizar
un chequeo de tipos (opción -chtipo
)
tipo
Puede indentar e imprimir cada programa que recibe
(opción -indent
)
Puede presentar el estado de todas las variables después de interpretar
cada programa (opción -estado
).
Las opciones son las siguientes:
-ayuda
Presenta ayuda corta y opciones
-D
Establece otro directorio en el cual buscar archivos con más precedencia
-man
Presenta página del manual
-refentry
Presenta página del manual en formato DocBook
-V
Versión de este programa
-prologo
Prologo por anteponer al programa. Útil por ejemplo para inicializar variables.
-chtipo
Indica que debe chequearse tipo y el tipo por esperar.
-chtipo-no
Indica que no debe chequearse tipo (por defecto).
-indenta
Indica que debe indentarse e imprimirse.
-indenta-no
Indica que no debe indentarse e imprimirse (por defecto).
-estado
Indica que debe imprimirse estado al final de ejecución.
-estado-no
Indica que no debe imprimirse estado al final de ejecución (por defecto).
-interp
Indica que debe interpretarse y presentar resultado (por defecto).
-interp-no
Indica que no debe interpretarse y presentar resultado.
-regtest
Para ejecutar pruebas de regresión y terminar
prom
Algunas características del lenguaje prom
son:
Es un lenguaje con tipos, los tipos tienen orden (inclusión), el tipo entero es menor que el tipo flotante (análogo para vector de enteros y flotantes). Los tipo cadena y vector de cadenas no son comparables con otros. Durante el chequeo, en caso de conflicto entre dos tipos comparables se escoge el mayor.
Las expresiones tienen tipo, el tipo puede ser flotante, entero o cadena. Las variables pueden tener uno de estos tipos o ser vector de uno de estos tipos. En caso de error al evaluar una expresión (como división por cero) el programa termina e informa.
Todas las variables y vectores son globales, no requieren declaración.
El tipo de una variable es el de la primera expresión que se le asigne.
Así para declarar una variable flotante f
que inicie en
1, debe usarse antes de cualquier otra asignación o uso de
f
:
f=1.0;
pero si se deseara entera debería inicializarse con:
f=1;
Las expresiones emplean una sintaxis similar a la del lenguaje C, aunque sin efectos laterales (i.e la evaluación de una expresión NO modifica el estado). Las palabras reservadas son palabras del español.
Los vectores se indexan con enteros. El tipo de un vector será el de la
primera posición que se inicialice (por ejemplo v[3]=2.0
como primera asignación a una posición de v
indica que
es un vector de flotantes).
El programa termina normalmente sólo con la instrucción
retornar
,
que hará que intprom evalúe la expresión y presente
el valor evaluado.
expresión
Un programa en lenguaje prom
es una secuencia de
sentencias. Se ejecuta una después de otra, empezando por la primera.
Cada sentencia puede ser:
mientras (condición
) {
sentencias
}
que ejecuta las sentencias mientras la condición sea cierta.
si (condición
) {
sentencias
}
que ejecuta las sentencias una vez si la condición es cierta, o bien
si (condición
) {
sentencias
}
sino {
sentencias
}
que ejecuta la primera secuencia de sentencias si la condición es cierta y el segundo si es falsa.
variable
=expresión
;
asigna a la variable el resultado de evaluar la expresión. Si es el primer uso de la variable, el tipo de la variable será el tipo de la expresión. Si la variable ya tenía un tipo, el tipo de la expresión debe ser compatible.
retornar expresión
;
que termina normalmente la ejecución retornando el valor al que la expresión evalúe.
aserción(condición
);
que evalúa la condición, si es falsa termina anormalmente la ejecución, si es cierta no tiene efecto.
mensaje(expresión expresión ... expresión
);
Evalúa cada una de las expresiones e imprime el valor de cada una por
stderr
. El tipo de cada expresión es arbitrario.
Pueden intercalarse comentarios, comenzando con /*
y terminando con */
.
Las expresiones pueden ser:
Al igual que en Ocaml, las constantes enteras pueden ser decimales como
72
o hexadecimales como 0x52
o octales como 0o21
o binarias como
0b101
. Los enteros son de 32 bits.
Constantes flotantes decimales como 32E-4
,
.25
, 3f
, 7F
,
0.
Cadenas constantes encerradas entre comillas. Puede emplear las
secuencias de escape \"
comillas, \n
fin de línea, \t
tabulador y \\
slash
invertido.
Variables cuyos identificadores no sean palabras reservadas y que comiencen
por letra o barra (_) y consten sólo de letras, dígitos y barra. Para
referirse a posiciones de un vector se emplea
variable
[índice
]
Pueden emplearse paréntesis para agrupar expresiones
Con expresiones enteras y flotantes puede emplearse
el operador unário prefijo -
inverso aditivo.
Entre expresiones enteras y flotantes pueden usarse los operadores binarios
infijos *
multiplicación,
/
división, %
residuo,
+
suma,
-
resta. Multiplicación y división tienen más precedencia
y asociatividad izquierda. La división entre enteros se considera entera.
Si se operan expresiones de distintos tipos, pero comparables, la evaluación
se realiza en el tipo mayor. Por ejemplo 3/2
dará
el resultado entero 1
, pero 3/2.0
dará el flotante 1.5
Entre expresiones tipo cadena puede emplearse el operador binario infijo
+
para concatenar.
Cómo expresión entera puede emplearse
tamaño(
, donde
variable
)variable
es el nombre de un vector. Evalúa
en la cantidad de elementos asignados al vector. Por ejemplo el
siguiente programa retorna 2:
v[-3]=10; v[5]=5; retorna tamaño(v);
Las condiciones pueden emplear paréntesis y deben ser:
Uno de los identificadores reservados
verdadero
o falso
Una de las siguientes relaciones binarias infíjas:
<
menor;
>
mayor;
<=
menor o igual;
>=
mayor o igual;
==
igual;
!=
diferente.
Las cuales están definidas para todos los tipos con tipos comparables.
Entre cadenas se usa orden lexicográfico.
Negación de una condición con el operador unario prefijo !
Operación entre dos condiciones mediante un operario binario infijo:
&&
conjunción, ||
disyunción. El
primero tiene más precedencia. Ambos evalúan primero la condición izquierda
si es falsa &&
evalúa a falso, si es verdadera
||
evalúa a verdadero.
El siguiente programa calcula el máximo divisor común de
dos enteros positivos (algoritmo de Euclides). Supone que las variables
y
y x
tienen los dos enteros. Así
si estuviera en un archivo mcd.prom
, podría usarse por
ejemplo: intprom -prologo 'x=150; y=1050;' mcd.prom
aserción(x>0); aserción(y>0); r=1; mientras (r>0) { r=x%y; x=y; y=y-r; } mensaje(x " " y " " r " "); retorna y;