martes, 9 de febrero de 2010

Gramática y sintaxis - Primera parte

Como todos los lenguajes, nuestro lenguaje también necesita una gramática y una sintaxis. Conceptualemente podríamos utilizar XML. Aunque por ahora prefiero realizar el ejercicio de definición de una gramática más simplificada, a ver que tal se me da.

Y como Baadaki tiene que ser sencillo, la primera versión será lo más simple posible. A ver si me acuerdo como se definen estas cosas...

Un posible conjunto de reglas:

Doc ::= Bloq*
Bloq ::= BloqStart BigIdentifier BloqSep Content BloqEnd
BloqStart ::= '[['
BloqEnd ::= ']]'
BloqSep ::= '::'
Content ::= (bloq | data)*
BigIdentifier ::= Identifier | (Package '.' Identifier)
Identifier ::= CharId* - (CharId* '::' CharId*) - (CharId* '[[' CharId*) - (CharId* ']]' CharId*)
Package ::= Identifier | (Package '.' Identifier)
Data ::= Char* - (Char* '::' Char*) - (Char* '[[' Char*) - (Char* ']]' Char*)
CharId ::= Char - '.'
Char ::= Cualquier carácter UNICODE válido

Aunque sea una gramática de lo más simple y tontuna, lo más probable es que he cometido más de un error en la definición. He de decir que la última vez que hice esto fue hace fácilmente 10 años.

Así que, para que no queden dudas, lo mejor es un serie de ejemplos:

Una definición sencilla del contenido de una agenda:

[[Agenda clientes::
   [[Persona física::
     [[Nombre::Pablo]]
     [[Apellido::Gonzalez]]
     [[Teléfono::555555555]]
     [[Teléfono::777777777]]
   ]]
   [[Persona física::
     [[Nombre::Rafael]]
     [[Apellido::Jimenez]]
     [[Teléfono::555555555]]
     [[Teléfono::777777777]]
     [[Email::rafa@gcorreo.es]]
   ]]
]]

Y ahora un ejemplo de lo que podría ser la definición de la taxonomía de la agenda... tirando a lo complejo.

[[bk.defAtribute::
  [[bk.defAtribute.name::Agenda clientes]]
  [[bk.defAtribute.content::
    [[bk.defAtribute.content.list::
      [[bk.defAtribute.content.atribute::Persona física]]
    ]]
  ]]
]]
[[bk.defAtribute::
  [[bk.defAtribute.name::Persona física]]
  [[bk.defAtribute.content::
    [[bk.defAtribute.content.list::
      [[bk.defAtribute.content.choice::
        [[bk.defAtribute.content.atribute::Nombre]]
        [[bk.defAtribute.content.atribute::Apellidos]]
        [[bk.defAtribute.content.atribute::Teléfono]]
        [[bk.defAtribute.content.atribute::Email]]
      ]]
    ]]
  ]]
]]
[[bk.defAtribute::
  [[bk.defAtribute.name::Nombre]]
  [[bk.defAtribute.contentType::String]]
]]
[[bk.defAtribute::
  [[bk.defAtribute.name::Apellidos]]
  [[bk.defAtribute.contentType::String]]
]]
[[bk.defAtribute::
  [[bk.defAtribute.name::Teléfono]]
  [[bk.defAtribute.contentType::String]]
]]
[[bk.defAtribute::
  [[bk.defAtribute.name::Email]]
  [[bk.defAtribute.content::
    [[bk.defAtribute.content.patternRegex::^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$]]
  ]]
]]

Nota: El patrón de email lo he extraido de http://www.codetoad.com/asp_email_reg_exp.asp. Supongo que será un patrón válido. De todas formas, la idea del ejemplo no es más que exponer una posible definición con Baadaki de una rutina que al final terminaría ejecutando una rutina de validación mediante patrones.

Conclusiones
  • Todos los atributos pueden tener una definición... o no.
  • La definición se realizaría con la ayuda de otros atributos semánticos.
  • A su vez, estos atributos necesitarán una definición, una taxonomía?
  • Para que esto sea "útil" y "sencillo", se tenderá a tener librerías básicas de atributos semánticos; para la definición de tipos, formatos, patrones y validaciones.
  • Y al final necesitaremos permitir atributos semánticos "primitivos" que permitan ejecutar rutinas de bajo nivel.. o algo así.
  • Para simplificar los ejemplos del publicados, en lugar de utilizar el propio lenguaje "Baadaki" al definir las taxonomías (tal y como he hecho en este ejemplo), utilizaré diagramas gráficos. Son más sencillos e intuitivos de entender, por lo que para explorar la potencia del lenguaje serán probablemente más útiles.

No hay comentarios:

Publicar un comentario