⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formula.h

📁 一个简单的解析器
💻 H
字号:
/***************************************
 Filename : formula.h
 Version  : Formula Language V1.1
 Author   : Shen Tu Hongnan
 Modify   :
 Date     : 2001/08/26
 Remark   :
 ***************************************/

#ifndef FORMULA
    #define FORMULA

	#define STRING	            0                   /* 字符串 */
	#define NUMBER              1                   /* 数字型 */
    #define MAX_STRING_LEN	    128	                /* 最大串长 */

    #define RULE_STR_SIZE       1024	            /* 规则串长 */
    #define RULE_ADDR_SIZE      32	                /* 跳转地址表长(<=256) */
    #define Zarray_SIZE         32	                /* 临时变量组长(<=256) */
    #define STACK_SIZE          64                  /* 堆栈大小 */

    /* 数据域 */
    typedef struct          {
		    int             type;	                /* 数据类型 */
		    double          num;	                /* 数字型值 */
		    char            str[MAX_STRING_LEN];    /* 字符串值 */
	        } FIELD;

    /* 运算规则 */
    typedef struct          {
            unsigned char   str[RULE_STR_SIZE];     /* 公式字符串 */
            int             addr[RULE_ADDR_SIZE];   /* 跳转地址表 */
		    double          num[256];	            /* 常数值表 */
            } RULE;
#endif

/*************************************************************************/

extern int ReadRuleFile(FILE *fp, RULE *rule);
/*************************************************************************
 Function: ReadRuleFile()
 Purpose : 从规则文件中读入公式行到运算规则 rule 中。
 Input   : 规则文件指针 fp,规则指针 rule。
 Return  : 返回 0,出错时返回非零的错误代码。
 Modify  : 无
 Remark  : 对公式语言进行了预编译
           错误代码:
           1...函数名错
           2...if....goto 语句错
           3...goto 语句错
           4...赋值表达式错
           5...下标超出范围
           6...标号错误
           7...无效字符
           8...逻辑非对象缺少括号
           9...配对符号错误
          10...常数太多
          11...规则文件超长
 *************************************************************************/

