Je travaille sur un projet où j'ai besoin de traduire NetLogo dans un autre langage de programmation. J'utilise Boost Spirit et j'ai déjà implémenté certaines des grammaires du projet qui stockent la syntaxe du code simple dans un AST.
Le problème auquel je suis confronté est qu'en ce moment, je ne peux pas dire si un identifiant est un nom de variable ou un nom de fonction. De plus, je ne sais pas si un appel de fonction spécifique nécessite un, deux ou plusieurs arguments, donc je ne sais pas quand arrêter de chercher plus d'arguments.
Par exemple, un appel de fonction peut ressembler à
id1 id2 id3 id4
Cela pourrait être :
id3
est une fonction qui aid4
comme argument (disons que la valeur de retour estid5
), etid1
est une fonction qui aid2
etid5
comme arguments
Mais cela pourrait aussi être :
id1
aid2
id3
id4
comme arguments (tous saufid1
sont des noms de variables)
J'ai pensé à utiliser des symboles et à ajouter de nouveaux éléments à chaque fois qu'une variable ou une fonction est déclarée, cela aiderait à différencier les noms de variable des noms de fonction, mais...
- Comment/dois-je stocker le nombre d'arguments qu'une fonction nécessite en utilisant Boost Spirit ? Peut-être en utilisant une autre table de symboles avec des actions sémantiques lors de l'analyse de la définition de la fonction ?
- Une fois que je sais comment obtenir le nombre d'arguments requis, comment puis-je obtenir cette valeur lorsque je trouve un identifiant de fonction lors de l'analyse d'une expression ?
- Est-ce une bonne solution d'utiliser des symboles pour différencier les noms de variable des noms de fonction ?