2010-08-06 5 views
14

Je voudrais écrire un analyseur idiomatique pour un langage de balisage comme Markdown. Ma version sera légèrement différente, mais je perçois au moins un besoin mineur de quelque chose comme ça dans Clojure, et j'aimerais y aller.Écrire un analyseur (pour un langage de balisage): théorie et pratique

Je ne veux pas utiliser un désordre de RegExes (bien que je réalise que certains seront probablement nécessaires), et Je voudrais faire quelque chose à la fois puissant et idiomatique Clojure.

J'ai commencé quelques tentatives différentes (surtout sur papier), mais je suis terriblement heureux avec eux, car j'ai l'impression d'improviser. Ce serait bien, mais j'ai fait beaucoup d'exploration dans la langue de Clojure au cours du dernier mois ou deux, et je voudrais suivre, au moins en partie, dans les voies des géants. Je voudrais des pointeurs, des suggestions, ou des ressources (les livres d'O'Reilly seraient géniaux - aimez-moi quelques eBooks - mais Amazon ou serait génial, aussi). Tout ce que vous pouvez offrir.

EDIT Brian Carper a un poste intéressant sur using ANTLR from Clojure.

Il y a aussi clojure-pg et fnparse, qui sont des générateurs d'analyseur Clojure. fnparse semble même avoir une documentation décente.

Toujours à la recherche de ressources, etc! Je pensais juste que je mettrais à jour ces derniers avec quelques conclusions de mon propre.

+1

La question canonique des ressources du compilateur est [Apprendre à écrire un compilateur] (http://stackoverflow.com/questions/1669/learning-to-write-a-compiler) qui répond sans doute à * quelques * questions. – dmckee

+0

Ah merci pour ce rappel-c'est un bon fil conducteur, mais il couvre probablement un peu plus que ce qui m'intéresse dans le cadre de ce projet. Bien que je cherche une excuse pour lire/pratiquer le Dragon Book & co. – Isaac

+0

Les expressions régulières ne sont jamais nécessaires. – strager

Répondre

5

Il y a aussi clj-peg projet, qui permet de spécifier la grammaire PEG pour les données d'analyse syntaxique

+0

Ah, c'est plutôt joli. Belle trouvaille! Je regarde dans ça. – Isaac

+0

J'ai commencé à vérifier la source, (après avoir parcouru les documents), et cela semble être la réponse. D'après ce que je peux voir, il n'a pas été mis à jour depuis février. J'ai envoyé un courriel au gars qui l'a écrit, et lui ai demandé s'il pourrait être intéressé à le coller sur GitHub. Merci pour le conseil! – Isaac

+0

Il m'a envoyé un courriel, disant qu'il y aura une mise à jour majeure/réécriture à venir très bientôt! FYI – Isaac

6

Je pense que Terrence Parr - le gars qui dirige le ANTLR parser generator - a écrit un langage de balisage documenté here. De toute façon, il y a du code source à regarder.

+0

Intéressant-je vais devoir vérifier cela. Hélas, écrit en Java, mais certaines des idées seraient certainement applicables, même si le style ne l'est pas. (Noté des tonnes de classes de «remplissage», mais bon, c'est comme ça que vous le faites, mais plus difficile à conceptualiser dans un langage fonctionnel.) – Isaac

+0

Eh bien, sa clojure n'est-ce pas? Java-interop est excellent, pourquoi ne pas écrire une API clojure pour ANTLR? On dirait un projet dont beaucoup pourraient bénéficier ... – mcpeterson

+0

C'est vrai, les gens le peuvent, mais j'ai eu plus que ma part de librairies Java au cours du mois passé. Il est temps de faire un peu plus de Just Clojure ™. C'est définitivement quelque chose que je dois garder à l'esprit, cependant! – Isaac

2

Deux traducteurs de balisage fonctionnels sont;

+0

Merci! Ce sont de bonnes ressources. Mon Haskell est un peu faible, mais je pourrais être en mesure de le comprendre, mais mon OCamle est inexistant. Merci! – Isaac

4

Une autre non encore mentionnée ici est clarsec, un port de la bibliothèque parsec de Haskell.

J'ai récemment fait une quête très similaire pour construire un analyseur dans Clojure. Je suis allé assez loin sur le chemin de fnparse, en particulier en utilisant le fnparse 3 (encore inédit) que vous pouvez trouver dans la branche develop sur github. Il est divisé en deux formes: chien de chasse (spécifiquement pour LL (1) parseurs single-lookahead) et chat, qui est un parser packrat. Les deux sont des analyseurs syntaxiques fonctionnels construits sur des monades (comme clarsec). fnparse a un travail impressionnant - la possibilité de documenter votre analyseur syntaxique, de générer des messages d'erreur, etc. La documentation sur la branche de développement est inexistante mais différente de la fonction docstrings, qui est en fait assez bonne. À la fin, j'ai heurté quelques barrages routiers en essayant de faire fonctionner LL (k). Je pense qu'il est possible de le faire fonctionner, c'est juste difficile sans un ensemble décent d'exemples sur la façon de faire du backtracking fonctionne bien. Je suis aussi très familier avec les parseurs qui divisent lexique et l'analyse syntaxique qu'il était difficile pour moi de penser de cette façon. Je suis toujours très intéressé par cela comme une bonne solution dans le futur.

En attendant, je suis revenu à Antlr, qui est très robuste, bien voyagé, bien documenté (en 2 livres), etc. Il n'a pas de back-end Clojure mais j'espère sera à l'avenir, ce qui le rendrait vraiment agréable pour le travail parser. Je l'utilise pour lexique, l'analyse syntaxique, la transformation d'arbre et la modélisation via StringTemplate. Il n'a pas été complètement sans heurt, mais j'ai été capable de trouver des solutions réalisables à tous les problèmes jusqu'à présent. L'algorithme unique d'analyse syntaxique LL (*) d'Antlr vous permet d'écrire des grammaires réellement lisibles tout en les rendant relativement efficaces (et en ajustant les choses graduellement si elles ne le sont pas).

+0

Très intéressant-je vais regarder cela aussi. Je regarderai à nouveau Antlr, mais je pense que je voudrais aider à améliorer encore un analyseur Clojure existant. – Isaac

Questions connexes