如何在程序中自动插入编译指示

我需要编写一个可以接受C代码并将pragma放在某些函数之上的工具。 哪个编译器框架最容易完成这样的任务。 如果你能提供一个例子,我真的很感激。

如果您想要可靠地执行此操作,则需要完整的C前端,并且能够修改已分析的代码。

我们的DMS软件再造工具包及其C前端可以做你想要的。 DMS可以解析,构建AST,并对源文本执行自定义转换,可以是程序转换,也可以是表面语法转换。

宏和预处理器指令存在一些问题; 如果你解析并保留它们,它可以在许多情况下这样做,但它扩展了这样的指令,它们不是“结构化”的。 保留意味着您没有获得符号表。 如果展开所有指令,解析后可以获得一个符号表,其内容与C编译器生成的内容相同。

对于OP的特定任务,他想编写一个源代码来源变换,如下所示:

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

其中“my_pragma”基本上由他想要的pragma文本替换,而some_condition是自定义谓词,用于过滤应该插入pragma的匹配的function_headers。

模式与语法树匹配,因此它不会像sed或正则表达式那样不匹配。 这样做的秘诀是模式变量引用了C前端的语法规则; function_head类型的模式变量只能匹配function_head语法规则可以满足的那些树。

人们需要一些简单的控制逻辑来为每个遇到的函数定义运行一次这种转换。

看看lex / flex或yacc / bison。

好文章: http : //www.ibm.com/developerworks/aix/tutorials/au-lexyacc/index.html

您可以使用正则表达式来搜索函数定义。

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