scraping - Recursos para lexing, tokenising y parsing en python
requests_html (7)
Aquí hay algunas cosas para comenzar (más o menos de la más simple a la más compleja, de la menos a la más poderosa):
Cuando aprendí esto, fue en un curso universitario de 400 niveles de un semestre. 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: principios del diseño del compilador .
Espero que eso sea suficiente para que comiences :)
¿Pueden las personas señalarme recursos sobre lexing, análisis y tokenización con Python?
Estoy pirateando un proyecto de código abierto ( hotwire ) y quería hacer algunos cambios en el código que lexes , analiza y tokeniza los comandos ingresados en él. Como es un código de trabajo real, es bastante complejo y un poco difícil de resolver.
No he trabajado en el código para lex / parse / tokenise antes, así que estaba pensando 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 ...)
Edición: (7 de octubre de 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, ¿podría alguien dirigirme a un tutorial donde pueda construir un analizador básico desde cero, usando solo Python?
Esta pregunta es bastante antigua, pero tal vez mi respuesta ayude 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. De modo que esto ayudará a cualquiera que desee comprender el funcionamiento interno de análisis sintáctico, lexing y tokenización:
"Un simple intepreter de cero en Python:" Parte 1 , Parte 2 , Parte 3 y Parte 4 .
Para gramáticas de complejo medio, PyParsing es brillante. Puede definir gramáticas directamente dentro del código de 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 de inicio de PyParsing).
Con las acciones de análisis (funciones que se invocan cuando se activa 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.
Soy un usuario feliz de PLY . Es una implementación pura de Python de Lex & Yacc, con muchas pequeñas sutilezas que la hacen bastante pionera y fácil de usar. Debido a que Lex & Yacc son las herramientas de lectura y análisis más populares y se usan para la mayoría de los proyectos, PLY tiene la ventaja de estar sobre los hombros de los gigantes. Existe una gran cantidad de conocimiento en línea en Lex & Yacc, y puedes aplicarlo libremente a PLY.
PLY también tiene una buena página de documentación con algunos ejemplos simples para comenzar.
Para obtener una lista de muchas herramientas de análisis Python, vea this .
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.
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.