Comment insérer automatiquement des pragmas dans votre programme

J’ai besoin d’écrire un outil qui peut prendre un code C et mettre des pragmas au-dessus de certaines fonctions. Quel framework de compilateur est le plus facile à accomplir. Aussi, si vous pouviez donner un exemple, je l’apprécierais vraiment.

    Si vous souhaitez effectuer cette opération de manière fiable, vous avez besoin d’un frontal C complet et de la possibilité de modifier le code analysé.

    Notre boîte à outils DMS Software Reengineering avec son C Front End peut probablement faire ce que vous voulez. DMS peut parsingr, créer des AST et effectuer des transformations personnalisées sur le texte source, de manière procédurale ou en tant que transformation de la syntaxe de surface.

    Il existe certains problèmes avec les macros et les directives de préprocesseur; si vous les parsingz et les conservez, il peut le faire dans de nombreux cas, mais il étend ces directives lorsqu’elles ne sont pas “structurées”. La rétention signifie que vous n’obtenez pas de table de symboles. Si vous développez toutes les directives, après l’parsing, vous pouvez obtenir une table de symboles avec le même contenu qu’un compilateur C.

    Pour la tâche spécifique d’OP, il aimerait écrire une source à la transformation pour transformer quelque chose comme ce qui suit:

      rule decorate_function_definition_with_pragma(fh:function_head, b: block): declaration -> declaration = " \fh \b " -> " \fh #pragma my_pragma \b " if some_condiiton(fh); 

    où “my_pragma” est remplacé essentiellement par le texte de pragma qu’il souhaite, et some_condition est un prédicat personnalisé filtrant les function_headers correspondants pour lesquels le pragma doit être inséré.

    Le modèle correspond à l’arbre de syntaxe, il ne peut donc pas être incompatible avec sed ou une expression régulière. Le secret de ceci est que les variables de modèle font référence à des règles de grammaire dans le C-End End; une variable de modèle de type function_head peut uniquement correspondre aux arbres que les règles de grammaire function_head peuvent satisfaire.

    Il faut une logique de contrôle sortingviale pour exécuter cette transformation une seule fois pour chaque définition de fonction rencontrée.

    Jetez un coup d’œil à Lex / Flex ou Yacc / Bison.

    excellent article: http://www.ibm.com/developerworks/aix/tutorials/au-lexyacc/index.html

    Vous pouvez utiliser des expressions régulières pour rechercher la définition de la fonction.

    http://en.wikipedia.org/wiki/Regular_expression