GRMRGRPH.Cpp
上传用户:tenhai
上传日期:2021-02-19
资源大小:492k
文件大小:5k
源码类别:

组合框控件

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "error.h"
  3. #include "symbol.h"
  4. #include "symbtbl.h"
  5. #include "grmrgrph.h"
  6. symbol_node_ref_tbl_t t_tbl, nt_tbl;
  7. symbol_node_t *ssym, *fsym;
  8. ruleindex_t *ruleindex;
  9. symbol_node_t **symserial;
  10. unsigned int oldrulcount, rulcount, rulupbound;
  11. unsigned int tntcount;
  12. int arccount;
  13. grmrindxinit(void){
  14.   ruleindex=(ruleindex_t *)calloc(MAXRULES, sizeof(ruleindex_t));
  15.   symserial=(symbol_node_t **)calloc(MAXROLES, sizeof(symbol_node_t *));
  16.   ruleindex[0].length=1;
  17.   ruleindex[0].fstidx=0;
  18.   ruleindex[0].probability=1.0;
  19.   return 0;
  20. }
  21. grmrindxfini(void){
  22.   unsigned int i;
  23.   
  24.   ruleindex=(ruleindex_t *)realloc(ruleindex, sizeof(ruleindex_t)*(rulcount+1));
  25.   symserial=(symbol_node_t **)realloc(symserial, sizeof(symbol_node_t *)*(arccount+2));
  26.   
  27.   symserial[0]=NULL;
  28.   symserial[1]=ssym;
  29.   
  30.   for (i=1;i<rulcount;i++){
  31.       ruleindex[i].length=(unsigned int)(ruleindex[i+1].fstidx-ruleindex[i].fstidx-1);
  32.   ruleindex[i].leftcate=symserial[ruleindex[i].fstidx]->sid;
  33.   }
  34.   ruleindex[rulcount].length=(unsigned int)(arccount-ruleindex[rulcount].fstidx+1);
  35.   ruleindex[rulcount].leftcate=symserial[ruleindex[rulcount].fstidx]->sid;
  36.   return 0;
  37. }
  38. serialize(symbol_node_t *psym){  
  39.   symserial[2+arccount++]=psym;
  40.   if ((arccount+2)%MAXROLES==0)
  41.      symserial=(symbol_node_t **)
  42.                realloc(symserial, sizeof(symbol_node_t *)*(2+arccount+MAXROLES));
  43.   if (rulcount>oldrulcount){
  44.      ruleindex[rulcount].fstidx=arccount+1;
  45.      if ((rulcount+1)%MAXRULES==0)
  46.         ruleindex=(ruleindex_t *)
  47.                   realloc(ruleindex, sizeof(ruleindex_t)*(rulcount+1+MAXRULES));
  48.   }
  49.   oldrulcount=rulcount;
  50.   return 0;
  51. }
  52. unsigned int token2tcode(char *token){
  53.     if (tblsearch(&t_tbl, token))
  54.        return tblcurrent(t_tbl)->sid;
  55.     else
  56.        return tcount;
  57. }
  58. releasenode(symbol_node_t *psym){
  59.   symbol_arc_t *parc, *qarc;
  60.   for (parc=psym->fstlst;parc!=NULL;parc=qarc){
  61.       qarc=parc->nxt;
  62.       free(parc);
  63.   }
  64.   for (parc=psym->lstlst;parc!=NULL;parc=qarc){
  65.       qarc=parc->nxt;
  66.       free(parc);
  67.   }
  68.   for (parc=psym->adjlst;parc!=NULL;parc=qarc){
  69.       qarc=parc->nxt;
  70.       free(parc);
  71.   }
  72.   free(psym->literal);
  73.   free(psym);
  74.   return 0;
  75. }
  76. symbol_node_t *instnode(char *token, int tokensize, char mode){
  77.   symbol_node_t *pnews;
  78.   char *str;
  79.   if (tblsearch(&nt_tbl, token))
  80.      /*the token is a known NT, exit*/
  81.      return tblcurrent(nt_tbl);
  82.   if (tblsearch(&t_tbl, token)){
  83.      if (mode=='R')
  84.         /*the token is a known T, exit*/
  85.         return tblcurrent(t_tbl);
  86.      /*since the token appears on the left, it is an NT from now on*/
  87.      EGEN(tblfull(nt_tbl), TBLFUL, return NULL;)
  88.      tblremove(&t_tbl, &pnews);
  89.      tblinsert(&nt_tbl, pnews);
  90.   }
  91.   else{
  92.      EGEN(mode=='L' && tblfull(nt_tbl)||
  93.           mode=='R' && tblfull(t_tbl),
  94.           TBLFUL, return NULL;)
  95.      /*make a new symbol node*/
  96.      EGEN((str=(char*)malloc(tokensize))==NULL, MEMFUL, return NULL;)
  97.      EGEN((pnews=(symbol_node_t *)malloc(sizeof (symbol_node_t)))==NULL,
  98.           MEMFUL, return NULL;)
  99.      pnews->sid=0;
  100.      pnews->fstlst=pnews->lstlst=pnews->adjlst=NULL;
  101.      strcpy(str, token);
  102.      pnews->literal=str;
  103.      if (mode=='R')
  104.         tblinsert(&t_tbl, pnews);
  105.      else
  106.         tblinsert(&nt_tbl, pnews);
  107.      /*debug use*/
  108.      /*printf("%sn", token);*/
  109.   }
  110.   return pnews;
  111. }
  112. symbol_node_t *instfinode(void){
  113.   /*make the finishing node*/
  114.   EGEN((fsym=(symbol_node_t *)malloc(sizeof (symbol_node_t)))==NULL,
  115.        MEMFUL, return NULL;)
  116.   EGEN((fsym->literal=(char *)malloc(sizeof(char)))==NULL, MEMFUL, free(fsym);return NULL;)
  117.   *fsym->literal='';
  118.   fsym->sid=0;
  119.   fsym->fstlst=fsym->lstlst=fsym->adjlst=NULL;
  120.   tblappend(&t_tbl, fsym);
  121.   return fsym;
  122. }
  123. numnodes(void){
  124.   unsigned int idx;
  125.   
  126.   tntcount=(unsigned int)(tcount+ntcount);
  127.  
  128.   for (idx=0;idx<tcount;idx++)
  129.       tblinfo(t_tbl, idx)->sid=idx;
  130.   for (;idx<tntcount;idx++)
  131.       tblinfo(nt_tbl, idx-tcount)->sid=idx;
  132.   return 0;
  133. }
  134. symbol_arc_t *reltnodes(symbol_node_t *from, 
  135.                         symbol_node_t *to, 
  136.                         unsigned int rule, unsigned int role, 
  137.                         char mode){
  138.   symbol_arc_t *pnewa;
  139.   EGEN((pnewa=(symbol_arc_t *)malloc(sizeof (symbol_arc_t)))==NULL,
  140.        MEMFUL, return NULL;)
  141.   pnewa->aim=to;
  142.   pnewa->rule=rule;
  143.   pnewa->role=role;
  144.   switch (mode){
  145.     case 'f':pnewa->nxt=from->fstlst;from->fstlst=pnewa;break;
  146.     case 'a':pnewa->nxt=from->adjlst;from->adjlst=pnewa;break;
  147.     case 'l':pnewa->nxt=from->lstlst;from->lstlst=pnewa;break;
  148.   }
  149.   
  150.   /*debug use*/
  151.   /*printf("from %s to %d.%d %sn", from->literal, rule, role, to->literal);*/
  152.   return pnewa;
  153. }
  154. releasenodes(void){
  155.   unsigned int idx;
  156.  
  157.   for (idx=0;idx<tcount;idx++)
  158.       releasenode(tblinfo(t_tbl, idx));
  159.   for (idx=0;idx<ntcount;idx++)
  160.       releasenode(tblinfo(nt_tbl, idx));
  161.   tblclear(&t_tbl);
  162.   tblclear(&nt_tbl);
  163.   tntcount=0;
  164.   ssym=fsym=NULL;
  165.   return 0;
  166. }
  167. releasegrmr(void){
  168.   releasenodes();
  169.   free(ruleindex);
  170.   free(symserial);
  171.   ruleindex=NULL;
  172.   symserial=NULL;
  173.   rulcount=0;
  174.   oldrulcount=0;
  175.   arccount=0; 
  176.   return 0;
  177. }