原创 开发通用软件程序的模板开发

2008-7-29 08:11 3054 5 5 分类: 软件与OS

#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);
 }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条