#生成 #生成器 #代码生成 #代码

code_generator

代码生成器(目前仅针对 C 语言)

15 个版本

新增 0.1.15 2024 年 8 月 12 日
0.1.14 2024 年 8 月 9 日
0.1.7 2024 年 7 月 30 日

#538 in 开发工具

Download history 301/week @ 2024-07-20 443/week @ 2024-07-27 601/week @ 2024-08-03 293/week @ 2024-08-10

每月下载 1,638

MIT 许可证

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)));



由于输出格式不依赖于输入数据结构,因此代码生成模块化非常容易。任何共享结构的生成代码都可以共享一个生成器。

无运行时依赖