2009-11-26 2 views
9

J'ai travaillé sur Flex, Bison il y a quelques années pendant mes études de premier cycle. Cependant, je ne m'en souviens pas beaucoup maintenant. Récemment, j'ai entendu parler d'ANTLR.Quels sont les inconvénients de l'utilisation d'ANTLR par rapport à Flex/Bison?

  • Recommanderiez-vous que j'apprenne l'ANTLR ou mieux de brosser Flex/Bison?
  • Est-ce que ANTLR a plus/moins de fonctionnalités que Flex/Bison?
+0

L'inverse [avantages-de-antlr-versus-say-lex-yacc-bison] (http://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc -bison) – nawfal

+0

Copie possible de [Avantages de Antlr (versus say, lex/yacc/bison)] (https://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc-bison @ nawfal: Oui. – einpoklum

Répondre

7

ANTLRv3 est LL (k) et peut être configuré pour être LL (*). Ce dernier en particulier est ridiculement facile à écrire dans les analyseurs, car vous pouvez essentiellement utiliser EBNF tel quel. En outre, ANTLR génère du code qui ressemble beaucoup à l'analyseur de descente récursif que vous écririez de zéro. Il est très lisible et facile à déboguer pour 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.

+0

Plus rapide? Comparez-vous LALR à LL (k) ou LL (\ *)? LL (k) analyse est assez rapide. LL (\ *) est lent à cause du backtracking, mais vous avez rarement besoin de l'utiliser (et même quand vous le faites, je crois que ANTLR vous permet d'utiliser LL (\ *) pour un sous-ensemble de votre grammaire). Le seul avantage que je connaisse est qu'il y a certaines grammaires qui ne peuvent pas être analysées LL (k) qui peuvent être analysées LALR, mais en pratique la plupart des grammaires que vous voulez * analyser * peuvent être analysées. exprimé sous une forme qui peut être analysée LL (k). –

+2

Oui. LALR est plus rapide car vous pouvez utiliser une machine à états finis pilotée par table pour cela. C'est incompréhensible et presque impossible à déboguer une fois qu'il est produit par un générateur de parser comme Bison, mais c'est aussi très rapide. LL (k) tel que mis en œuvre par ANTLR utilise l'analyse de descente récursive, ce qui est un peu plus lent. –

+0

J'ai juste essayé l'outil antlrworks et la chose suivante n'a pas fonctionné: expr: expr '+' expr; car il n'autorise pas la récursivité à gauche. Ne trouvez-vous pas cela un peu gênant. Vous devez ensuite le convertir en quelque chose comme expr: expr ('+' expr) * , c'est-à-dire l'écrire comme une expression régulière. En flex je pourrais écrire l'ancienne façon et je l'ai trouvé beaucoup plus naturel que ce style regex. – user855

0

Nous avons décidé d'utiliser ANTLR pour certaines de nos exigences en matière de traitement de l'information - analyse des fichiers existants et langage naturel. La courbe d'apprentissage est raide, mais nous avons l'impression que c'est une approche plus moderne et polyvalente pour ce que nous devons faire. Les inconvénients - puisque vous demandez - sont principalement la courbe d'apprentissage qui semble être inévitable. ANTLR possède un fichier JAR de bibliothèque d'exécution que vous devez inclure dans votre projet.

+2

Je soupçonne que la courbe d'apprentissage pour à peu près n'importe quel générateur d'analyseur est à peu près la même. Il ne faut que 5 minutes pour "techniquement" comprendre l'expression "C'est LALR ..." ou "C'est LL ..." Il faut des semaines pour faire groover la machine que vous devez utiliser, pour obtenir un grammer en forme, apprenez à plier la grammaire, ... Toutes choses étant égales par ailleurs, les courbes d'apprentissage étant similaires, vous devriez choisir le générateur d'analyseur le plus puissant qui fonctionne dans votre monde. –

2

Les analyseurs syntaxiques de descente récursive d'ANTLR sont plus faciles à déboguer que les analyseurs «ascendants» générés par Flex/Bison, mais les règles de grammaire sont légèrement différentes.

Si vous voulez un générateur d'analyseur de type Flex/Bison (LALR) pour Java, consultez JavaCC.

Questions connexes