10
votes

Quels sont les inconvénients de l'utilisation d'Antlr par rapport à Flex / Bison?

J'ai travaillé sur Flex, bison il y a quelques années au cours de mes études de premier cycle. Cependant, je ne me souviens pas grand chose à ce sujet maintenant. Récemment, je suis venu entendre parler d'Antlr.

  • Recommanderiez-vous que j'apprends d'AntLR ou mieux pour brosser Flex / Bison?
  • Atlr a-t-il plus / moins de fonctionnalités que Flex / Bison?

3 Réponses :


10
votes

antlrv3 est ll (k) et peut être configuré pour être ll (*). Ce dernier en particulier est ridiculement facile à écrire des analyseurs, comme vous pouvez essentiellement utiliser EBNF tel quel.

En outre, AntLR génère un code assez telle que l'analyseur de descente récursive que vous écririez à partir de zéro. C'est très lisible et facile à déboguer de voir pourquoi l'analyse ne fonctionne pas, ou fonctionne mal.

L'avantage de Flex / Bison (ou de tout autre analyseur Lalr) est qu'il est plus rapide.


4 commentaires

Plus rapide? Comparez-vous Lalr à ll (k) ou ll (*)? Ll (k) l'analyse est assez rapide. LL (*) L'analyse est lente à cause de la rampe, mais vous devez rarement l'utiliser (et même lorsque vous le faites, je crois que Antlr vous permet d'utiliser ll (*) pour un sous-ensemble de votre grammaire). L'avantage que je sache que je connaisse, c'est qu'il existe certaines grammates qui ne peuvent pas être analysées ll (k) pouvant être analysées Lalr, mais dans la pratique la plupart des grammaires que vous avez réellement veulent à L'analyse peut être réexprimée sous une forme pouvant être analysée LL (k).


Oui. Lalr est plus rapide car vous pouvez utiliser une machine à états finie entraînée par une table pour cela. C'est incompréhensible et presque impossible de déboguer qu'une fois qu'il est produit par un générateur d'analyseur comme Bison, mais c'est aussi très vite. LL (K) Comme mis en œuvre par AntLR utilise une analyse de descente récursive, ce qui est quelque peu plus lent.


Je viens d'essayer l'outil AntlRworks et la chose suivante n'a pas fonctionné: Expr: Expr '+' Expr; parce que cela ne permet pas la récursion de gauche. Ne trouvez-vous pas tous un peu gênant. Vous devez ensuite le convertir quelque chose comme Expr: Expr ('+' Expr) * I.e. Ecrivez-le comme une expression régulière. Dans Flex, je pouvais écrire la voie première et je l'ai trouvé beaucoup plus naturel que ce style de regex.


@ajay, c'est le gist de la différence. Pour certaines constructions, les écrives à droite récursif sont plus naturelles. Pour d'autres, les écrire de gauche-récursif sont plus naturels. Cela dit, pour une grammaire simple pour quelque chose comme 1 * (2 + 3) - 4 que votre exemple suggère, vous préférez écrire quelque chose comme: expr: terme ('+' | '-') expr; Terme: Facteur ('*' | '/') Terme; facteur: littéral_number | '(' expr ')' . Lequel est plus naturel est une question de débat, mais remarquez comment ANTLR n'a pas besoin d'une construction spéciale pour l'association de l'opérateur - elle est inhérente aux termes de la grammaire elles-mêmes.



0
votes

Nous avons décidé d'utiliser ANTLR pour certaines de nos exigences de traitement d'informations - analysant les fichiers hérités et la langue naturelle. La courbe d'apprentissage est escarpée UT Nous en obtenons de dessus et je pense que c'est une approche plus moderne et polyvalente pour ce que nous devons faire. Les inconvénients - depuis que vous demandez - sont principalement la courbe d'apprentissage qui semble être inévitable.


1 commentaires

Je soupçonne la courbe d'apprentissage pour à peu près n'importe quel générateur d'analyseur est à peu près la même chose. Il ne faut que 5 minutes pour "techniquement" comprendre la phrase "C'est Lalr ..." ou "c'est ll ..." Il faut des semaines pour groker la machinerie que vous devez utiliser, pour obtenir un grammier qui s'est étendu à la forme, à Apprenez à plier la grammaire, ... toutes les choses étant égales, les courbes d'apprentissage étant similaires, vous devriez choisir le plus puissant générateur d'analyseurs qui fonctionne dans votre monde.



2
votes

Antlr possède un pot de bibliothèque de temps d'exécution que vous devez inclure dans votre projet.

Les analyseurs de descendance récursif de AntLR sont plus faciles à déboguer que les analyseurs «ascendants» générés par Flex / Bison, mais les règles de la grammaire sont légèrement différentes.

Si vous voulez un générateur d'analyseurs de style flex / bison (LALR) pour Java, regardez Javacc .


0 commentaires