2008-08-31 15 views
50

¿Pueden las personas indicarme los recursos en lexing, análisis y tokenización con Python?Recursos para lexing, tokenising y análisis en python

estoy haciendo un poco de piratería en un proyecto de código abierto (hotwire) y quería hacer algunos cambios al código que lexes, parses and tokenises los comandos entraron en ella. Como es un código de trabajo real, es bastante complejo y un poco difícil de resolver.

No he trabajado en código para lex/parse/tokenise antes, así que pensé que un enfoque sería trabajar a través de un tutorial o dos en este aspecto. Espero aprender lo suficiente para navegar por el código que realmente quiero modificar. ¿Hay algo adecuado por ahí? (Lo ideal sería hacerlo en una tarde sin tener que comprar y leer primero el libro de dragones ...)

Editar: (7 Oct 2008) Ninguna de las respuestas a continuación dan lo que quiero. Con ellos podría generar analizadores sintácticos desde cero, pero quiero aprender a escribir mi propio analizador básico desde cero, sin usar lex ni yacc ni herramientas similares. Habiendo hecho eso, puedo entender mejor el código existente.

Entonces, ¿alguien podría dirigirme a un tutorial donde pueda construir un analizador básico desde cero, usando solo Python?

Respuesta

4

Tenga una mirada en el módulo estándar shlex y modificar una copia de la misma para que coincida con la sintaxis que utiliza para su cáscara, que es un buen punto de

de partida Si desea que todo el poder de una solución completa para el léxico/Analizando, ANTLR puede generar python también.

3

Sugiero http://www.canonware.com/Parsing/, ya que es pura python y no es necesario que aprendas una gramática, pero no se usa ampliamente, y tiene comparativamente poca documentación. El peso pesado es ANTLR y PyParsing. ANTLR también puede generar analizadores de Java y C++, y walkers AST, pero tendrás que aprender lo que equivale a un nuevo idioma.

28

Soy un usuario feliz de PLY. Es una implementación pura de Python de Lex & Yacc, con muchas pequeñas sutilezas que lo hacen bastante pitónico y fácil de usar. Desde Lex & Yacc son las herramientas de análisis lexing & más populares y se utilizan para la mayoría de los proyectos, PLY tiene la ventaja de pararse sobre los hombros de los gigantes. Existe una gran cantidad de conocimiento en línea en Lex & Yacc, y puede aplicarlo libremente a PLY.

PLY también tiene una buena documentation page con algunos ejemplos simples para empezar.

Para obtener una lista de muchas herramientas de análisis Python, consulte this.

+0

En segundo lugar la recomendación para PLY, es genial. – mipadi

4

pygments es un resaltador de sintaxis de código fuente escrito en python. Tiene lexers y formateadores, y puede ser interesante echar un vistazo a la fuente.

15

Para gramáticas de complejo medio, PyParsing es brillante. Se pueden definir las gramáticas directamente en el código Python, sin necesidad de generación de código:

>>> from pyparsing import Word, alphas 
>>> greet = Word(alphas) + "," + Word(alphas) + "!" # <-- grammar defined here 
>>> hello = "Hello, World!" 
>>>> print hello, "->", greet.parseString(hello) 
Hello, World! -> ['Hello', ',', 'World', '!'] 

(Ejemplo tomado de la página principal PyParsing).

Con las acciones de análisis (funciones que se invocan cuando se desencadena una determinada regla de gramática), puede convertir los análisis directamente en árboles de sintaxis abstracta o cualquier otra representación.

Hay muchas funciones auxiliares que encapsulan patrones recurrentes, como jerarquías de operador, cadenas entrecomilladas, anidamiento o comentarios de estilo C.

+3

Por lo que vale, siempre he tenido problemas con PyParsing. Intenté utilizarlo varias veces y nunca estuve completamente satisfecho con el resultado (por ejemplo, me llevó mucho tiempo, me costó depurar, necesité más código del que esperaba, etc.). No puedo decir si esto se debe a mi ignorancia oa un error en PyParsing, aunque ... –

4

Aquí hay algunas cosas para que pueda empezar (aproximadamente desde simple-a-más-compleja,-menos a la mayoría omnipotente):

http://en.wikipedia.org/wiki/Recursive_descent_parser

http://en.wikipedia.org/wiki/Top-down_parsing

http://en.wikipedia.org/wiki/LL_parser

http://effbot.org/zone/simple-top-down-parsing.htm

http://en.wikipedia.org/wiki/Bottom-up_parsing

http://en.wikipedia.org/wiki/LR_parser

http://en.wikipedia.org/wiki/GLR_parser

Cuando supe esto, fue en un curso universitario de nivel 400 semestre de duración. Hicimos una serie de asignaciones donde hicimos el análisis a mano; si realmente quieres entender lo que sucede debajo del capó, te recomendaría el mismo enfoque.

Este no es el libro que utilicé, pero es bastante bueno: Principles of Compiler Design.

Con suerte eso es suficiente para empezar :)

+5

¿Cómo ayuda eso a alguien que sabe todo eso, pero está buscando implementaciones en Python? – Alex

17

Esta pregunta es bastante viejo, pero tal vez mi respuesta sería ayudar a alguien que quiera aprender los conceptos básicos. Encuentro que este recurso es muy bueno. Es un intérprete simple escrito en python sin el uso de ninguna biblioteca externa. Así que esto ayudará a cualquier persona que quiera entender el funcionamiento interno de análisis sintáctico, léxico, y tokenising:

"Un Intepreter simple desde cero en Python:" Part 1, Part 2, Part 3 y Part 4.

+4

Muy buena serie de artículos con enfoque en el objetivo en lugar de las herramientas! – Janus

Cuestiones relacionadas