#include <stdlib.h>
#include "p_len.h"
#include "p_inner.h"
#include "p_define.h"
#include "p_struct.h"
extern int ExecFunc(char *s);
#define INSERT_CTL_RECORD(L,K,T,TS,LAY,CNUM) {funcctrl[k].linenum=L; strcpy(funcctrl[k].keyword,K);funcctrl[k].Type=T;funcctrl[k].tstartl=TS; funcctrl[k].tendl=-1; funcctrl[k].fstartl=-1; funcctrl[k].fendl=-1; funcctrl[k].layernum=LAY; funcctrl[k].countnum=CNUM;}
#define UPDATE_CTL_RECORD(M,N) {M=N;}
#define PrintCtlRecord(K) {for(i=0;i<K;i++) printf("NO:%02d\tL:%d\tKw:%-8.8s\tT:%d\tTS:%d\tTE:%d\tFS:%d\tFE:%d\tLayN:%d\tCN:%d\n",i,funcctrl.linenum,funcctrl.keyword,funcctrl.Type,funcctrl.tstartl,funcctrl.tendl,funcctrl.fstartl,funcctrl.fendl,funcctrl.layernum,funcctrl.countnum);}
typedef struct CTLKEYWORD
{
char keyword[10];
int type; /* type="1" 为IF要求配对,2 While要求配对 3Goto 不配对 */
int dir;
} CTLKEY;
CTLKEY ctlkey[]=
{
{"IF",1,1},
{"ELSE",1,0},
{"ENDIF",1,-1},
{"WHILE",2,1},
{"BREAK",2,2}, /* 向下找 同一层内的WEND */
{"CONTINUE",2,3}, /* 向上找 同一层内的WHILE */
{"GOTO",3,4}, /* 查找全部记录,找到与GOTO参数相同的LINEMARK */
{"LINEMARK",3,5},
{"DONE",2,-1},
};
PFUNCCONTROL funcctrl[100];
int FindKeyWord(char *KeyWord)
{
int i,flag=0;
for(i=0;i<sizeof(ctlkey)/sizeof(CTLKEY);i++)
{
if(flag==0 && strcmp(KeyWord,ctlkey.keyword)==0)
{
/* x="ctlkey".p(FuncPa); */
flag=1; /* 找到了 */
break;
}
}
if(flag==1) return(i);
if(flag==0) return(-1);
}
int FindSameLayer(int Sum,int LayNum)
{
int i,flag=0;
for(i=Sum;i>=0;i--)
{
if(funcctrl.layernum==LayNum)
{
flag=1; /* 找到了 */
break;
}
}
if(flag==1) return(i);
if(flag==0) return(-1);
}
int FindSameLayerComm(int Sum,int LayNum,char *KeyWord)
{
int i,flag=0;
for(i=Sum;i>=0;i--)
{
if(funcctrl.layernum==LayNum && strcmp(funcctrl.keyword,KeyWord)==0)
{
flag=1; /* 找到了 */
break;
}
}
if(flag==1) return(i);
if(flag==0) return(-1);
}
int FindLayerComm(int Sum,char *KeyWord,char *Para)
{
int i,flag=0;
for(i=Sum;i>=0;i--)
{
if(strcmp(funcctrl.keyword,KeyWord)==0) /* 先不判断参数 && strcmp(funcctrl.condition1,Para)==0) */
{
flag=1; /* 找到了 */
break;
}
}
if(flag==1) return(i);
if(flag==0) return(-1);
}
int ParseCtl(int Type1)
{
char FuncNa[100],FuncPa[100];
int i,j,k,x,n=0,m=0,m0=0,m1=0,flag=0,FuncSum;
int LayerNum="0", Type="0"; /* 在一个 层增加时的类型,要与层减少时的类型一致 */
int CountNum="0";
FuncSum=GetFuncName(5);
k=0;
for(i=0;i<FuncSum;i++)
{
/* 将函数名和参数分离出来 */
Parse(FuncName,':',2);
strcpy(FuncNa,Para[0]);
strcpy(FuncPa,Para[1]);
/* 在关键字表中找,找到 n 为关键字表中位置,没找到为-1 */
n=FindKeyWord(FuncNa);
if(n<0) continue; /* 没找到 流程控制关键字,进行下一个 */
if(ctlkey[n].dir==1) /* IF, WHILE 等 */
{
INSERT_CTL_RECORD(i, ctlkey[n].keyword, ctlkey[n].type, i+1, LayerNum, CountNum);
Type=funcctrl[k].Type;
LayerNum++;
printf(" keyword[%d]=%s line=%d Lay=%d\n",k,funcctrl[k].keyword,funcctrl[k].linenum,funcctrl[k].layernum);
k++;
}
if(ctlkey[n].dir==2) /* BREAK 等 , 规定:不允许这类语句夹在 IF 和 ENDIF之间 */
{
INSERT_CTL_RECORD(i, ctlkey[n].keyword, ctlkey[n].type, i+1, LayerNum, CountNum);
k++;
}
if(ctlkey[n].dir==3) /* CONTINUE 等 , 规定:不允许这类语句夹在 IF 和 ENDIF之间 */
{
INSERT_CTL_RECORD(i, ctlkey[n].keyword, ctlkey[n].type, i+1, LayerNum, CountNum);
k++;
}
if(ctlkey[n].dir==4) /* GOTO 等 , 规定:不允许这类语句夹在 IF 和 ENDIF之间 */
{
INSERT_CTL_RECORD(i, ctlkey[n].keyword, ctlkey[n].type, i+1, LayerNum, CountNum);
k++;
}
if(ctlkey[n].dir==5) /* LINEMARK 等 */
{
if(ctlkey[n].type==3)
{
/* 根据参数Para 查找对应的GOTO,找到后,将行号 赋值到 GOTO的startline */
m=FindLayerComm(k-1,"GOTO","");
printf("FindLayerComm m=%d i=%d\n",m,i);
}
if(m>0)
{
funcctrl[m].tstartl=i;
funcctrl[m].fstartl=i;
}
}
if(ctlkey[n].dir==-1) /* ENDIF, WEND 等 */
{
LayerNum--;
/* 给 Break, Contine等 赋值 */
if(ctlkey[n].type==2)
{
m0=FindSameLayerComm(k-1,LayerNum+1,"CONTINUE");
m1=FindSameLayerComm(k-1,LayerNum+1,"BREAK");
}
m=FindSameLayer(k-1,LayerNum);
if(m>=0)
{
if(funcctrl[m].fendl<0) funcctrl[m].fendl = i;
if(funcctrl[m].tendl<0) funcctrl[m].tendl = i;
}
else
{
printf("语法错误,找不到对应的IF or WHILE\n");
exit(-1);
}
if(ctlkey[n].type==2 && m0 > m) /* Contiue 在 while 之后 */
{
funcctrl[m0].tstartl=funcctrl[m].tstartl-1;
funcctrl[m0].fstartl=funcctrl[m0].linenum+1;
}
if(ctlkey[n].type==2 && m1 > m) /* Contiue 在 while 之后 */
{
funcctrl[m1].fstartl=funcctrl[m1].linenum+1;
funcctrl[m1].tstartl=funcctrl[m].fendl;
}
}
if(ctlkey[n].dir==0) /* ELSE 等 */
{
m=FindSameLayer(k-1,LayerNum-1);
printf("FindSameLayer: Count:%d LayerNum:%d Find:%d L:%d\n",k,LayerNum,m,i);
if(m>=0)
{
funcctrl[m].tendl = i;
funcctrl[m].fstartl = i;
}
else
{
printf("语法错误,找不到对应的IF\n");
exit(-1);
}
}
}
printf(" LayerNum=%d\n", LayerNum);
return(k);
}
main()
{
int i,FuncSum,n=0;
char buf[100];
/* 从数据库中读出共有N个函数 */
/*
i=SysVarInit();
i=PutVarSet(SYS_SYSTIME,"165020");
i=GetVarSet(SYS_SYSTIME,buf);
printf(" SYSTIME Buf=%s\n",buf);
i=PutStruct(SYS,4,"165021");
i=GetStruct(SYS,4,buf);
printf(" NO 4 Buf=%s\n",buf);
i=PutVarSeti(SYS_LEN,888);
i=GetVarSeti(SYS_LEN);
printf("INT=%d\n",i);
i=PutVar("SYS","SYSTIME","190020");
i=GetVar("SYS","SYSTIME",buf);
i=VarOper("SYS|SYSTIME|5=USER|NAME|2|5");
i=ClrVar("SYS","SYSTIME");
printf("Buf=%s\n",buf);
*/
FuncSum=GetFuncName(5);
n=ParseCtl(1);
/*
for(i=0;i<FuncSum;i++)
{
ParseCtl(FuncName,i);
}
*/
PrintCtlRecord(n);
exit(0);
FuncSum=GetFuncName(5);
for(i=0;i<FuncSum;i++)
{
if(i==2) i="12";
printf("func num=%d\n",i);
ExecFunc(FuncName);
}
}
文章评论(0条评论)
登录后参与讨论