我需要编写一个可以采用 C 代码并将pragma放在某些函数之上的工具。哪个编译器框架最容易完成这样的任务。另外,如果您能提供一个示例,我将不胜感激。
3 回答
如果你想可靠地做到这一点,你需要一个完整的 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”基本上被他想要的编译指示文本替换,而 some_condition 是过滤匹配的函数头的自定义谓词,应该为其插入编译指示。
该模式与语法树匹配,因此它不会像 sed 或正则表达式那样不匹配。秘诀在于模式变量引用了 C 前端中的语法规则;function_head 类型的模式变量只能匹配 function_head 语法规则可以满足的那些树。
需要一些简单的控制逻辑来为每个遇到的函数定义运行一次这种转换。
看看 lex/flex 或 yacc/bison。
很棒的文章:http ://www.ibm.com/developerworks/aix/tutorials/au-lexyacc/index.html
您可以使用正则表达式来搜索函数定义。