Si algún lector es informático sabrá que no todas las ER son programables. Cuando programé la ER 'empieza por a' = a+PALABRA, siendo PALABRA cualquier secuencia de símbolos del abecedario, funcionó correctamente. Sin embargo al programar 'termina por a' = PALABRA+a, no funcionó. Sí que generaba la estructura en el autómata y al reconocer 'arbol' me decia ER='empieza por a'+PALABRA, pero al reconocer 'casa' ER = PALABRA. Es debido a la recursividad de la gramática de la ER en el autómata.
Como lo inserta sin problemas no encontré forma de que de forma automática reconociese que la ER insertada no iba a reconocer las cadenas esperadas.
Si tubiera la función 'termina por (terminación) = boolean' podría seguir reconociendo cadenas sin problemas.
Esto me llevó a concluir de que necesitaba de funciones programables por la misma aplicación, en base a unas directrices generales.
En un principio pensé en la simulación de ejecución de un código con las instrucciones y tipos de datos más básicos. De esta manera sería suficiente ya que se podría autoprogramar en tiempo real y no se tendría que compilar.
En seguida me dí cuenta de que lenguajes de programación ya habían muchos y además contaban con sus correspondientes compiladores y depuradores.
¿Pero cómo puede la aplicación ejecutar código que ella misma ha generado?
Y se añade la complejidad de que el código generado usa palabras que han sido definidas en el autómata.
Nos basaremos en dos capas de código. La superior será la que se trabaje directamente por la aplicación. Es la que definirá la función, sus argumentos y el resultado. En este código serán donde aparezcan las referencias a palabras del autómata o a otras funciones ya programadas. Este código es re utilizable y se podrá guardar.
La otra capa será una trasformación de la capa anterior, asignándoles valores concretos a los argumentos, si existe la expresión regular (palabra) en el autómata se sustituirá por true y en caso contrario por false, se le dará forma de main, se compilará, se ejecutará y se devolverá el resultado como resultado de la función ejecutada.
Por ejemplo:
Suponiendo que existe la función TERMINA (PALABRA, PALABRA) = BOOLEAN
donde PALABRA es una expresión regular ya definida en el autómata, para una nueva función
función GÉNERO_MASCULINO (PALABRA) = boolean
return TERMINA (PALABRA, o));
fin función
Y queremos ejecutar:
GÉNERO_MASCULINO (pájaro)
Primero comprobaría los argumentos:
Pájaro es PALABRA según el autómata.
Empezaría a generar código:
Public boolean GÉNERO_MASCULINO (String SPALABRA){
return true;
}
Public Static void main MAIN_GÉNERO_MASCULINO (String args []){
System.out.print (GÉNERO_MASCULINO (args [0]);
}
Trabajando recursivamente, al llegar a la función TERMINA, habrá generado su código y ejecutado su main con pájaro y o como argumentos. Se captura la salida del main o el error. En el caso de que exista salida y sea true se sustituirá como en el ejemplo. En el caso contrario o error, por false.
La salida de MAIN_GÉNERO_MASCULINO (pájaro) será true
No hay comentarios:
Publicar un comentario