Attributs de symbole de grammaire Mise en œuvre en C
-
12-12-2019 - |
Question
J'ai besoin d'implémenter le compilateur (lexical, syntaxier et analyseurs sémantiques). J'ai déjà implémenté le lexical de Flex ++, Syntaxe de la main (descente récursive), Et sais que je travaille sur Sémantican (ajouter des règles sémantiques à l'analyseur existant). Ma question est - comment puis-je implémenter des attributs. Par exemple, pour la production:
TYPE -> integer
J'ai besoin d'ajouter une règle sémantique:
TYPE.type = integer
Voici donc ici, je dois créer une certaine structure pour le type, etc. pour tous les symboles de la grammaire. Alors, comment puis-je mettre en œuvre ces structures?Dois-je faire une certaine structure pour chaque symbole de grammaire et il est nécessaire d'être global pour la portée du fichier?
P.s.Peut-être que ce n'est pas la meilleure mise en œuvre du compilateur, c'est juste une nécessité pour la mission.
La solution
Il est plus facile que vous définissez un type (généralement une structure) pour chaque terminal et non mortminal dans votre langue.Ensuite, chaque utilisation d'un terminal (non) a accès au type et chaque attribution d'un attribut va à l'encontre de la fente correspondante de la structure associée à (non) terminale.
Je vous suggère de nommer vos structures de mise en œuvre après les jetons de grammaire.Donc, le type de la structure d'attribut pour t serait "t_attributes {...}"
Pour votre exemple, "Type" serait une fente dans les T_ATtributes.Probablement ce que vous vouliez écrire dans l'abstrait était:
TYPE -> 'integer' ; -- 'integer is a keyword'
TYPE.type = "int"; -- the type of an 'integer' is "int"
étant donné que vous le faites à la main, vous compilez à la main l'attribution d'attributs à exécuter lorsqu'une promenade d'arbre frappe le nœud type.