La question du PO est un peu rétrograde. Bien sûr, un algorithme d'analyse peut produire tout ce qu'il veut. La question est davantage de comprendre à quoi sert l'analyse et si l'analyseur produit un résultat qui répond à cet objectif. On peut alors se demander quelle est la représentation appropriée pour cela, par exemple un arbre ou un graphique.
Eh bien, je suppose qu'un analyseur est un algorithme qui vous donnera la structure syntaxique d'une phrase donnée en entrée, selon une définition formelle donnée de la syntaxe du langage.
Notez que les gens peuvent être en désaccord sur ce qui constitue la syntaxe du langage. Certains peuvent limiter cela à une épine dorsale de langage formel pur, tandis que d'autres peuvent introduire des considérations légèrement plus sémantiques telles que le type, le genre, le nombre ou d'autres plus complexes (je ne distingue pas la PNL ou les langages de programmation). La plupart des langages ont des fonctionnalités qui nécessitent la représentation des graphes, mais c'est à "l'implémenteur" (faute d'un meilleur mot) de décider s'il veut inclure cela dans la syntaxe.
Ainsi, selon la définition de la syntaxe, vous devrez peut-être générer un autre type de structure formelle.
Dans le cas simple d'une analyse sans contexte pure, un arbre d'analyse peut le faire, sauf pour le problème d'ambiguïté abordé ci-dessous, ou pour le fait que vous souhaitiez peut-être le modifier un peu pour obtenir un AST (voir ci-dessous).
Cependant, dans des cas plus complexes, vous pouvez avoir besoin de différentes structures, souvent représentées par des liens dans l'arborescence, conduisant ainsi à une structure graphique. Cela dépend beaucoup de votre définition de la syntaxe du langage.
De plus, quel arbre vous devez sortir n'est pas évident. Si vous prenez le cas des grammaires adjacentes à l'arbre (TAG), elles fonctionnent de telle manière que l'arbre de syntaxe n'est pas le même que l'arbre de dérivation, bien que le premier puisse être dérivé du second. La question que vous souhaitez afficher peut être une question pertinente.
Il y a également un autre problème concernant l'ambiguïté. Une phrase donnée, bien qu'appartenant à votre langue, peut le faire de différentes manières, peut se voir attribuer une structure syntaxique de différentes manières.
Ensuite, vous pouvez choisir de sortir une seule de ces structures, choisie au hasard ou selon un critère bien défini (comme la jeunesse par exemple). Vous pouvez également choisir d'en afficher plusieurs ou tous. Si vous souhaitez en afficher plusieurs, il est généralement pratique de les regrouper dans une structure unique qui partagera ce qu'ils ont en commun. Cette économie d'espace et de temps de calcul, et la complexité peut être un vrai problème.
Lorsque vous choisissez de les sortir tous, vous n'avez pas d'autre choix que de les partager, car il peut y avoir un nombre infini d'analyses possibles. Et infiniment ne peut être représenté de manière finie qu'en ayant en quelque sorte un cycle dans un graphe. Vous devez donc produire une structure graphique en général. Mais les propriétés de cette structure graphique doivent être liées au type de syntaxe formelle que vous avez choisi.
A propos des arbres de syntaxe abstraite
Maintenant, la question portait également sur les arbres de syntaxe abstraite. J'ai sauté la partie "abstraite" car cela apporterait de la confusion, à mon humble avis. En effet, la question prête déjà à confusion dans ses différentes reformulations.
En ce qui concerne l'AST dans une perspective historique, ils proviennent du langage Lisp et des systèmes de manipulation de programmes dans les années 1960-1970. L'idée était de considérer les programmes comme de grandes expressions, comme des formules mathématiques, à la fois à des fins de manipulation et pour analyser les propriétés ou définir la sémantique de manière formelle, ce que les mathématiciens savent faire sur les formules. En tant que formules, elles étaient naturellement arborescentes, mais pouvaient être décorées de diverses informations qui transformaient ces arbres en graphiques. Cela était pratique à la fois formellement et pragmatiquement et a été utilisé par les compilateurs et les systèmes de programmation.
Donc, fondamentalement, un AST est un arbre, comme l'indique son nom, mais peut contenir des informations supplémentaires. Le reste est dans les choix du réalisateur et aux yeux du spectateur. Est-ce un graphique ou un arbre décoré? Cependant, l'arborescence AS de base est importante, car c'est l'échafaudage sur lequel vous construisez à la fois en théorie et en programmation.
Notez que l'AST était distinct de l'arbre d'analyse (la syntaxe était basée sur le contexte) tel que produit par l'algorithme d'analyse tel qu'il a été étudié dans la théorie du langage formel. La raison en était que la conception de la syntaxe était limitée par la technologie d'analyse de l'époque, elle-même contrainte par la faible puissance de calcul disponible. Le résultat était que les arbres de syntaxe n'étaient que des variantes torturées de ce que l'on considérerait naturellement comme la structure du programme, et un traitement ultérieur, ne faisant pas vraiment partie du processus d'analyse formelle de base, devait être effectué pour obtenir la version plus propre et plus simple appelée AST.
Cependant, la représentation des arbres sur l'ordinateur, qu'elle soit abstraite ou non, est quelque peu limitée lorsque vous souhaitez représenter toutes les structures d'une phrase ambiguë. En particulier, cela cache des problèmes de complexité. La préservation des ambiguïtés dans une structure graphique, lors de la conversion des arbres d'analyse en arbres AS peut également être un problème. Cependant, si cela vous intéresse, il est souvent possible de définir votre syntaxe concrète de telle manière que l'arbre d'analyse puisse servir d'AST. Cela est permis par les algorithmes très généraux qui gèrent l'ambiguïté et par la puissance des ordinateurs actuels.