如何实现一个自己的嵌入式语言y

来源:互联网 发布:linux cp强制复制 编辑:程序博客网 时间:2024/05/29 12:37

可嵌入c/c++的规则语言有 lua ,可嵌入java 的有drools,由于某些业务特性,或者说有些特殊需求需要自己定义规则语言的场景,下面是我实现一个规则语言,采用 c++ ,lex ,yacc (flex,bison)实现,java 也可以采用相同设计原理思路实现,java的语法词法工具名字忘记了,有需要的自己到网上搜索

   源码:https://github.com/wtaccuracy/wtexpr


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 finish\n");

       lk.m_VMgr.Dump(cout);//输出所有变量信息(调试用)

   }

   catch(stl_string & e)

   {

       printf("%s\n",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

0 0
原创粉丝点击