我需要编写一个可以使用C代码并将 pragma 放在某些函数之上的工具。哪个编译器框架最容易完成这样的任务。如果你能提供一个例子,我真的很感激。
答案 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)
您可以使用正则表达式来搜索函数定义。