概述
可嵌入c/c++的规则语言有 lua ,可嵌入java 的有drools,由于某些业务特性,或者说有些特殊需求需要自己定义规则语言的场景,下面是我实现一个规则语言,采用 c++ ,lex ,yacc (flex,bison)实现,java 也可以采用相同设计原理思路实现,java的语法词法工具名字忘记了,有需要的自己到网上搜索
1 实现技术
1.1.1 Flex,bison(lex,yacc),c++,经过修改已经可以在aix,linux,windows上正确执行。
2 语法说明
2.1.1 变量声明总语法
init_declarator_list statement 或者 statement
init_declarator_list 表示变量声明
statement表示具体逻辑,包含赋值,函数,if,while,do while
2.1.2 变量声明
目前expr支持的变量类型包括:long、unsigned long、double、string,pvoid(相当于void*)而且变量的声明必须放在开头。
其中string变量的命名方式为:XXXXX_数字
例如:string str_20 = “hello world”;
就表示分配20个字节来存储该字符串。
变量声明实例说明:
long x; long a; double b;
long x = 1234;
long x = (105+20)/23-2;
long x = fun(a,b) 其中参数a、 b不能为函数,可以为b=fun1(a);
2.1.3 函数入参说明
函数是程序的基本功能单元,其重要性不言而喻。
函数的两个要素是参数和返回值,在expr中参数只能为常量,变量以及变量和常量的运算表达式。参数不能为函数。
实例说明:
long a; long b; long c;
fun();
fun1(a);
fun2(a+b-c);
2.1.4 条件表达式
2.1.5 目前expr支持的条件表达式有:if(){}、while(){}、do{}while().不支持break、return、continue。
2.1.6 其中条件表达式的条件也必须是常量、变量以及常量和变量的运算表达式。
2.1.7 测试案例
long x=3; long y=4; if(3==x){x=y+1;}else{x=y+2;}
long x=3;if(x>3){x=x+1;}else{x=x+3;}
long x=3; {while(3==x){x=x+2;}}
long x=3;long y=9; {do{x=3+x*3+(10*4/3)-25+y;}while(3==x);}
3 编程接口
3.1.1 如何调用
try
{
WtExpr lk;
lk.SevVsize(1024,1024);//设置最大变量个数和常量个数
//TODO:注册自己的变量,或者是函数,如何注册详见
// FunctionMgr 类 和 ValueMgr类
lk.InitFromFile("wt.c");//解析文件
lk.Dump(cout);//调试信息,输出执行语句
lk.Execute();//执行
printf("execute finishn");
lk.m_VMgr.Dump(cout);//输出所有变量信息(调试用)
}
catch(stl_string & e)
{
printf("%sn",e.c_str());
}
wt.c文件内容如下:
long x=0;
string str_32 ;
{
if(x==0)
{
x=9;
}
x = x*2;
str_32 ="12345" ;
x = atol("123"); //atol,strlen是我已经注册的系统级函数,可以自己注册自己的函数实现,函数最多支持6个参数
x = strlen(str_32);
if(x==5)
{
x =10;
if(x==10)
{
x=7;
do
{
x = 9;
}
while(0);
}
}
}
3.1.2 基础数据结构
union DataValue
{
bool m_t_bool;
char m_t_char;
unsigned char m_t_uchar;
short m_t_short;
unsigned short m_t_ushort;
int m_t_int;
unsigned int m_t_uint;
long m_t_long ;
unsigned long m_t_ulong;
double m_t_double;
float m_t_float;
char* m_t_pchar;
void* m_t_ptr;
DataValue()
{
memset(this,0,sizeof(DataValue));
}
DataValue(unsigned int v)
{
m_t_uint = v;
}
DataValue( int v)
{
m_t_int = v;
}
DataValue(unsigned short v)
{
m_t_ushort = v;
}
DataValue( double v)
{
m_t_double = v;
}
DataValue( float v)
{
m_t_float = v;
}
DataValue(bool v)
{
m_t_bool = v;
}
DataValue(long v)
{
m_t_long = v;
}
DataValue(unsigned long v)
{
m_t_ulong = v;
}
DataValue(void * p)
{
m_t_ptr = p;
}
DataValue( char * p)
{
m_t_pchar = p;
}
DataValue(char p)
{
m_t_char = p;
}
DataValue(unsigned char p)
{
m_t_uchar = p;
}
};
3.1.3 如何注册变量
bool WtExpr::RegisterValue()
详见代码里面ValueMgr类的几个注册函数
3.1.4 如何注册函数
bool RegisterFun();
详见代码里面FunctionMgr类的几个注册函数
4 其他
系统函数我添加的很少,可以自行添加。有bug可以发wt19880111@163.com
最后
以上就是着急西牛为你收集整理的如何实现一个自己的嵌入式语言y可嵌入c/c++的规则语言有 lua ,可嵌入java 的有drools,由于某些业务特性,或者说有些特殊需求需要自己定义规则语言的场景,下面是我实现一个规则语言,采用 c++ ,lex ,yacc (flex,bison)实现,java 也可以采用相同设计原理思路实现,java的语法词法工具名字忘记了,有需要的自己到网上搜索 1 实现技术2 语法说明3 编程接口4 其他的全部内容,希望文章能够帮你解决如何实现一个自己的嵌入式语言y可嵌入c/c++的规则语言有 lua ,可嵌入java 的有drools,由于某些业务特性,或者说有些特殊需求需要自己定义规则语言的场景,下面是我实现一个规则语言,采用 c++ ,lex ,yacc (flex,bison)实现,java 也可以采用相同设计原理思路实现,java的语法词法工具名字忘记了,有需要的自己到网上搜索 1 实现技术2 语法说明3 编程接口4 其他所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复