我是靠谱客的博主 着急西牛,最近开发中收集的这篇文章主要介绍如何实现一个自己的嵌入式语言y可嵌入c/c++的规则语言有 lua ,可嵌入java 的有drools,由于某些业务特性,或者说有些特殊需求需要自己定义规则语言的场景,下面是我实现一个规则语言,采用 c++ ,lex ,yacc (flex,bison)实现,java 也可以采用相同设计原理思路实现,java的语法词法工具名字忘记了,有需要的自己到网上搜索 1  实现技术2  语法说明3  编程接口4  其他,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

可嵌入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 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  其他所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部