15 个版本
新增 0.1.15 | 2024 年 8 月 12 日 |
---|---|
0.1.14 | 2024 年 8 月 9 日 |
0.1.7 | 2024 年 7 月 30 日 |
#538 in 开发工具
每月下载 1,638 次
54KB
1K SLoC
代码生成器
- 此项目尚未稳定。在稳定之前将会有很多破坏性变更。
- 此项目的目标是能够生成代码,并且能够根据需要轻松地更改生成代码的格式。
- 由于此库具有上下文感知性,因此它使代码生成代码的重用变得更加容易。
- 此库目前仅支持 C 语言,但我希望支持多种目标语言。
待办事项
- 支持更多类型的代码生成(switch、do/while 等。)
- 支持更多语言。当前语言相当硬编码。不确定是否可以抽象化。
- 单元测试
- 文档
限制
- 我不相信可以借助现有的项目架构进行逆向工作。此库无法解析代码,除非进行大规模重构,否则无法对代码进行任何操作。
lib.rs
:
此生成器旨在允许轻松重用代码生成
示例
此示例展示了如何将相同的结构生成为两种不同的格式。
#
let code = CodeSet::new(vec![
Box::new(String::from("#include \"test.h\"")),
Box::new(String::from("")),
Box::new(String::from("")),
Box::new(Function::new(FunctionSignature::new(
Name::new("MyReturnTypeOne"),
Name::new("MyFunctionNameOne"),
vec![
(Name::new("ParamTypeOne"), Name::new("ParamNameOne")),
(Name::new("ParamTypeTwo"), Name::new("ParamNameTwo")),
(Name::new("ParamTypeThree"), Name::new("ParamNameThree")),
]
),
CodeBody::new(vec![
Box::new(IfStatement::new(
Name::new_with_type("ParamNameThree", NameType::Member),
CodeBody::new(vec![
Box::new(ForLoop::new(
String::from("ParamTypeTwo i = 0"),
String::from("i < param_name_two"),
String::from("i++"),
vec![
Box::new(String::from("printf(\"ParamOne: {}\\n\", param_name_one);"))
]
))
])
))
])
)),
Box::new(String::from("")),
]);
let mut info = CodeGenerationInfo::from_style(CodeStyle::KnR);
info.set_new_line_type(NewLineType::Nl);
assert_eq!(
"#include \"test.h\"
MyReturnTypeOne my_function_name_one(ParamTypeOne param_name_one, ParamTypeTwo param_name_two, ParamTypeThree param_name_three) {
if (param_name_three) {
for (ParamTypeTwo i = 0; i < param_name_two; i++) {
printf(\"ParamOne: {}\\n\", param_name_one);
}
}
}
", format!("{}", code.display(info)));
let mut info = CodeGenerationInfo::from_style(CodeStyle::Allman);
info.set_new_line_type(NewLineType::Nl);
assert_eq!(
"#include \"test.h\"
MyReturnTypeOne my_function_name_one(ParamTypeOne param_name_one, ParamTypeTwo param_name_two, ParamTypeThree param_name_three)
{
if (param_name_three)
{
for (ParamTypeTwo i = 0; i < param_name_two; i++)
{
printf(\"ParamOne: {}\\n\", param_name_one);
}
}
}
", format!("{}", code.display(info)));
由于输出格式不依赖于输入数据结构,因此代码生成模块化非常容易。任何共享结构的生成代码都可以共享一个生成器。