parsing - sintactico - tipos de lenguajes de marcado
Escribir un analizador(para un lenguaje de marcado): teoría y práctica (4)
Lo mejor que puedo pensar es que Terrence Parr, el tipo que lidera el generador de analizadores ANTLR , ha escrito un lenguaje de marcado documentado aquí . De todos modos, hay código fuente allí para mirar.
Me gustaría escribir un analizador idiomático para un lenguaje de marcas como Markdown. Mi versión será ligeramente diferente, pero percibo al menos una necesidad menor de algo así en Clojure, y me gustaría participar.
No quiero utilizar un lío de RegExes (aunque me doy cuenta de que algunos serán probablemente necesarios), y me gustaría hacer algo poderoso y en idiomático Clojure .
He comenzado algunos intentos diferentes (principalmente en papel), pero estoy terriblemente feliz con ellos, ya que siento que solo estoy improvisando. Eso estaría bien, pero he explorado bastante en el lenguaje de Clojure en el último mes o dos, y me gustaría, al menos en parte, seguir el camino de los gigantes.
Me gustaría algunos consejos, sugerencias o recursos (los libros de O''Reilly serían increíbles, me encantan algunos libros electrónicos, pero Amazon o donde sea sería genial también). Lo que sea que puedas ofrecer
EDITAR Brian Carper tiene una publicación interesante sobre el uso de ANTLR de Clojure .
También hay clojure-pg y fnparse , que son analizadores-analizadores Clojure. fnparse incluso parece que tiene una documentación decente.
¡Todavía estoy buscando recursos, etc.! Solo pensé en actualizarlos con algunos hallazgos propios.
Dos traductores de marcado funcional son;
- Pandoc , un markdown implementado en Haskell con fuente en github
- Simple_markdown implementado en OCaml.
Otro aún no mencionado aquí es clarsec , un puerto de la biblioteca parsec de Haskell.
Recientemente he estado en una misión muy similar para construir un analizador sintáctico en Clojure. Fui bastante abajo en el camino fnparse, en particular usando el fnparse 3 (aún inédito) que puedes encontrar en la rama de desarrollo en github. Se divide en dos formas: sabueso (específicamente para LL (1) solo analizadores sintácticos anticipados) y gato, que es un analizador sintáctico de paquetes. Ambos son analizadores funcionales basados en mónadas (como clarsec). fnparse tiene un trabajo impresionante: la capacidad de documentar su analizador sintáctico, generar mensajes de error, etc. es clara. La documentación en la rama de desarrollo no existe, a excepción de los documentos de función, que en realidad son bastante buenos. Al final, llegué a algunos obstáculos con el intento de hacer LL (k). Creo que es posible hacer que funcione, es difícil sin un buen conjunto de ejemplos sobre cómo hacer un buen trabajo de retroceso. También estoy tan familiarizado con los analizadores sintácticos que se separan y analizan que fue difícil para mí pensar de esa manera. Todavía estoy muy interesado en esto como una buena solución en el futuro.
Mientras tanto, volví a Antlr , que es muy robusto, bien recorrido, bien documentado (en 2 libros), etc. No tiene un back-end de Clojure, pero espero que lo haga en el futuro. , que lo haría realmente agradable para el trabajo de analizador. Lo estoy usando para leer, analizar, transformar árboles y crear plantillas a través de StringTemplate. No ha sido completamente libre de golpes, pero hasta ahora he podido encontrar soluciones viables para todos los problemas. El algoritmo único de análisis de LL (*) de Antlr le permite escribir gramáticas realmente legibles pero aún así hacerlas bastante eficientes (y ajustar las cosas gradualmente si no lo están).