编程手记之ansi c篇-(六)lisp宏解析
1.lisp宏文法 【程序编程相关:winform中树和数据库关联操作的例子】lisp以其优美简洁的语法备受编程爱好者推崇,至今在许多基于脚本的解释环境中,liisp语言的影子仍随处可见,在此仅讨论一个与lisp类似的宏公式解析,姑且称其为lisp宏吧,该lisp宏主要用于表单项目或网格列的自动计算. 【推荐阅读:COM+入门】lisp宏由一个函数体构成 【扩展信息:使用UML对系统进行建模】/************************************************************eg: func1(param1,func2(parm,...),param2,...)函数体由函数名与参数列表组成lispnode --> funcname + "(" + {funcparam + ","} + ")"参数可以为常数.变量或子函数体funcparam --> lispnode | variable | consttoken函数名由字母开头的字符串组成funcname --> {a | b... | 1 | 2 ...}变量由字母开头的字符串变量组成variable --> {a | b | ... | 1 | 2 ...}常数可以为数字常数或字符串常数consttoken -> [stringtoken | numerictoken]字符串常数由前后单括号与字符串组成stringtoken --> "´" + {a | b... | 1 | 2 ...} + "´"数字常数由数字与小数点组成numerictoken --> {1 | 2 | ...}*************************************************************/2.lisp宏解析的终结符集合
/*define some terminated char*/#ifndef nill#define nill _t(´\x02´)#endif/*define blank char for skiping*/static tchar lispblankchar[] = {_t(´ ´),_t(´\t´),´\r´,_t(´\n´),nill};/*define function name terminated char*/static tchar lispfuncnameterm[] = {_t(´(´),_t(´\0´),nill};/*define param terminated char*/static tchar lispparamterm[] = {_t(´,´),_t(´)´),_t(´\0´),nill};3.lisp宏数据结构定义
/*define lisp node struct*/typedef struct _lispnode{ link lk; /*lisp node self link component*/ link lkparams; /*lisp node param root link component*/ int type; /*lisp node tag eg: lnnull for nothing, lnstring,lnnumeric for const value, lnvar for variable item, lnnode for sub lisp node*/ tchar* data; /*lisp node data, case lnstring data is const string token,case lnnumeric data is const numeric token,case lnitem data is variable name, case lnnode data is function name*/}lispnode;/*定义用于取得变量值的回调函数*/
typedef tchar* (*lispvarfetch)(const tchar* var,void* parm);/*定义宏计算函数的统一样式*/typedef tchar* (*lispfuncptr)(tchar* pa[],int size);/*define lisp data struct*/
typedef struct _lispdata{ link lk; /*lisp data self link component*/ linkptr ht; /*lisp function set, storing in hash table*/ linkptr ln; /*lisp root node*/ lispvarfetch vf; /*fetch outside variable value*/ void* vfparma; /*variable fetch func callback param*/}lispdata;/*define lisp node type*/
typedef enum{lnnull = 0,lnnode = 1,lnvar = 2,lnstring = 3,lnnumeric = 4}nodetype;/*定义从通用连接件中恢复数据节点*/
#define lispnodefromlink(p) ((lispnode*)((unsigned int)p - (unsigned int)&(((lispnode*)0)->lk))) #define lispdatafromlink(p) ((lispdata*)((unsigned int)p - (unsigned int)&(((lispdata*)0)->lk))) ... 下一页