Buenas.
Quería abrir este tema de un modo consultivo, para ver por donde tirariais vosotros. Ahora os digo lo que yo he pensado para que todo esté simplificado y no se me vaya de las manos el tema.
El caso es que tengo un archivo que es una base de conocimiento. Un archivo de texto plano con reglas, algo así:
package com.sample.rule
import com.sample.DroolsTest.Message.rule;
rule "R1" //esta regla se lanzaria infinitamente, pero hace "neurona espejo" esta regla para la misma condición
//no se volverá a lanzar. Cuando se hace update de marta, se vuelve a lanzar porque ha habido modificación
when
$p : Person()
then //esta parte es java
System.out.println("Hello "+$p.getName());
end
rule "R2"
salience 10
when
$p : Person(age>=18, adult== false) //la coma es un and y cada linea dentro de when tambien
//muy importante comprobar adult== false si no haria bucle
then
$p.setAdult(true);
update($p); // actualiza el atributo cambiado
System.out.println("Updated adult "+$p.getName());
end
hola
rule " otra regla"
salience -23
when
$p : Person(age>=18, adult== false) //la coma es un and y cada linea dentro de when tambien
//muy importante comprobar adult== false si no haria bucle
then
$p.setAdult(true);
update($p); // actualiza el atributo cambiado
System.out.println("Updated adult "+$p.getName());
end
Como veis, cada regla empieza con "rule" y termina con "end". En ese bloque pues hay atributos y valores como el nombre de la regla, la prioridad ( "salience" ) y las variables precedidas del símbolo dolar que pueden indicar hacía que otras reglas podrían ir encadenadas en el antecedente (when) y consecuente (then). Bueno, básicamente información.
El caso es que quiero extraer esa información, de forma ordenada, para luego meterla en una base de datos o tratarla. Yo había pensado, dado que hay reglas que no tienen que llevar todos los atributos (puede haber una que no lleve el "salience", por ejemplo, que, mediante una expresión regular, ir guardando en una lista, o estructura de datos similar, los distintos bloques de reglas, desde el "rule" hasta el "end" y luego, una vez separados, entonces ir recorriendo la lista y con distintas expresiones regulares, o una grande, ir ya sacando la información para introducirla en una clase (por ejemplo, la clase "regla" ) e ir construyendo los objetos. En este caso, sería construir 3 objetos e inicializar cada uno de ellos (construir) con los atributos que tenga y ya pues tendría la información sacada.
Claro, esto me lleva a primero hacer una primera pasada para "diseccionar" el texto en las reglas, en este caso las 3 que hay. Luego, por cada una de ellas, ir pasando la expresión regular para ir creando los objetos por cada una de ellas... También es verdad que esto me permite tener un diseño de programa bastante facil de mantener, ya que por cada atributo tengo una subclase. Por ejemplo, la clase padre "Atributo", que es una interface, y luego las subclases que implementan este que serían "AtributoRule", "AtributoSalience"... y otros que haya o vaya a haber (incluso guardar los comentarios que haya dentro de la regla, como si fuera meta información). Cada subclase solo implementa el método de la expresión regular para buscar su atributo y valor dentro del bloque de la regla que hemos extraido anteriormente... por lo que si salen en un momento dado más atributos pues se crea una subclase, se piensa su expresión regular y se añade...
No sé, de momento se me ha ocurrido así para hacer un diseño llevable y que sea sencillo.
¿Qué me decís? Gracias : )
PD: Estoy usando JAVA (aunque la pregunta es un poco general, no tanto la implementación concreta en cierto lenguaje).