我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
专题:一个自制代码生成器(嵌入式脚本语言)之总述-CSDN博客
专题:一个自制代码生成器(嵌入式脚本语言)之对象模型-CSDN博客
专题:一个自制代码生成器(嵌入式脚本语言)之堆栈结构和总入口-CSDN博客
专题:一个自制代码生成器(嵌入式脚本语言)之核心逻辑-CSDN博客
专题:一个自制代码生成器(嵌入式脚本语言)之辅助逻辑-CSDN博客
专题:一个自制代码生成器(嵌入式脚本语言)之应用实例-CSDN博客
专题:一个自制代码生成器(嵌入式脚本语言)之模型开发-CSDN博客
专题:一个自制代码生成器(嵌入式脚本语言)之代码模板详解-CSDN博客(本篇)
一、循环和变量引用
<%foreach table in ${tables}%>
#include "_cc_${SYS}_${table}.h"
<%endforeach%>
<%foreach sequence in sequences%>
#include "_cc_${SYS}_${sequence}.h"
<%endforeach%>
这几行脚本遍历所有的表,生成了包含相关头文件的代码(头文件由另一个代码模板文件生成):
#include "_cc_RoosterStruct_RESOURCE_TYPE_D.h"
#include "_cc_RoosterStruct_RESOURCE_USE_TYPE_D.h"
#include "_cc_RoosterStruct_RESOURCE_D.h"
#include "_cc_RoosterStruct_TASK_D.h"
#include "_cc_RoosterStruct_TASK_RESOURCE_USE_D.h"
#include "_cc_RoosterStruct_TASK_QUEUE.h"
#include "_cc_RoosterStruct_TASK_LOG.h"
#include "_cc_RoosterStruct_SEQ_TASK_LOG.h"
二、复杂的例子
这是构造select语句的脚本:
<%if S.type equal "select"%>
//构造SQL语句 ${S} ${S.comment}
string & sql${S}(<%foreach M in S.where_members%> ${M.ParamType} _${M} ,<%endforeach%> string & sql)
{
char buf[2048];
sprintf(buf, "select <%foreach M in S.op_members ,%>${M}<%endforeach%> from ${table}"
<%if S.hasWhere exist%>
" where "
<%if S.where_members exist%>
" <%foreach M in S.where_members and%> ${M}='${M.PrintfType}' <%endforeach%>"
<%endif%>
<%if S.other_where exist%>
<%if S.where_members exist%>" and "<%endif%>"${S.other_where}"
<%endif%>
<%if S.where_members exist%>
<%foreach M in S.where_members%>, _${M} <%endforeach%>
<%endif%>
<%endif%>
);
return sql = buf;
}
有asp或者别的类似经验看这种代码会比较容易。
生成的代码如下:
//构造SQL语句 GetTaskQueue 获取任务队列
string & sqlGetTaskQueue( long const _TASK_ID , long const _SYS , long const _SYS2 , string & sql)
{
char buf[2048];
sprintf(buf, "select TASK_ID,SYS,SYS2,TASK_NAME,TASK_PRIORITY,COMMENT,INSERT_TIME from TASK_QUEUE"
" where "
" TASK_ID='%ld' and SYS='%ld' and SYS2='%ld' "
, _TASK_ID , _SYS , _SYS2
);
return sql = buf;
}
这个只是生成了sql语句,并没有执行,要改成带执行的当然也没问题。注意这里所需的参数都是通过严格规定的函数参数来传递的,这是主要的目的。这种包装类一个一个手写会累死的。
三、然后
然后呢,如果你已经看到了这里,应该想直接运行看看了。代码我会放在我的git上的"ctfc\src\CCTModel_UniversalDB"目录下,如何编译我没写但是如果你问我我用两行字告诉你就可以了。
(这里是结束并且是整个系列的结束)