Estás en:   ArielOrtiz.com > Traductores > Lenguaje Nyota

Lenguaje Nyota

Este documento contiene la especificación técnica del lenguaje de programación Nyota.

Historia

Aquí se enlistan las correcciones, aclaraciones y cambios que ha sufrido este documento.

Elementos Léxicos

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.

Comentarios

Existen dos tipos de comentarios: de línea y de bloque. Los comentarios de línea comienzan con los caracteres -- y terminan al finalizar la línea. Los comentarios de bloque comienzan con los caracteres (* y terminan con los caracteres *). Los comentarios no se anidan y no pueden estar dentro de literales de cadenas de caracteres.

Identificadores

Un identificador está conformado por un carácter de letra y una secuencia de cero o más letras, dígitos y caracteres de subguión (_). Las letras minúsculas y mayúsculas son consideradas diferentes. Los identificadores pueden tener cualquier longitud.

Enteros

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.

Reales

Una literal real consta de una parte entera, un punto decimal, una parte fraccionaria y un exponente opcional. Las partes entera y fraccionaria constan de una secuencia de uno o más dígitos. El exponente consiste de una e o E, un signo + o - opcional, y una secuencia de uno o más dígitos. Los números reales se representan internamente usando el formato de 64 bits de números de precisión doble según el estándar IEEE 754.

Cadenas

Una literal de cadena de caracteres es una secuencia de cero o más caracteres delimitados por comillas dobles, por ejemplo: "esta es una cadena". Estas literales no pueden contener caracteres de nueva línea. Las secuencias de caracteres \" (diagonal invertida, comillas dobles) y \\ (diagonal invertida, diagonal invertida) sirven para incluir en una cadena a los caracteres " (comillas dobles) y \ (diagonal invertida), respectivamente.

Booleanos

Las literales booleanas son true y false.

Sintaxis

Los elementos en mono-espacio representan símbolos terminales (tokens).

programa [ vardeclaración_variables›+ ]
declaración_procedimiento›*
programenunciado›* end .
declaración_variables identificador› ( ,identificador› )* :tipo;
tipo integer | real | string | boolean
declaración_procedimiento procedureidentificador
(declaración_parámetros) [ :tipo› ] ;
[ vardeclaración_variables›+ ]
beginenunciado›* end ;
declaración_parámetros [ ‹identificador:tipo› ( ,identificador:tipo› )* ]
enunciado enunciado_asignación
| ‹enunciado_invocación
| ‹enunciado_if
| ‹enunciado_loop
| ‹enunciado_return
| ‹enunciado_exit
enunciado_asignación identificador:=expresión;
enunciado_invocación identificador( [ ‹expresión› ( ,expresión› )* ] ) ;
enunciado_if ifexpresiónthenenunciado›*
( elseifexpresiónthenenunciado›* )*
[ elseenunciado›* ] end ;
enunciado_loop loopenunciado›* end ;
enunciado_return return [ ‹expresión› ] ;
enunciado_exit exit ;
expresión expresión_lógica
expresión_lógica expresión_lógica› ‹operador_lógico› ‹expresión_relacional
| ‹expresión_relacional
operador_lógico and | andalso | or | orelse | xor
expresión_relacional expresión_relacional› ‹operador_relacional› ‹expresión_aditiva
| ‹expresión_aditiva
operador_relacional = | <> | < | > | <= | >=
expresión_aditiva expresión_aditiva› ‹operador_aditivo› ‹expresión_multiplicativa
| ‹expresión_multiplicativa
operador_aditivo + | -
expresión_multiplicativa expresión_multiplicativa› ‹operador_multiplicativo› ‹expresión_unaria
|  ‹expresión_unaria
operador_multiplicativo * | / | div | rem
expresión_unaria notexpresión_unaria
| -expresión_unaria
| ‹expresión_simple
expresión_simple (expresión) | ‹invocación› | ‹identificador› | ‹literal
invocación identificador( [ ‹expresión› ( ,expresión› )* ] )
literal literal_entera
| ‹literal_real
| ‹literal_cadena
| ‹literal_booleana

Semántica

Generalidades

