La différence la plus significative entre YACC/Bison et ANTLR est le type de grammaires que ces outils peuvent traiter. YACC/Bison traite les grammaires LALR, ANTLR traite les grammaires LL.
Souvent, les personnes qui ont travaillé pendant longtemps avec des grammaires LALR trouveront plus difficile de travailler avec des grammaires LL et vice versa. Cela ne signifie pas que les grammaires ou les outils sont intrinsèquement plus difficiles à utiliser. Le choix de l'outil le plus facile à utiliser dépendra essentiellement de la familiarité avec le type de grammaire.
En ce qui concerne les avantages, il y a des aspects où les grammaires LALR ont des avantages sur les grammaires LL et il y a d'autres aspects où les grammaires LL ont des avantages sur les grammaires LALR.
YACC/Bison génère des analyseurs syntaxiques pilotés par table, ce qui signifie que la "logique de traitement" est contenue dans les données du programme d'analyse syntaxique, et pas tellement dans le code de l'analyseur. Le résultat est que même un analyseur pour un langage très complexe a une empreinte de code relativement faible. Cet aspect était plus important dans les années 1960 et 1970, lorsque le matériel était très limité. Les générateurs d'analyseurs syntaxiques pilotés par des tables remontent à cette époque et la faible empreinte du code était une exigence majeure à l'époque.
ANTLR génère des analyseurs descendants récursifs, ce qui signifie que la "logique de traitement" est contenue dans le code de l'analyseur, puisque chaque règle de production de la grammaire est représentée par une fonction dans le code de l'analyseur. L'avantage est qu'il est plus facile de comprendre ce que fait l'analyseur en lisant son code. De plus, les analyseurs par descente récursive sont généralement plus rapides que les analyseurs par table. Cependant, pour les langages très complexes, l'empreinte du code sera plus importante. C'était un problème dans les années 1960 et 1970. À l'époque, seuls des langages relativement petits, comme le Pascal par exemple, étaient implémentés de cette manière en raison des limitations matérielles.
Les analyseurs générés par ANTLR sont généralement de l'ordre de 10.000 lignes de code et plus. Les analyseurs récursifs descendants écrits à la main sont souvent dans la même fourchette. Le compilateur Oberon de Wirth est peut-être le plus compact avec environ 4000 lignes de code incluant la génération de code, mais Oberon est un langage très compact avec seulement environ 40 règles de production.
Comme quelqu'un l'a déjà souligné, un grand plus pour ANTLR est l'outil IDE graphique, appelé ANTLRworks. C'est un laboratoire complet de grammaire et de conception de langage. Il visualise vos règles de grammaire au fur et à mesure que vous les tapez et s'il trouve des conflits, il vous montre graphiquement ce qu'est le conflit et ce qui le cause. Il peut même remanier et résoudre automatiquement des conflits tels que la récursion à gauche. Une fois que vous avez une grammaire sans conflit, vous pouvez laisser ANTLRworks analyser un fichier d'entrée de votre langue et construire un arbre d'analyse et une AST pour vous et montrer l'arbre graphiquement dans l'IDE. C'est un très gros avantage car cela peut vous faire gagner de nombreuses heures de travail : Vous trouverez des erreurs conceptuelles dans la conception de votre langage avant de commencer à coder ! Je n'ai pas trouvé un tel outil pour les grammaires LALR, il semble qu'il n'y en ait pas.
Même pour les personnes qui ne souhaitent pas générer leurs analyseurs syntaxiques mais les coder à la main, ANTLRworks est un outil formidable pour la conception/le prototypage de langues. C'est probablement le meilleur outil de ce type disponible. Malheureusement, cela ne vous aide pas si vous voulez construire des analyseurs LALR. Passer de LALR à LL simplement pour profiter d'ANTLRworks peut être intéressant, mais pour certaines personnes, changer de type de grammaire peut être une expérience très douloureuse. En d'autres termes : YMMV.