- 論壇徽章:
- 15
|
本帖最后由 yulihua49 于 2010-06-17 15:37 編輯
回復(fù) yulihua49
我已經(jīng)把問題簡化了,不至于要寫一個(gè)編譯器吧,現(xiàn)在你看看能不能用一個(gè)簡單函數(shù) ...
etoux 發(fā)表于 2010-06-17 15:23 ![]() - /* chkstr.c 對(duì)一行校驗(yàn)字典進(jìn)行處理 */
- #include <sdbc.h>
- #include "calc.h"
- double fabs(double x);
- static int chkline();
- /* 返回 :1 對(duì) 0 錯(cuò) */
- chkstr(strj,px,py,chkdata) /* 將校驗(yàn)行分解成左值和右值且計(jì)算 */
- char *strj;
- double *px,*py;
- double (*chkdata)(int,int,char *[CALCID]);
- {
- register char *pnow;
- char lft[512];
- static char rel[]="&|";
- int cc,c;
- *px=*py=0;
- if(!strj || !*strj) return(1);
- while(1) {
- /* 將校驗(yàn)行用'&|'截?cái)?*/
- pnow=stptok(strj,lft,sizeof(lft),rel);
- cc=chkline(lft,px,py,chkdata);
- if(!*pnow) break;
- c=(*pnow=='&');
- *pnow=0;
- if(!(*(++pnow)) || (cc ^ c)) break;
- strcpy(strj,pnow);
- }
- return cc;
- }
- static int chkline(strj,px,py,chkdata)
- char *strj;
- double *px,*py;
- double (*chkdata)(int,int,char *[CALCID]);
- {
- register char *cp, *pnow;
- char lft[512],rule[4];
- static char rel[]="!=<>";
- int cc;
- pnow=stptok(strj,lft,sizeof(lft),rel); /* 將校驗(yàn)行用'!=<>'截?cái)?*/
- if(!*pnow) { /* 校驗(yàn)行無'!=<>',即無右值 */
- *px=calculator(strj,chkdata);
- *py=0.;
- return(*px != *py);
- }
- cp=rule;
- while(strchr(rel,*pnow) && cp-rule<sizeof(rule)-1) { /* 將校驗(yàn)行中的`!=<>`送入rule中 */
- *cp++ = *pnow++;
- }
- *cp=0;
- *px=round(calculator(lft,chkdata)); /* 計(jì)算左值 */
- *py=round(calculator(pnow,chkdata)); /* 計(jì)算右值 */
- /*
- fprintf(stderr,"chkstr %f %s %f\n",*px,rule,*py);
- */
- cc=compare(*px,rule,*py);
- return(cc);
- }
- int compare(x,rel,y) /* 比較 x y */
- double x,y;
- register char *rel;
- {
- if(isnull(&x,CH_DOUBLE) ||
- isnull(&y,CH_DOUBLE)) return 0;
- if (!rel) return(x);
- else if (!strncmp(rel,"==",2)) return(x==y);
- else if (!strncmp(rel,">=",2)) return((x-y)>=0);
- else if (!strncmp(rel,"<=",2)) return((x-y)<=0);
- else if (!strncmp(rel,"!=",2)) return((x-y)!=0);
- else if (!strncmp(rel,"=",1)) return(x==y);
- else if (!strncmp(rel,">",1)) return(x>y);
- else if (!strncmp(rel,"<",1)) return(x<y);
- else {
- return(fabs(x-y) < 0.0001);
- }
- }
復(fù)制代碼 找了半天自己從前寫的東西,不用yacc解釋字典邏輯表達(dá)式的,挺長,有點(diǎn)看不懂了。 |
|