Scala parser combinators vs ANTLR / Java generated parser?
j'écris un analyseur d'expressions pour une application écrite principalement en Scala. J'ai construit des objets AST à Scala, et j'ai maintenant besoin d'écrire l'analyseur. J'ai entendu parler des combinateurs d'analyseur intégrés de Scala, et aussi D'ANTLR3, et je me demande: qui fournirait une meilleure performance et la facilité d'écriture de code? Pour l'instant:
ANTLR pros
- bien connu
- Rapide
- DSL externe
- ANTLRWorks (grand IDE pour parser grammaire de débogage/test)
ANTLR cons
- Java (Scala interopérabilité peut être difficile, aucune expérience?)
- Nécessite une grande dépendance à l'exécution
Analyseur de combinateur pros
- Partie de la Scala
- une étape de construction en moins
- pas besoin de dépendance à l'exécution; par exemple déjà inclus dans L'exécution de Scala bibliothèque
Analyseur de combinateur cons
- DSL interne (peut signifier une exécution plus lente?)
- No ANTLRWorks (fournit des fonctionnalités de test et de visualisation de l'analyseur nice)
des idées?
EDIT: Cette expression analyseur analyse algébrique/calcul des expressions. Il sera utilisé dans l'application Magnificalc pour Android quand il est finalisé.
4 réponses
les combinateurs d'analyse de Scala ne sont pas très efficaces. Ils n'étaient pas conçus pour être. Ils sont bons pour faire de petites tâches avec peu d'intrants.
Donc cela dépend vraiment de vos besoins. Il ne devrait pas y avoir de problèmes interop avec ANTLR. Appeler Scala depuis Java peut être difficile, mais appeler Java depuis Scala fonctionne presque toujours.
Je ne m'inquiéterais pas des limites de performance des combinateurs d'analyseur à moins que vous n'ayez prévu d'analyser des expressions algébriques de quelques pages. Le Livre de programmation Scala mentionne qu'une mise en œuvre plus efficace des combinateurs parser est faisable. Peut-être que quelqu'un trouvera le temps et l'énergie d'en écrire un.
je pense qu'avec ANTLR vous parlez d' deux étapes supplémentaires de compilation: ANTLR compile vers Java, et vous devez compiler à la fois Scala et Java to bytecode, au lieu de simplement Scala.
j'ai créé des DSL externes à la fois avec des combinateurs D'analyseur de langage ANTLRv4 et Scalas et je préfère clairement les combinateurs d'analyseur, parce que vous obtenez un excellent support d'éditeur lors de la conception du langage et il est très facile de transformer vos résultats d'analyse à n'importe quelle structure de données de classe de cas AST. Le développement des grammaires ANTLR prend beaucoup plus de temps, car, même avec le support de L'éditeur ANTLRWorks, le développement des grammaires est très sujet aux erreurs. L'ensemble du flux de travail ANTLR me semble tout à fait gonflé par rapport à la analyseur combinators".
j'ai tendance à essayer de produire un externe DSL utilisant des combinateurs d'analyseurs. Ça ne devrait pas être un DSL interne. Mais je ne sais pas qu'il serait mieux.
La meilleure approche pour comprendre cela, serait de prendre une version simplifiée de la grammaire, essayez les deux méthodes pour évaluer les différences.