En parallèle, j'écris un langage en utilisant Python. J'ai commencé par utiliser un clone flex / bison appelé Ply, mais je me heurte aux limites de la puissance de ce que je peux exprimer avec ce style de grammaire, et je ne suis pas intéressé à pirater ma langue en raison d'un décalage d'impédance avec l'outil. Par conséquent, je ne suis pas opposé à écrire le mien.
Alors, quel est le type d'analyseur le plus puissant? Des citations d'articles (ainsi que d'autres articles introductifs) seraient les bienvenues.
(Je sais que «puissant» n'est pas défini avec précision, mais soyons un peu lâches avec lui et voyons où vont les réponses)
fl.formal-languages
pl.programming-languages
grammars
Paul Biggar
la source
la source
Réponses:
Une grammaire est généralement définie comme une grammaire sans contexte - une définition précise est donnée sur la page Wikipedia, mais elle fonctionne de la même manière que dans PLY, qui est basé sur Bison , qui est à son tour basé sur yacc .
Il est dit ici que PLY utilise un analyseur LALR . Il s'agit essentiellement d'un analyseur LR où les tables de recherche sont condensées, introduisant éventuellement des conflits d'analyse, réduisant une partie de l'expressivité d'une grammaire LR (c'est-à-dire une grammaire sans contexte qu'un analyseur LR peut analyser). Si vous voulez connaître les limites de cette branche particulière des analyseurs et celles des autres analyseurs, un aperçu de toutes sortes de techniques d'analyse (LL, LR et autres) est donné ici .
Pour répondre à votre question: il existe des algorithmes d'analyse capables d'analyser n'importe quel langage sans contexte, même si le langage est ambigu (c'est-à-dire qu'il y a plus d'une façon d'interpréter l'entrée):
Ici vous pouvez trouver un article discutant d'une implémentation pratique de (une adaptation de) l'algorithme d'Earley. Ils concluent: "Étant donné la généralité de l'analyse de Earley par rapport à l'analyse de LALR (1) ((qui est à peu près ce que fait PLY)), et considérant que même le pire moment de PEP ((leur implémentation de l'algorithme de Earley)) ne serait pas perceptible par un utilisateur, c'est un excellent résultat ".
Le dernier type d'analyseur est l' analyseur GLR . Il s'agit d'une version généralisée de l'analyse LR, capable d'analyser n'importe quel langage sans contexte.
Une implémentation mature de GLR est ASF + SDF . Bison peut également générer un analyseur GLR, bien que ses implémentations soient légèrement différentes de l'algorithme GLR «standard». L' algorithme Elkhound est un algorithme hybride GLR / LALR. Il utilise LALR lorsque cela est possible et GLR lorsque cela est nécessaire, afin d'être à la fois rapide et capable d'analyser n'importe quelle grammaire.
Au-delà des grammaires sans contexte, il existe des grammaires contextuelles , mais elles sont généralement difficiles à analyser et n'ajoutent pas beaucoup d'expressivité: vous pouvez en faire plus, mais pour la plupart des applications, les utilisations supplémentaires ne sont pas pertinentes, sauf si vous analysez une langue naturelle.
Comme dernière étape, il y a des grammaires illimitées . À ce stade, la grammaire est Turing-complete, donc il n'y a pas de limite que l'on puisse donner sur le temps qu'il faudra pour analyser une langue particulière, ce qui n'est pas souhaitable pour la plupart des applications d'analyse. La puissance supplémentaire n'est presque jamais nécessaire. Si vous voulez utiliser toute cette puissance, la machine à langer est disponible.
Enfin, l'implémentation de votre propre générateur d'analyseur n'est pas une mince affaire, en particulier pour qu'il soit rapide. Personnellement, je viens de terminer ma propre version de flex (le générateur de lexer), et même si cela semblait être un exercice de problèmes algorithmiques relativement simples, il est devenu assez complexe de bien faire les choses, en particulier lorsque j'ai essayé de prendre en charge Unicode. Pensez à utiliser une implémentation déjà existante au lieu d'écrire la vôtre.
la source
Un article à ICFP 2010 cette année, Total Parser Combinators , décrit une bibliothèque de combinateurs d'analyseurs à terminaison prouvée et établit également que dans cette bibliothèque "les combinateurs d'analyseurs sont aussi expressifs que possible" étant donné que l'analyseur est garanti de se terminer. Malheureusement, je ne me souviens pas de l'explication donnée par l'auteur sur ce que signifie «aussi expressif que possible», mais cela semble certainement pertinent pour votre question sur le «pouvoir».
la source
Si vous voulez aller au-delà des grammaires hors contexte pour analyser les langages de programmation, mais toujours en syntaxe polynomiale, vous pouvez recourir à l' analyse des grammaires d'expression ou des grammaires booléennes - ces dernières sont également disponibles en versions LL et LR (voir ici ). Dans la théorie du langage formel, les langages Church-Rosser puissants mais reconnaissables en temps linéaire sont également étudiés, mais je ne connais aucun générateur d'analyseur implémenté pour ceux-ci.
Dans le traitement du langage naturel, les goûts sont différents, par exemple, le traitement de l'ambiguïté (également: l'ambiguïté inhérente) et l'ordre des mots libres joue un rôle très important. Ici, les mots-clés des langues légèrement contextuelles et le redémarrage des automates peuvent vous aider à commencer la lecture.
la source
Outils du générateur d'analyseur:
ANTLR est très bon. Alternativement, vous pouvez jeter un œil à JavaCC
la source