Enunciados

Enunciado Descripción
var := exp Asigna a var el resultado de evaluar exp. var debió haber sido declarado previamente y debe ser del mismo tipo que exp.
proc( args, ... ) ;

Invoca al procedimiento proc, evaluando y enviando args, ... como sus parámetros actuales. proc debió haber sido declarado previamente y no debe tener tipo de regreso.

El tipo y número de los parámetros actuales y formales deben corresponder. Los parámetros se pasan por valor.

Una llamada puede ser recursiva.

if exp1 then
  enun1, ...
( elseif exp2 then
  enun2, ... )*
[ else
  enunn, ...]
end
Evalúa exp1 y si resulta true, ejecuta los enunciados enun1, ... . De otra forma evalúa exp2 y si resulta true, ejecuta los enunciados enun2, ... , y así sucesivamente. Si ninguno de exp1, exp2, ... resulta en true, ejecuta los enunciados enunn, ... después del else, si es que dicho elemento está presente. Todas las expresiones exp1, exp2, ... deben ser de tipo boolean.
loop enun, ... end Ejecuta repetidas veces los enunciados enun,... . Para terminar el ciclo se debe usar el enunciado exit.
return [ exp ] ; Termina un procedimiento devolviendo el resultado de evaluar exp en caso de estar presente. Si exp no está presente, el procedimiento que contiene este enunciado no debe tener tipo de regreso declarado, o debe ser un enunciado que forma parte de la sección de program. En caso de que exp sí esté presente, debe ser del mismo tipo que el tipo de regreso declarado en el procedimiento que contiene este enunciado.
exit ; Termina el ciclo loop más anidado en el que se encuentra este enunciado. Es un error si usa este enunciado fuera de un ciclo.

Operadores

Operador Nombre Tipo Notas
op1 op2 resultado
op1 and op2 Conjunción Estricta boolean boolean boolean Evalúa op1 y op2. Si ambos resultan true, devuelve true. De otra forma devuelve false.
op1 andalso op2 Conjunción Corto Circuito boolean boolean boolean Evalúa op1. Si resulta true, evalúa y devuelve el resultado de op2. De otra forma devuelve false.
op1 or op2 Disyunción Estricta boolean boolean boolean Evalúa op1 y op2. Si ambos resultan false, devuelve false. De otra forma devuelve true.
op1 orelse op2 Disyunción Corto Circuito boolean boolean boolean Evalúa op1. Si resulta false, evalúa y devuelve el resultado de op2. De otra forma devuelve true.
op1 xor op2 Disyunción Exclusiva boolean boolean boolean Evalúa op1 y op2. Si ambos resultan con el mismo valor devuelve false. De otra forma devuelve true.
op1 = op2 Igualdad Booleana boolean boolean boolean Devuelve true si op1 y op2 tienen el mismo valor, false en otro caso.
op1 = op2 Igualdad Numérica integer/
real
integer/
real
boolean Devuelve true si op1 y op2 tienen el mismo valor, false en otro caso.
op1 <> op2 Desigualdad Booleana boolean boolean boolean Devuelve true si op1 y op2 tienen distinto valor, false en otro caso.
op1 <> op2 Desigualdad Numérica integer/
real
integer/
real
boolean Devuelve true si op1 y op2 tienen distinto valor, false en otro caso.
op1 < op2 Menor integer/
real
integer/
real
boolean Devuelve true si op1 es menor que op2, false en otro caso.
op1 > op2 Mayor integer/
real
integer/
real
boolean Devuelve true si op1 es mayor que op2, false en otro caso.
op1 <= op2 Menor o Igual integer/
real
integer/
real
boolean Devuelve true si op1 es menor o igual a op2, false en otro caso.
op1 >= op2 Mayor o Igual integer/
real
integer/
real
boolean Devuelve true si op1 es mayor o igual a op2, false en otro caso.
op1 + op2 Suma integer/
real
integer/
real
integer/
real
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 Resta integer/
real
integer/
real
integer/
real
Devuelve la resta aritmética de op1 menos op2. Genera una excepción de desbordamiento si el resultado está fuera de rango.
op1 * op2 Multiplicación integer/
real
integer/
real
integer/
real
Devuelve la multiplicación aritmética de op1 por op2. Genera una excepción de desbordamiento si el resultado está fuera de rango.
op1 / op2 División integer/
real
integer/
real
real Devuelve la división aritmética real de op1 entre op2.
op1 div op2 Cociente integer integer integer Devuelve el cociente aritmético resultante de dividir op1 entre op2. Genera una excepción de división entre cero si op2 es cero.
op1 rem op2 Residuo integer integer integer Devuelve el residuo aritmético resultante de dividir op1 entre op2. Genera una excepción de división entre cero si op2 es cero.
not op1 Complemento boolean N/A boolean Devuelve true si op1 es false, false en otro caso.
- op1 Negación integer/
real
N/A integer/
real
Devuelve la negación aritmética de op1. Genera una excepción de desbordamiento si el resultado está fuera de rango.
proc(...) Invocación El número y los tipos de los parámetros actuales, así como el tipo de regreso, dependen de la declaración del procedimiento. Devuelve el resultado de invocar a proc, el cual debe haber sido declarado previamente.
El tipo y número de los parámetros actuales y formales deben corresponder. Los parámetros se pasan por valor.
Los parámetros y variables locales de la función existen en un espacio de nombres distinto al de los nombres globales.
Una llamada puede ser recursiva.

