web-dev-qa-db-fra.com

Les langages modernes utilisent-ils toujours des générateurs d'analyseurs?

Je faisais des recherches sur la suite de compilateurs gcc sur wikipedia ici , quand cela est arrivé:

GCC a commencé à utiliser des analyseurs LALR générés avec Bison, mais est progressivement passé à des analyseurs manuscrits de descente récursive; pour C++ en 2004, et pour C et Objective-C en 2006. Actuellement, tous les frontaux utilisent des analyseurs de descente récursive manuscrits

Donc, par cette dernière phrase, (et pour autant que je fasse confiance à wikipedia), je peux certainement dire que "C (gcc), C++ (g ++), Objective-C, Objective-C++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Mercury, Modula-2, Modula-3, PL/I, D (gdc) et VHDL (ghdl ) "sont tous des frontaux qui n'utilisent plus de générateur d'analyseur. C'est-à-dire qu'ils utilisent tous des analyseurs manuscrits.

Ma question est alors: cette pratique est-elle omniprésente? Plus précisément, je cherche des réponses exactes à "Est-ce que l'implémentation standard/officielle de x a un analyseur manuscrit" pour x dans [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (En fait, les informations sur d'autres langues sont également les bienvenues ici.) Je suis sûr que je peux trouver cela par moi-même après beaucoup de recherches. Mais je suis aussi sûr que la communauté peut facilement répondre de cela. Merci!

38
eatonphil

AFAIK, GCC utilisent des analyseurs manuscrits en particulier pour améliorer les diagnostics d'erreurs syntaxiques (c'est-à-dire donner des messages humains significatifs sur les erreurs de syntaxe).

La théorie de l'analyse (et les générateurs d'analyse qui en découlent) consiste principalement à reconnaître et à analyser une phrase d'entrée correcte . Mais nous attendons des compilateurs qu'ils donnent un message d'erreur significatif (et qu'ils sont capables d'analyser de manière significative le reste de l'entrée après l'erreur syntaxique), pour une entrée incorrecte.

De plus, les anciens langages hérités - comme C11 ou C++ 11 qui sont conceptuellement anciens, même si leur dernière révision n'a que trois ans) ne sont pas du tout hors contexte. Gérer cette sensibilité au contexte dans les grammaires pour les générateurs d'analyseurs (c'est-à-dire --- (bison ou même menhir ) est ennuyeusement difficile.

34

Les générateurs et les moteurs d'analyseurs sont assez généraux. L'avantage de la généralité est qu'il est facile de construire rapidement un analyseur précis et de le rendre fonctionnel, dans le schéma global des choses.

Le moteur d'analyse lui-même souffre sur le front des performances en raison de sa généralité. Tout code manuscrit sera toujours beaucoup plus rapide que les moteurs d'analyse syntaxique.

Le deuxième domaine où les générateurs/moteurs d'analyseurs ont des difficultés est que tous les langages de programmation réels sont sensibles au contexte, souvent de manière assez subtile. Les langages LR sont sans contexte, ce qui signifie qu'il existe de nombreuses subtilités sur le positionnement et l'environnement qui sont impossibles à transmettre correctement dans la syntaxe. Les grammaires attribuées tentent de traiter les règles de base du langage comme "déclarer avant utilisation", etc. Le câblage de cette sensibilité au contexte dans du code manuscrit est simple.

7
BobDalgleish