Quelqu'un pourrait-il me donner quelques conseils/idées sur la façon de gérer les situations lorsqu'il est nécessaire de regarder d'autres déclarations pour pouvoir faire des actions sémantiques correctes sur le moment actuel? Par exemple, il s'agit d'une occurrence bien connue lorsque quelqu'un écrit un interpréteur/compilateur d'un langage de programmation qui ne supporte pas les "déclarations anticipées". Prenons un exemple:Stimuler l'esprit et transmettre les problèmes de déclarations
foo(123);//<-- our parser targets here. we estimate we have a function
// invocation, but we have no idea about foo declaration/prototype,
// so we can't be sure that "foo" takes one integer argument.
void foo(int i){
//...
}
Il est assez clair que nous devons avoir au moins deux passes. Premièrement nous analysons toutes les déclarations de fonction et obtenons toutes les informations nécessaires telles que: le nombre d'arguments que la fonction prend, leurs types et ensuite nous sommes capables de traiter les invocations de fonction et de résoudre les difficultés comme ci-dessus. Si nous allons de cette façon, nous devrons faire toutes ces passes en utilisant certains AST traversant les mécanismes/visiteurs. Dans ce cas, nous devons faire face à AST traversant/application des visiteurs et nous devons dire "au revoir" à toute la beauté des constructions de phénix intégrées directement dans nos parseurs.
Comment gérez-vous cela?
bon point. MSalters, ne connaissez-vous pas de façons de faire de l'esprit-boost pour faire ces "multi-passes" en restant au boost? il n'y a pas tellement de plaisir à parcourir/coder ces passes manuellement. Existe-t-il des façons de dire à boost-spirit d'effectuer deux passes d'analyse: la première ne traiterait que les déclarations de fonction, ignorant tout le reste, et la seconde s'occuperait d'analyser tous les autres, faisant les vérifications sémantiques sur place. – varnie
En fait, mon but était d'utiliser une seule passe d'analyse de l'arbre pour construire des tables de tout ce que vous rencontrez, puis extraire la sémantique des tables. Et le but d'une syntaxe correcte est de garder ces tables simples. – MSalters