从脚本生成C代码:如何模板?

时间:2015-05-27 23:00:07

标签: python c templates code-generation

我正在寻找一种方法将一些自动生成的代码插入到C源文件中。代码生成是在python中,这不是问题,诀窍是如何用生成的代码替换/更新现有C代码中的代码块。我正在寻找一个与C语法兼容的模板库(模板语句可以隐藏在注释中),其中模板和扩展模板可以是同一个东西。

包含要更新代码的示例C文件:

@media (max-width: $screen-sm-min - 1) {
    $grid-gutter-width: 6px; // redefining

    // also redefine $navbar-padding-horizontal in the scope because it depend on $grid-gutter-width
    $navbar-padding-horizontal: floor(($grid-gutter-width / 2));

    @import "../bootstrap/bootstrap/forms";
    @import "../bootstrap/bootstrap/grid";
    @import "../bootstrap/bootstrap/navbar";
}

示例python伪代码:

// start generated block (blockname)
... some code here
// end generated block (blockname)

运行之后//注释保持不变,但代码块将替换为新代码。

2 个答案:

答案 0 :(得分:0)

让我解释一个技巧。 Jinja2 是一个模板脚本,可以从模板生成文本。您需要做的是编写您的 C 代码模板 main.c.j2:


#include <stdio.h>

int main()

{

    printf("hello {{name}}.\n");

    return 0;

}

然后您可以使用 trans.py 将其转换为 C 代码:


import os

from jinja2 import PackageLoader, Environment, FileSystemLoader



TemplateLoader = FileSystemLoader(os.path.abspath("."))

env = Environment(loader = TemplateLoader)



template = env.get_template("main.c.j2")



print(template.render(name = "Jack"))

运行 python trans.py,你会在屏幕上看到这个 C 代码:


#include <stdio.h>

int main()

{

    printf("hello Jack.\n");

    return 0;

}

那是真正的 C 代码,{{name}} 被替换成了 Jack。有关更多有趣的功能,请参阅 Jinja2 文档。

答案 1 :(得分:0)

这可以通过 Python 中的 re library 来完成。

搜索块名并将其替换为新块:

re.sub(f"// start generated block \({blockname}\).*// end generated block \({blockname}\)", new_code, fileContents, flags=re.DOTALL)