extern int  Formula(RULE *rule, FIELD *Xarray, FIELD *Yarray);
/*****************************************************************************
 Function: int Formula(RULE *rule, FIELD *Xarray, FIELD *Yarray)

 Purpose : 解释执行规则。

           规则由公式行构成,公式行以回车结尾,可以有空行。
           公式行结构 I : [标号:]  [公式 [,公式]...]  [goto 标号] [#注释]
           公式行结构 II: [标号:]  if  算术或逻辑公式  goto 标号  [#注释]
           []表示是可选的,[]本身不须输入。
           标号形为 @0,@1,... 共 RULE_ADDR_SIZE 个。

           公式是由变量、常量、函数和运算符组成算术表达式、逻辑表达式、
           字符串表达式、赋值表达式。这种构造是可嵌套的。

           赋值表达式:变量名 = 各种表达式 (包括字符串表达式、赋值表达式)
           赋值表达式的值就是右侧表达式的值。

           任何一个函数和表达式的值在计算时都代替了它自己在公式中的原有位置。
           多个用逗号分隔的并列公式的值为最后一个公式的值。

 Input   : 运算规则指针 rule,
           数据域数组 Xarray, 用于存放输入数据,与公式中的 x0, x1,... 对应。
           数据域数组 Yarray, 用于存放各返回值,与公式中的 y0, y1,... 对应。
           x 和 y 都必须小写,变量下标值范围由调用程序定义,但不得超过 255。

 Return  : 返回 0,出错时返回非零的错误代码。

 Modify  : 可能修改了 Xarray、Yarray 数组各成员的值。

 Remark  : 在公式中还可使用 z0, z1,... 共 Zarray_SIZE 个中间变量,z 必须小写。

                                  一、公式符号表
———————————————————————————————————————
级别    符号                            说明
———————————————————————————————————————
  1     函数名  !                       函数参数及逻辑非的对象须用()括起
———————————————————————————————————————
  2     *   /                           算术乘除
———————————————————————————————————————
  3     +   -                           算术加减
———————————————————————————————————————
  4     <   <=   >   >=   ==   !=       算术比较
———————————————————————————————————————
  5     &&                              逻辑与
———————————————————————————————————————
  6     ||                              逻辑或
———————————————————————————————————————
  7     =                               将等号右侧表达式的值赋给左侧的变量
———————————————————————————————————————
  8     ?   :                           条件运算符,条件运算符须用[]括起
———————————————————————————————————————
  8     ,                               函数参数分隔符,并列公式分隔符
———————————————————————————————————————
  9     (   )                           园括号,括号中的内容为0级
———————————————————————————————————————
  9     [   ]                           方括号,用于括起条件运算符
———————————————————————————————————————
        "                               字符串常量界定符,串内不能有双引号
———————————————————————————————————————
        @                               标号,@0,@1,...
———————————————————————————————————————

二、数值常量由数字字符及小数点构成,不支持科学记数法。每一条规则中最多只能
    有256个常数。
    由于没有单目运算符负号, 数值常量必须为正数,-1可写为(0-1)。

三、条件运算符也适用于字符串。方括号与园括号可以相互包含但不能交叉。

四、已有通用函数(函数名须照样书写,包括大小写):

    算术函数:
    Abs(x)                  取绝对值
    Ceil(x)                 取大于等于该数的最小整数
    Dec(x)                  取小数部分
    Floor(x)                取小于等于该数的最大整数
    Gradin(x, a, b)         x 位于区间(a,b)中的值(b为0表示无穷大)
    Max(x, y)               取最大值
    Min(x, y)               取最小值
    Mod(x, y)               取整除 x/y 的余数
    Pow(x, y)               计算 x 的 y 次方
    Round(x, n)             四舍五入至 n 位小数

    字符串函数:
    Asc(S)                  求字符串首字符的 ASCII 码
    Atol(S)                 将字符串转换成长整数
    FindStr(S1, S2)         在串 S1 中查找子串 S2 的位置,未找到返回 0
    Head(S, n)              取字符串头部 n 个字符
    IsNum(S)                是数字字符串
    LtoStr(n, m)            将正整数 n 转换成 m 位字符串,不足前面加 0
    RepChar(S, n)           将字符 S 重复 n 次
    Strcat(S1, S2)          连接两个字符串
    Strcmp(S1, S2)          比较两个字符串
    Strlen(S)               求字符串的长度
    SubStr(S, n, m)         从字符串的第 n 个字符起取 m 个字符
    Tail(S, n)              从字符串的尾部取 n 个字符
    Upper(S)                将串中的小写字母改为大写

    日期函数(日期串 D 的标准格式为 YYYY/MM/DD hh:mm:ss ):
    ConvDate(S, P)          将按 P 所示格式的日期串 S 转换成标准格式
    Date()                  当前系统的日期时间串
    DateAdd(D, P, n)        按格式串 P 的要求在 D 的相应部份上加上 n
    DateDiff(D1, D2, P)     按格式串 P 的要求返回 D2 与 D1 的差值
    DatePart(D, P)          按格式串 P 的要求返回 D 相应部份的数值
    StrToTime(D)            将 日期串 D 转换为日期串time_t 格式
    TimeToStr(t)            将 time_t 格式的 t 转换为日期串

    指明日期串相应部份的 P 格式串:
    yy                      年份
    qq                      季度
    mm                      月份
    dd                      月份中的日
    dy                      年份中的日
    dw                      星期几
    hh                      小时
    hf                      带小数的小时(仅用于 DateDiff)
    mi                      分钟
    mf                      带小数的分钟(仅用于 DateDiff)
    ss                      秒数

    地址函数:
    AddrToStr(u)            将 UINT4 IP 地址转换成园点地址串
    StrToAddr(S)            将园点地址串转换成 UINT4 IP 地址

五、新增函数时函数名须以大写字母开头,其后的字符可以是字母、数字及下划线。
    函数名的长度不得超过 15 个字符。
    新增函数必须在数组 FUNCTION  Fun[Total_of_Fun] 中按函数名的 ASCII 码递增
    顺序插入一行初始化其函数名及其函数地址,并将常量 Total_of_Fun 增加一。

六、错误代码:
    n...第 n 号函数执行错误
 *****************************************************************************/

/* End of file */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -