42 votes

Parsec vs Yacc / Bison / Antlr: Pourquoi et quand utiliser Parsec?

Je suis nouveau sur Haskell et Parsec. Après la lecture du Chapitre 16 Utilisation de Parsec de Real World Haskell, une question est apparu dans mon esprit: Pourquoi et quand est-Parsec mieux que d'autres analyseur générateurs comme Yacc/Bison/Antlr?

Ma compréhension est que Parsec crée une belle DSL d'écrire des analyseurs et Haskell, il est très facile et expressive. Mais l'analyse est d'une telle norme/technologie populaire qui mérite sa propre langue, sorties à plusieurs langues cibles. Alors, quand allons-nous utiliser Parsec au lieu de, disons, la génération de code Haskell du Bison/Antlr?

Cette question pourrait aller un peu au-delà de la technologie, et dans le domaine de la pratique de l'industrie. Lors de l'écriture d'un analyseur à partir de zéro, quel est l'avantage de ramasser Haskell/Parsec par rapport à Bison/Antlr ou quelque chose de similaire?

BTW: ma question est assez similaire à ce un seul , mais n'a pas répondu de façon satisfaisante, il.

56voto

Jörg W Mittag Points 153275

L'une des principales différences entre les outils que vous avez énumérés, c'est que ANTLR, de Bisons et de leurs amis sont analyseur de générateurs, alors que le Parsec est un analyseur de combinateur de la bibliothèque.

Un analyseur générateur de lit dans une description d'une grammaire et crache un analyseur. Il n'est généralement pas possible de combiner des grammaires existantes dans une nouvelle grammaire, et ce n'est certainement pas possible de combiner les deux ont généré des analyseurs dans un nouveau parser.

Un analyseur combinator otoh, que ne fait rien , mais combiner les analyseurs existants dans de nouveaux analyseurs. Généralement, un analyseur combinator bibliothèque est livrée avec un couple de trivial intégré analyseurs qui peut analyser la chaîne vide ou un seul caractère, et il est livré avec un jeu de combinators que prendre 1 ou plusieurs analyseurs et de retourner une nouvelle qui, par exemple, l'analyse de la séquence de l'origine des analyseurs syntaxiques (par exemple, vous pouvez combiner un d de l'analyseur et un o de l'analyseur pour former un do parser), l'alternance de l'origine des analyseurs syntaxiques (par exemple, un 0 de l'analyseur et un 1 de l'analyseur à un 0|1 parser) ou les traite de l'origine analyser à plusieurs reprises (repetetion).

Ce que cela signifie est que vous pouvez, par exemple, prendre un analyseur syntaxique pour Java, et un analyseur de HTML et de les combiner dans un analyseur syntaxique pour les JSP.

La plupart analyseur de générateurs de ne pas soutenir le projet, ou seulement de le soutenir, de façon limitée. Analyseur combinators otoh, que seulement en charge ce et rien d'autre.

9voto

stephen tetley Points 3622

Vous pourriez voir cette question ainsi que la liés les uns dans votre question.

Qui Haskell analyse de la technologie est le plus agréable à utiliser, et pourquoi?

En Haskell, la concurrence est entre Parsec (et d'autres analyseur combinators) et de l'analyseur générateur de Plaisir. Je choisirais Heureux si j'avais déjà une grammaire LR de travailler à partir d' - analyseur combinators prendre dans les grammaires LL forme et la traduction à partir de LR LL prend un peu d'effort et un combinateur de l'analyseur sera généralement beaucoup plus lents. Si je n'ai pas de grammaire, je vais utiliser Parsec, il est plus souple (puissants) que Heureux et de ses plus de plaisir à travailler "Haskell" que de générer du code avec Plaisir et Alex. Si vous utilisez Heureux pour l'analyse, vous avez presque toujours besoin d'Alex pour lexing.

Pour la pratique de l'industrie, il serait étrange de décider de les utiliser Haskell juste pour obtenir Parsec. Pour l'analyse, la plupart de la récolte actuelle de langues ont au moins un analyseur générateur et probablement quelque chose de plus souple comme un port de Parsec ou un PEG système.

Ira Baxter, en réponse à la question a été localisé sur un analyseur de vous obtenir de simplement à pied de l'Himalaya pour la rédaction d'un traducteur, mais faisant partie d'un traducteur n'est qu'une des utilisations pour un analyseur syntaxique, donc il y a encore de nombreux domaines où assez minimaliste comme les systèmes de ANTLR, Heureux et Parsec sont satisfaisants.

6voto

chrisdb Points 822

À la suite de stephen réponse, je pense que l'une des la plupart des produits de remplacement de Parsec, si vous voulez coller avec analyseur combinators, est attoparsec. La principale différence est que attoparsec a été écrit avec plus d'un biais en faveur de vitesse, et fait des compromis en conséquence. Par exemple, Parsec fait un peu de tenue des livres pour essayer de retourner des messages d'erreur utiles si un parse échoue, ce qui attoparsec ne fait pas dans la même mesure. Aussi, je pense que attoparsec est spécialisé pour un flux d'entrée/type de jeton, alors que Parsec résumés à partir du type d'entrée de sorte qu'il peut analyser les flux de type Chaîne de caractères, ByteString, Texte, etc. sans problème.

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