我正在寻找一种方法将一些自动生成的代码插入到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)
运行之后//注释保持不变,但代码块将替换为新代码。
答案 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)