Directivas

Todas las directivas inician con un caracter # y se procesan durante el análisis (parseo) de los archivos dkl conforme se van identificando, esto ocurre antes de que se realice la interpretación o ejecución del programa.

Inclusión de archivos de código

La directiva #include inserta otros archivos en uno principal haciendo que se interprete todo como si se tratara de un solo documento.

#include "archivo"
#include "archivo" build
#include "archivo" with "plantilla"
#include UTF8 "archivo"
#include UTF8 "archivo" build
#include UTF8 "archivo" with "plantilla"
  • Archivo es la ubicación local o remota de un archivo que va a incorporarse en la posición donde se encuentre la sentencia.

Debido a que el parámetro archivo de la sentencia es una cadena y se usa la sintaxis de C, deberá usar doble \ para indicar una .

Ejemplos:

#include "c:\\archivo.dkl" //Correcto
#include "c:\archivo.dkl" //Incorrecto
#include "archivo.dkl" /*Correcto, el archivo se busca en la misma ubicación que el programa
			que lo requiere o en las ubicaciones predeterminadas del entorno.*/
			
#include "https://dev.induxsoft.net/archivo.dkl" //Correcto

Definición de meta-atributos

La directiva #set agrega información a las declaraciones (que se corresponden a nodos Xml) de Devkron.

# set "meta-atributo" "valor"

Asignación de meta atributos al elemento (nodo) inmediato siguiente a la sentencia.

# set "AtributoAsociado" "valor"
E(a="5") { }

El elemento E tiene asociado un meta-atributo denominado AtributoAsociado.

Definición de plantillas de elementos

La directiva #def asocia un identificador con una cadena que puede usarse en la construcción de declaraciones para simplificarlas o incluso admitir secuencias de caracteres no válidas para la sintaxis de Devkron pero sí válidas para Xml o Html.

#def identificador [(atributos por orden)] "valor" [(atributos predeterminados)]

Asignación de cadena a identificador

Es la forma más simple de uso de la palabra #def funciona asignando un valor de cadena que es reemplazado durante la formación del XML. (Casi como una variable o macro)

En Devkron:

#def J "Juan"
#def P "Pedro"
#def C "Camila"
#def n "nombre"

Personas(cantidad="5")
{
	Persona(n=J)
	Persona(n=P)
	Persona(n=C)**
}

En Xml:

<Personas cantidad = "5" >
	<Persona nombre = "Juan" />
	<Persona nombre = "Pedro" />
	<Persona nombre = "Camila" />
</Personas>

Combinando el uso de #def e #include

archivo1.dkl:

# def J "Juan"
# def P "Pedro"
# def C "Camila"
# def n "nombre"

archivo2.dkl:

#include "archivo1.dkl"

Personas(cantidad="5")
{
	Persona(n=J)
	Persona(n=P)
	Persona(n=C)
}

Resultado en XML:

<Personas cantidad = "5" >
	<Persona nombre = "Juan" />
	<Persona nombre = "Pedro" />
	<Persona nombre = "Camila" />
</Personas>

Si la directiva #def sólo relaciona una cadena con un identificador puede usarse indistintamente como nombre de elemento, atributo y valor.

Ejemplo DKL:

# def n "nombre"
n(n=n)

Equivalente Xml:

<nombre nombre = "nombre" />

Atributos por orden

Es una lista de identificadores o cadenas separadas por comas que simplifican la asignación de valores de atributos en una declaración de elemento.

Redefinición de plantilla

La directiva #redef cambia la cadena asociada a una declaración #def previa.

El efecto de #redef es al código que le sigue únicamente.

Definición de patrones de sintaxis

La directiva #pattern permite definir un patrón de declaración que será reconocido y transformado a un nodo del árbol que constituye el documento (programa) de Devkron.

De hecho, toda la sintaxis imperativa de Devkron, está definida mediante directivas #pattern que se encuentran en el archivo dkli.dkh

#pattern Identificador cadena_de_patrón

Identificador es cualquiera definido previamente por una sentencia #def.

cadena_de_patron es una cadena que contiene los símbolos válidos para esa sintaxis en particular.

Ejemplo:

#def color (nombre) "prefijoXml:Color"
#pattern color "COLOR '$nombre'"

Permitiría el siguiente código:

COLOR azul

Que sería formado como:

<prefijoXml:Color nombre="azul"/>

Tabla de prefijos para símbolos en patrones:

Prefijo Uso
$ Identificador (los admitidos en el lenguaje C)
& Expresión (Expresión válida según sintaxis de C)
% Macro o uso del definidor (reemplaza el nombre por lo que corresponda en una sentencia #def previa)
@ Cadena (Cadena válida de C [Entre comillas dobles o simples])
# Número (Sintaxis de C para valores numéricos)
* Mezcla (Número, cadena o Identificador)

(Si no se especifica un prefijo, se asume que es una expresión)

En la sintaxis de un patrón no se permiten las siguientes secuencias:

  • Expresión Expresión
  • Identificador Expresión
  • PalabraReservada Expresión

Contexto declarativo e imperativo

El contexto se refiere al modo como son procesados los elementos del árbol del programa DKL y son dos:

  • Contexto declarativo. Significa que los elementos son transformados a su equivalente XML tal como han sido expresados.

  • Contexto imperativo. Significa que los elementos serán considerados sentencias sujetas de interpretación al estilo de cualquier lenguaje imperativo, es decir se realizarán asignaciones de variables, llamadas a funciones, ciclos, etc.

Las directivas de selección de contexto sirven para establecerlos en el código del programa.

Conmutación de contexto

La directiva ## conmuta entre contextos, si la secuencia de ejecución está en modo declarativo cambia a imperativo y viceversa.

Contexto imperativo

La directiva #! pasa a modo imperativo el contexto de ejecución para las líneas siguientes, si ya está en modo imperativo simplemente no hace nada más.

Contexto declarativo

La directiva #$ pasa a modo declarativo el contexto de ejecución para las líneas siguientes, si ya está en modo declarativo no hace más nada.

Inyección de expresiones

En ocasiones requerirá que el valor o nombre de elementos o atributos, así como partes del texto contenido dentro de elementos, se genere dinámicamente por el programa.

Para hacerlo, use la siguiente sintaxis:

#<expresión [: formato]>

Por ejemplo:

a(href="#<url>"){"Hipervínculo"} // coloca el valor de una variable denominada url en la posición de la marca.

Dentro de las marcas de inyección pueden escribirse expresiones completas.

Adicionalmente, el carácter : se utiliza para que al resultado de la expresión se le proporcione un formato específico (solo aplica cuando el resultado es numérico).

nodo {" El valor monetario es: #<monto * 1.16 : $ #,#.00>"}

Genera un nodo con formato.

La marca de inyección únicamente puede usarse en:

  • El nombre o el valor de atributos
  • El nombre de elementos
  • Bloques de texto dentro de elementos
  • En cadenas que sean procesadas por la función ftext() en el contexto imperativo