jueves, 30 de septiembre de 2010

Implementación de Gold Parser y Python


Para utilizar GOLD Parser en Python, lo primero que a realizar es instalar pygold, el programa encargado de instalar las librerías necesarias para poder enlazar los archivos de GOLD Parser a Python.
Se puede descargar desde aquí: http://pygold.sourceforge.net/. El archivo de instalación a la fecha es la versión 0.9.2: pygold-0.9.2.win32.exe.

Una vez instalado, vamos a GOLD Parser para generar los archivos necesarios.
Pasos en GOLD Parse
Con la gramática ya realizada, procedemos a generar el archivo .cgt:




Recordar donde se guarda el archivo .cgt, ya que nos servirá posteriormente.
Luego vamos a Project ? Create a Skeleton Program:

Para generar el archivo compatible con Python seleccionamos la opción: “Python – Constants Only” y luego hacemos clic en “Create”, donde se nos pedirá donde guardar el archivo que contendrá la identificación de los símbolos y reglas de la gramática. Se deberá guardar ese archivo en la misma ruta de nuestro archivo de python.
El archivo generado contendrá algo parecido a esto:



 
Pasos en Python
Ahora en nuestro archivo de python se hacen las siguientes modificaciones para poder implementar lo realizado en GOLD Parser:
Se agrega el anterior código al principio del archivo. Este código manda a llamar los módulos necesarios para el parser, así como importa “pygold” para poderlos utilizar. 
El archivo con las identificaciones de la gramática se importa con la línea: “from archivoGenerado import *”, donde “archivoGenerado” es el nombre que se le había puesto al archivo con los símbolos de la gramática.
Se definen las funciones “onToken” y “onReduction” con los parámetros indicados:
def onToken(parser, token):
def onReduction(parser, reduction, tokens):
Dentro de dichas funciones se implementan las acciones semánticas de acuerdo al token o reducción realizada según los identificadores en el archivo generado.
Como en el ejemplo de la imagen, para la función “onToken”, el identificador del token se guarda en:
token.index
Y el valor del token en:
token.data
Con lo anterior, se puede realizar la comparación necesaria para efectuar acciones de acuerdo al token analizado.

 
Para la función “onReduction”, el identificador de la producción reducida está en:
reduction.data.rule.index

Y el valor a retornar se almacena en:
reduction.data
Para acceder a los valores devueltos por los símbolos de la producción, se realiza con:
tokens[valor].data
donde “valor” es el número del símbolo de la derecha de la producción empezando de 0 de izquierda a derecha.
Con lo anterior, se puede realizar la comparación necesaria para efectuar acciones de acuerdo a la producción reducida.
Para poder utilizar lo anterior, se deberá crear una variable que implementará el parser:
p = pygold.Parser(‘archivo.cgt’, ‘utf-8’)
donde se indica la ruta del archivo .cgt creado anteriormente, y la codificación de caracteres a utilizar.
Con esa variable a disposición, se le asignan las funciones anteriores:
p.onReduction = onReduction
p.onToken = onToken
Para ingresar el texto a analizar, hay 2 formas:
·        p.openFile('test.input.txt')
donde se indica la ruta de un archivo de texto a analizar
·        p.openText('2+3*7/sin(cos(alfa*4)+5)')
donde se introduce directamente el texto a analizar
Para empezar el proceso, se manda a llamar la función “parse”:
result = p.parse()
Se puede guardar el valor de la última reducción realizada si al llamar a la función “parse” se le iguala una variable.
Finalmente, se cierra el archivo utilizado o el texto analizado:
p.close()
Archivo de Ejemplo:
Y así terminarían los pasos necesarios para implementar GOLD Parser en Python.

No hay comentarios:

Publicar un comentario