2010-08-06 14 views
14

me gustaría escribir un analizador idiomática para un lenguaje de marcas como de rebajas. Mi versión será ligeramente diferente, pero percibo al menos una necesidad menor de algo así en Clojure, y me gustaría participar.Escribir un analizador (para un lenguaje de marcas): Teoría y Práctica

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 (sobre todo 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 o sugerencias, o recursos (libros de O'Reilly sería impresionante-love me algunos libros electrónicos-Sin embargo, Amazon o donde quiera llegar a ser grande, también). Lo que sea que puedas ofrecer

EDIT Brian Carper tiene una publicación interesante en using ANTLR from Clojure.

También hay clojure-pg y fnparse, que son analizadores-analizadores Clojure. fnparse incluso parece que tiene una documentación decente.

¡Sigue buscando recursos, etc.! Solo pensé en actualizarlos con algunos hallazgos propios.

+1

La pregunta de los recursos del compilador canónico es [Aprender a escribir un compilador] (http://stackoverflow.com/questions/1669/learning-to-write-a-compiler) que presumiblemente aborda * algunos * de su pregunta. – dmckee

+0

Ah gracias por ese recordatorio: ese es un buen hilo, pero probablemente cubre un * bit * más de lo que me interesa para los propósitos de este proyecto. Aunque he estado buscando una excusa para leer/practicar el Dragon Book & co. – Isaac

+0

Las expresiones regulares nunca son necesarias. – strager

Respuesta

5

También hay clj-peg proyecto, que permite especificar la gramática PEG para analizar datos

+0

Ah, eso es bastante limpio. Buen hallazgo! Estoy investigando eso. – Isaac

+0

Comencé a verificar la fuente (después de haber revisado los documentos) y parece que podría ser la respuesta. No se ha actualizado, por lo que puedo ver, desde febrero. Le envié un correo electrónico al tipo que lo escribió, y le pregunté si podría estar interesado en pegarlo en GitHub. ¡Gracias por el consejo! – Isaac

+0

Me ha enviado un correo electrónico diciendo que habrá una importante actualización/reescritura muy pronto. FYI – Isaac

6

mejor que se me ocurre es que Terrence Parr - el tipo que lleva el ANTLR parser generator - ha escrito un lenguaje de marcas documentado here. De todos modos, hay código fuente allí para mirar.

+0

Interesante, tendré que verificarlo. Por desgracia, escrito en Java, pero algunas de las ideas sin duda serían aplicables, incluso si el estilo no lo es. (Noté toneladas de clases de "relleno", pero bueno, así es como lo haces, simplemente es más difícil conceptualizarlo en un lenguaje funcional.) – Isaac

+0

Bueno, ¿es correcto? Java-interop es excelente, ¿por qué no escribir una API clojure para ANTLR? Parece un proyecto que muchos se beneficiarían de ... – mcpeterson

+0

Es verdad, la gente podría, pero he tenido más de lo que me gusta al envolver libs de Java durante el último mes. Tiempo para un poco más de Just Clojure ™. ¡Sin embargo, definitivamente es algo que debo tener en cuenta! – Isaac

2

Dos traductores de marcado son funcionales;

+0

¡Gracias! Esos son algunos buenos recursos. Mi Haskell es un poco débil, pero podría ser capaz de encontrarle sentido, pero mi OCamle es inexistente. ¡Gracias! – Isaac

4

Otro aún no mencionado aquí es clarsec, un puerto de la biblioteca parsec de Haskell.

recientemente he estado en una búsqueda muy similar para construir un analizador 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 develop 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, he retrocedido a Antlr, que es muy robusto, transitado, bien documentado (en 2 libros), etc. No tiene un back-end Clojure, pero espero que lo hará en el futuro, lo que lo haría realmente agradable para el trabajo de analizador sintáctico. 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 son).

+0

Muy interesante, también lo investigaré. Volveré a mirar a Antlr, pero creo que me gustaría ayudar a que un analizador Clojure existente sea aún mejor. – Isaac

Cuestiones relacionadas