39 votes

Quelle technologie d'analyse syntaxique Haskell est la plus agréable à utiliser et pourquoi?

"Agréable" le sens, par exemple: vous pouvez écrire des grammaires de façon "naturelle", sans avoir à les réécrire dans un tortueux chemin, et sans avoir à introduire ennuyeux standard.

Nous allons indiquer les fins de cette question, à moins que la performance d'une technologie est pathologiquement mauvais, la performance n'est pas le plus gros problème ici.

Bien que, après avoir dit que, vous pouvez mentionner si une technologie tombe quand il vient à avoir à réécrire une grammaire pour des raisons de performances.

Merci de me donner une idée de la taille et de la complexité des grammaires qui vous avez travaillé, au moment de répondre à cette question. Aussi, si vous avez utilisé des fonctionnalités "avancées" de la technologie en question, et quelles sont vos impressions de ceux qui ont été.

Bien sûr, la réponse à cette question peut dépendre du domaine, auquel cas, je serais heureux d'apprendre ce fait.

29voto

stephen tetley Points 3622

Ça dépend vraiment de ce que vous commencez avec et ce que vous voulez faire. Il n'y a pas une taille unique pour tous.

Si vous avez une grammaire LR (par exemple, vous travaillez à partir d'une grammaire Yacc), c'est beaucoup de travail pour en faire un LL, adapté pour Parsec ou uu parsinglib. Cependant le nombre, de sepBy etc. les analyseurs sont très utiles ici, mais vous devriez vous attendre de l'analyseur à être plus lent que d'Heureux+Alex.

Pour LL combinateur de l'analyse, uu-parsinglib et c'prédécesseur uu-analyse sont gentils, mais ils manquent de quelque chose comme Parsec du Jeton et les modules de Langue sont donc peut-être moins pratique. Certaines personnes comme Malcolm Wallace Parselib parce qu'ils ont un modèle différent de Parsec de revenir en arrière mais je n'ai aucune expérience dans le domaine.

Si vous êtes le décodage de certains fichier au format plutôt que quelque chose comme un langage de programmation, Attoparsec ou similaire peut-être mieux que Parsec ou uu parsinglib. Mieux, dans ce contexte, étant plus rapide - pas seulement ByteString vs Char, mais je pense que Attoparsec fait moins de travail concernant la gestion des erreurs / l'emplacement de la source de repérage les analyseurs doivent s'exécutent plus rapidement qu'ils font moins de travail par l'élément d'entrée.

Aussi, gardez à l'esprit que les formats de fichier texte peut ne pas toujours avoir des grammaires en tant que tel, alors vous pourriez avoir à définir un certain nombre de personnalisé combinators à faire de spécial lexicale des trucs plutôt que de simplement définir "analyseur combinators" pour chaque élément.

Pour LR analyse, j'ai trouvé Ralf Hinze de Froncer les sourcils de plus agréable que de Heureux - mieux erreur de soutien et un meilleur format pour les fichiers de grammaire mais froncement de sourcils n'est pas activement maintenu et n'est pas sur le Hackage. Je pense que c'est LR(k) plutôt LR(1) ce qui signifie qu'il est plus puissant w.r.t. d'anticipation.

La Performance n'est pas vraiment un gros souci w.r.t. une grammaire. Les langages de programmation ont des grammaires, mais vous pouvez vous attendre assez de petits fichiers. Comme pour les données de formats de fichiers-il vraiment incombe au concepteur du format de la concevoir de telle manière qu'il permet efficace de l'analyse. Pour combinator analyseurs vous ne devriez pas avoir besoin de nombreuses fonctionnalités avancées pour un format de données de fichier - si vous le faites, le format est mal conçu (cela arrive parfois, malheureusement) ou de votre analyseur.

Pour le dossier que j'ai écrit un C analyseur avec un froncement de sourcils, GL-shading language avec Plaisir, un inachevé C analyseur avec UU_Parsing, et beaucoup de choses avec Parsec. Le choix pour moi était ce que j'avais au début, grammaire LR - Froncer les sourcils ou Heureux (Heureux comme froncement de sourcils n'est pas maintenu), sinon généralement Parsec (comme je l'ai dit uu_parse est sympathique mais manque la commodité de LanguageDef). Pour les formats binaires je roule moi-même, mais j'ai l'habitude d'avoir des exigences spéciales.

5voto

BenMos Points 206

Nous avons eu beaucoup de succès avec 'uu-parsinglib' - nous y sommes passés de Parsec car il est un peu plus flexible et puissant - par exemple, il peut prendre en charge l'analyse syntaxique si nécessaire, et vous n'avez pas besoin explicitement d'utiliser un combinateur (comme 'try' dans Parsec) pour marquer les points de suivi possibles

Il est vrai qu’à l’heure actuelle, vous devez en faire un peu plus sur le plan symbolique, mais pour nous, c’est un petit détail par rapport aux atouts fondamentaux de la bibliothèque.

5voto

David Place Points 31

Récemment, j'ai refondu un analyseur syntaxique DSL dans uu-parsinglib qui avait été écrit en parsec. J'ai trouvé que cela simplifiait grandement le programme. Ma principale motivation était d'obtenir l'aspect correcteur automatique. Cela fonctionne juste. C'est pratiquement gratuit! De plus, j'ai beaucoup préféré écrire mon analyseur syntaxique dans un style applicatif, par opposition au style monadique de Parsec.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X