2011-06-21 14 views
5

I tiene un programa que recieves entradas en forma de texto, por ejemplo:La implementación de la lógica de texto

IF (A.4.1-1/1 OR A.4.1-1/2) AND A.4.4-1/9 AND (A.4.4-1/12 OR A.4.4-1/13 OR A.4.4-1/14 OR A.4.4-1/15) THEN R ELSE N/A 

donde A.4.1-1/1 etc. son variables con un valor TRUE or FALSE. Hasta ahora he analizado el texto en las partes lógicas para el ejemplo anterior tengo una lista que tiene este aspecto:

['IF', '(', 'A.4.1-1/1', 'OR', 'A.4.1-1/2', ')', 'AND', 'A.4.4-1/9', 'AND', '(', 'A.4.4-1/12', 'OR', 'A.4.4-1/13', 'OR', 'A.4.4-1/14', 'OR', 'A.4.4-1/15', ')', 'THEN', 'R', 'ELSE', 'N/A'] 

Me pregunto ¿es posible llevar a cabo realmente la lógica en esta lista como combinar todos esto hasta en las declaraciones python adquiridas y proporcionar el resultado. No estoy seguro de comenzar ¿He leído en algunos sitios que debería usar un analizador de arriba hacia abajo?

+0

Es posible que desee echar un vistazo a shlex: http://docs.python.org/library/shlex.html –

+0

Gracias por la ayuda voy a echar un vistazo a este –

Respuesta

6

Esto suena como una tarea para Pyparsing:

El módulo pyparsing es un enfoque alternativo para la creación y ejecución gramáticas simples, frente al enfoque lex/yacc tradicional, o el uso de regulares expresiones. El módulo pyparsing proporciona una biblioteca de clases que el código del cliente usa para construir la gramática directamente en el código Python.

Podrá definir rápidamente su gramática (en lugar de jugar con expresiones regulares) y acciones específicas de análisis. He creado mini-idiomas muy ricos usando Pyparsing en menos de 300 líneas de código.

+0

El SimpleBool. Ejemplo de py de la wiki de pyparsing La página de ejemplos probablemente encajaría bastante bien. – PaulMcG

+0

@Paul: y supongo que ya sabes, porque escribiste Pyparsing;) – Escualo

+0

Gracias por la ayuda paul :) –

1

No soy un chico de Python, pero he hecho cosas similares en Java usando JavaCC. Lo que querrá hacer es escribir un grammar para su idioma (en un formato como EBNF, pero depende del generador del analizador), luego use un programa como JavaCC para generar un analizador, lo que le dará un parse tree eso es más conveniente de manipular.

Debería poder encontrar muchos ejemplos útiles, ya que la gramática de su entrada no parece demasiado inusual (operadores booleanos, expresiones entre paréntesis y declaraciones if-then-else son probablemente algunos de los casos de uso más comunes) para esto).

Puede encontrar una de las bibliotecas de Python listed on this page útil.

+0

Gracias estudiará esta –

Cuestiones relacionadas