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):
O ( n3| G | )n| G |
O ( n3)O ( n2)
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.