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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top