| Tabla de contenidos |

Lenguaje de programación Xitai-L

La forma de implementar métodos de un objeto es la expresión. Ésta es evaluada al invocar dicho método. Cuando se define un atributo de forma Expression en el editor de atributos, para una clase derivada por el usuario, se declara su tipo de valor y los posibles parámetros de entrada. Ambas propiedades son las mismas para todas las instancias de esa clase pero la implementación de la expresión puede variar con cada objeto concreto. Es posible fijar esta implementación para todas las instancias utilizando un objeto prototipo y marcando el atributo como no editable en el editor de clase derivada.

Además de los parámetros, una expresión puede tener algunas variables locales que sólo existen durante la evaluación de la expresión. Estas variables locales se pueden definir mediante el editor de expresiones o en forma textual. Así mismo, la expresión puede ser completamente definida en forma textual o mediante el editor de expresiones.

Tipos

Todos los tipos de valor tienen un valor nulo, que es el adquirido por defecto cuando no se ha definido o no puede calcularse por alguna razón.

Cuando la expresión no ha sido editada consta de un término literal de valor nulo o de ningún término si es de tipo void.

Los tipos de valor que pueden usarse en una expresión son:

bool
Booleano. verdadero o falso. Nulo: false
int
Valor enterno de 32 bits. Nulo: 0
float
Valor en coma flotante de doble precisión, (64 bits). Nulo: 0.0
string
Cadena de caracteres codificada en UTF-8. Nulo: ""
vec2, vec3, vec4
Vectores de 2, 3 y 4 dimensiones de valores en coma flotante de simple precisión (32 bits). Nulo: [0,0,...]
mat4
Matriz de 4x4 valores en coma flotante de simple precisión (32 bits). Nulo: [0,0,...]
vbuf
Vertex buffer. Es una matriz de columnas fijas de diferentes tipos y número de líneas variable. Nulo: [i]
obj
Objeto. Nulo: &0, &0#Actor, &0#Picture, etc
objlist
Lista de objetos de una clase. Nulo: [#Objekt], [#Actor], [#Picture], etc
void
Tipo especial que indica ningún valor. Para expresiones o invocaciones que no devuelven nada.

Sintaxis

Los espacios, tabuladores y saltos de línea no son significativos y actúan como separadores de los elementos léxicos.

Los nombres más restrictivos son los de las variables y los parámetros. Estos deben de empezar por un carácter alfabético (a-zA-Z) o subrayado (_) y pueden contener además dígitos (0-9). Ejemplos:

accc, val22

Los nombres de funciones, atributos y métodos no pueden contener espacios, tabuladores ni saltos de línea o alguno de los caracteres reservados ("$|#:@&,\%{}()[]).

prota, _PI/2

Los nombres de objetos o clases pueden tener cualquier carácter pero si no siguen la norma anterior deben de estar encerrados entre { }. Si se quiere incluir alguno de estos caracteres en el nombre debe de anteponerse el carácter \ . Si se desea incluir este carácter se le antepone otro \ .

Los siguiente nombres están reservados:

THIS true false

Una expresión consta de un único término que puede ser simple o una composición de otros expresada con una determinada sintaxis. Puede estar precedida por la declaración de las variables locales usadas en la expresión.

El valor de un término puede ser persistente o temporal. En el primer caso es válido fuera de la expresión que lo usa, está almacenado en alguna variable o atributo de objeto. Una expresión puede modificarlo mediante una operación de asignación. En el segundo caso son valores intermedios que desaparecen después de usarlos.

Términos simples

Literal

Cada tipo de valor tiene una forma propia de representación literal.

bool
Tiene dos posibles valores:
true, false
int
Una cadena de dígitos decimales, posiblemente con signo antepuesto. Ejemplo:
0, 23, -12345
float
Se usa la notación científica tradicional. Ejemplos:
123, -12.56, 1e5, 23e-1
string
Se escribe el texto entre ". Ejemplo:
"hola, mundo"
vec2, vec3, vec4
Vectores de dos, tres o cuatro dimensiones. Se expresan como valores float, separados por ,, entre [ ]. Ejemplos:
[0, 0]  [2.1, 55] [1,1,1,1] [0,-1,0]
mat4
Dieciséis float, separados por ,, entre [ ]. Ejemplo:
[1,0,0,0,  0,1,0,0,  0,0,1,0,  0,0,0,1]
vbuf
Lista de int o float sin separador, precedidos por la especificación de columnas y encerrados todos entre [ ]. Las columnas se especifican por una serie de caracteres, cada uno indica el tipo de la columna correspondiente:
Ejemplo:
[ iiff 1 2 3.2 4.5 6 7 8.0 10.0 ]
obj
Tiene dos formas: el nombre con el carácter @ antepuesto o el identificador único (número entero) con el carácter & antepuesto. La primera forma es ambigua si hay más de un objeto con ese mismo nombre, por lo que sólo se puede usar con objetos de nombre singular. Opcionalmente puede añadirse el nombre de la clase separada por #. Ejemplos:
@prota#Actor, &101250
objlist
Literales de objeto separados por , y precedidos por el nombre de la clase precedido por #. Todo entre [ ]. Ejemplo:
[#Character @prota, @enemigo1, &1792852]

Literal adornado

El tipo de dato del literal determina la forma de edición en el editor de expresiones. Por ejemplo, para un entero o float nos presenta un editor simple de texto con el indicador i o f a la derecha de la caja de edición. Si el valor es el de un color o un ángulo preferiremos tener una forma de edición especializada en estas clases de magnitudes. Para ello se pueden adornar los literales precediéndoles con un nombre precedido a su vez por el carácter :. Existen los siguiente tipos de adornos:

angle
.
color
.
enum
.
bits
.

Variables

Las variable locales y los parámetros de entrada se representan anteponiéndoles el carácter $. Ejemplos:

$accum $v $z

Los parámetros de entrada de los atributos de usuario de tipo Expression se definen en el editor de atributos. Las variables locales se pueden definir en el editor de expresiones o en forma textual mediante una lista de declaraciones encerradas ente || que preceden al término que constituye la expresión. Ejemplo:

|a int, b float, x Picture|...

Términos compuestos

Función

Con la misma forma sintáctica se expresan la invocación de funcion o método o la referencia a constantes, variables globales o atributos de un objeto.

Atributo

Método

Secuencia

Casting

Gramática

bool:
true | false
uint:
('0'-'1')+
int:
['+'|'-']uint
float:
int['.'uint]['e'|'E'int]
vec2:
'[' float ',' float ']'
vec3:
'[' float ',' float ',' float ']'
vec4:
'[' float ',' float ',' float ',' float ']'
mat4:
'[' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ',' float ']'
string:
".."
nchar:
'_' | ('a'-'z') | ('A'-'Z')
xchar:
'"' | '$' | '|' | '#' | ':' | '@' | '&' | ',' | '\' | '%' | '{' | '}' | '(' | ')' | '[' | ']'
bchar:
' ' | '\t' | '\r' | '\n'
var_name:
nchar('0'-'9')*
func_name:
(!(bchar|bchar))+
obj_name:
func_name | '{'..'}'
klass_name:
obj_name
sym_name:
obj_name
type_name:
var:name | klass_name
obj:
'@' obj_name [ '#' klass_name ] | '&' uint [ '#' klass_name ]
objlist:
[ obj [',' obj]* ]
vbuf:
[ ('b'|'B'|'h'|'H'|'i'|'I'|'f'|'d')+ float* ]
literal:
bool | int | float | string | vec2 | vec3 | vec4 | mat4 | obj | objlist | vbuf
nliteral:
:color int | :{enum sym_name} int | :{bits sym_name} int | :angle float
localvar:
var_name type_name
localvars:
'|' [localvar [, localvar]* ] '|'
term:
literal | nliteral | $ var_name | func_name [# klass_name ] | func_name [# klass_name ] (term [, term]*) | # klass_name term
expr:
[localvars] [term]
 
Catálogo de condiciones   Funciones globales


(C) Paco Suárez (pacosu@xitai,es). 2020.
XITAI