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

时间:2012-06-09 12:25:01

标签: c compiler-construction abstract-syntax-tree

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

3 个答案:

答案 0 :(得分:2)

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

我们的DMS Software Reengineering Toolkit及其C Front End可能会做您想要的。 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语法规则可以满足的那些树。

对于每个遇到的函数定义,只需要一些简单的控制逻辑来运行这个转换。

答案 1 :(得分:0)

看看lex / flex或yacc / bison。

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

答案 2 :(得分:0)

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

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