Biblioteca de Tiempo de Ejecución

Los siguientes procedimientos integran la biblioteca estándar del lenguaje Nyota.

Categoría Firma Descripción
Entrada y salida WrInt(
  i: integer
);
Escribe en la salida estándar el valor de i, sin producir un salto de línea.
WrReal(
  r: real
);
Escribe en la salida estándar el valor de r, sin producir un salto de línea.
WrStr(
  s: string
);
Escribe en la salida estándar el valor de s, sin producir un salto de línea.
WrBool(
  b: boolean
);
Escribe en la salida estándar el valor de b, sin producir un salto de línea.
WrLn(); Escribe en la salida estándar un salto de línea.
RdInt(): integer; Lee de la entrada estándar un integer y devuelve su valor. Se debe ciclar hasta que se lea un valor válido.
RdReal(): real; Lee de la entrada estándar un real y devuelve su valor. Se debe ciclar hasta que se lea un valor válido.
RdStr(): string; Lee de la entrada estándar un string (hasta el final de línea) y devuelve su valor.
Operaciones sobre cadenas de caracteres AtStr(
  s: string,
  i: integer
): string;
Devuelve como un string el carácter contenido en el índice i de la cadena s. El primer carácter está en la posición 0. Genera una excepción si i resulta ser un índice fuera de rango.
LenStr(
  s: string,
): integer;
Devuelve el número de caracteres contenidos en la cadena s.
CmpStr(
  s1: string,
  s2: string
): integer;
Compara los contenidos de dos strings. Devuelve cero si s1 es igual a s2, un número negativo si s1 es menor que s2, o un número positivo mayor a cero si s1 es mayor a s2.
CatStr(
  s1: string,
  s2: string
): string;
Devuelve un nuevo string resultado de concatenar s1 con s2.
Operaciones de Conversión IntToReal(
  i: integer
): real;
Devuelve el resultado de convertir i a un real.
RealToInt(
  r: real
): integer;
Devuelve el resultado de convertir r a un integer, truncando su parte fraccionaria. El resultado es indefinido si el valor de r no puede ser convertido a integer.
IntToStr(
  i: integer
): string;
Devuelve el resultado de convertir i a un string.
StrToInt(
  s: string
): integer;
Devuelve el resultado de convertir s a un integer. Genera una excepción si no se puede realizar la conversión.
RealToStr(
  r: real
): string;
Devuelve el resultado de convertir r a un string.
StrToReal(
  s: string
): real;
Devuelve el resultado de convertir s a un real. Genera una excepción si no se puede realizar la conversión.
© 1996-2009 por Ariel Ortiz Ramírez (ariel.ortiz@itesm.mx)
Desarrollado en Django | Licencia de Creative Commons | XHTML válido | CSS válido