简单的接口代码生成
【摘要】 尽管EA也可以生成接口代码,但是当我们想自定义目录结构或者从一些配置信息里来生成接口时,或者一些更自定义的要求时可以考虑下面这种方案; 原文地址:https://www.codeproject.com/Articles/571645/Really-simple-Cplusplus-code-generation-in-Python原文摘录:从Python可以读取的任何数据中快速生成重复的C ...
尽管EA也可以生成接口代码,但是当我们想自定义目录结构或者从一些配置信息里来生成接口时,
或者一些更自定义的要求时可以考虑下面这种方案;
原文地址:
https://www.codeproject.com/Articles/571645/Really-simple-Cplusplus-code-generation-in-Python
文中CodeGen.py地址:
https://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=571645
原文摘录:
从Python可以读取的任何数据中快速生成重复的C ++,C#或Java代码。
介绍
您对学习曲线过敏,并想立即生成代码!这是一个易于定制的100行Python模块,位于上方f.writeline
。
使用代码
让我们从一个非常简单的示例开始(请指出,请不要main
返回int
!这是一个示例。)
隐藏 复制代码
from CodeGen import *
cpp = CppFile("test.cpp")
cpp("#include <iostream>")
with cpp.block("void main()"):
for i in range(5):
cpp('std::cout << "' + str(i) + '" << std::endl;')
cpp.close()
输出:
隐藏 复制代码
#include <iostream>
void main()
{
std::cout << "0" << std::endl;
std::cout << "1" << std::endl;
std::cout << "2" << std::endl;
std::cout << "3" << std::endl;
std::cout << "4" << std::endl;
}
利用Python的with
关键字,我们可以将语句封装在{}
具有正确缩进的自动封闭的语句块中,以使输出保持可读性。
换人
当生成更复杂的代码时,您将很快意识到Python脚本变得越来越难理解,而且各处都有难看的字符串连接。那就是subs
方法的所在:
隐藏 复制代码
from CodeGen import *
cpp = CppFile("test.cpp")
cpp("#include <iostream>")
with cpp.block("void main()"):
for i in range(5):
with cpp.subs(i=str(i), xi="x"+str(i+1)):
cpp('int $xi$ = $i$;')
cpp.close()
产生:
隐藏 复制代码
#include <iostream>
void main()
{
int x1 = 0;
int x2 = 1;
int x3 = 2;
int x4 = 3;
int x5 = 4;
}
替换在with
可嵌套的Python 块内有效。
差不多了
最后,这是一个更复杂的示例,生成以下代码:
隐藏 收缩 复制代码
class ClassX
{
protected:
A a;
B b;
C c;
public:
ClassX(A a, B b, C c)
{
this->a = a;
this->b = b;
this->c = c;
}
A getA()
{
return this->a;
}
B getB()
{
return this->b;
}
C getC()
{
return this->c;
}
};
class ClassY
{
protected:
P p;
Q q;
public:
ClassY(P p, Q q)
{
this->p = p;
this->q = q;
}
P getP()
{
return this->p;
}
Q getQ()
{
return this->q;
}
};
看看CodeGen.py
,看看该怎么label
功能对于如何将代码与特定语言功能扩展的提示来实现。
隐藏 收缩 复制代码
from CodeGen import *
cpp = CppFile("test.cpp")
CLASS_NAMES = ["ClassX", "ClassY"]
VAR_NAMES = { "ClassX": ["A", "B", "C"],
"ClassY": ["P","Q"] }
for className in CLASS_NAMES:
with cpp.subs(ClassName=className):
with cpp.block("class $ClassName$", ";"):
cpp.label("protected")
for varName in VAR_NAMES[className]:
with cpp.subs(A=varName, a=varName.lower()):
cpp("$A$ $a$;")
cpp.label("public")
with cpp.subs(**{"A a": ", ".join([x + " " + x.lower() for x in VAR_NAMES[className]])}):
with cpp.block("$ClassName$($A a$)"):
for varName in VAR_NAMES[className]:
with cpp.subs(a=varName.lower()):
cpp("this->$a$ = $a$;")
for varName in VAR_NAMES[className]:
with cpp.subs(A=varName, a=varName.lower(), getA="get"+varName):
with cpp.block("$A$ $getA$()"):
cpp("return this->$a$;")
cpp.close()
/*---------------------------------------------------分割线---------------------------------*/
https://github.com/AxioDL/CodeGen
https://medium.com/%40jasonrigden/jinja2-templating-engine-tutorial-4bd31fb4aea3
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)