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

组合框控件

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "error.h"
  3. #include "symbol.h"
  4. #include "grmrgrph.h"
  5. #include "grmrpars.h"
  6. #include "sntncelex.h"
  7. FILE *pfg;
  8. FILE *pfd;
  9. FILE *pft;
  10. int verbose;
  11. int ntrees=0;
  12. char *cuttoken(char **lhd){
  13.   char c, *token;
  14.   /*skip all blanks*/
  15.   while ((c=**lhd)!='' && (c==' ' || c=='t' || c=='n'))
  16.         (*lhd)++;
  17.   token=*lhd;
  18.   /*forward*/
  19.   while ((c=**lhd)!='' && !(c==' ' || c=='t' || c=='n'))
  20.         (*lhd)++;
  21.   /*terminate and proceed*/
  22.   if (**lhd!=''){
  23.      **lhd='';
  24.      (*lhd)++;
  25.   }    
  26.   return token;
  27. }
  28. char *uncuttoken(char **lhd, char *token){
  29. char *tmplhd;
  30. tmplhd=(*lhd);
  31. *lhd=token;
  32. *(--tmplhd)=' ';
  33. return *lhd;
  34. }
  35. parseg(){
  36.   char line[MAXLINELEN], *linehead=line, *token;
  37.   symbol_node_t *left, *prer, *curr;
  38.   unsigned int rolcount;
  39.   double pval;
  40.   grmrindxinit();
  41.   /*install the finishing symbol*/
  42.   ECHK(instfinode();, return -1;)
  43.   /*repeatedly reading rules*/
  44.   for (;fgets(line, MAXLINELEN, pfg)!=NULL;linehead=line){
  45.         /*reading left part*/
  46.         token=cuttoken(&linehead);
  47.         if (*token=='')
  48.            /*skip blank lines*/
  49.            continue;
  50.         if (*token=='%')
  51.            break;
  52. /*probability of the rule*/
  53. pval=atof(token);
  54. token=cuttoken(&linehead);
  55.         /*left part read, build it into graph*/
  56.         ECHK(left=instnode(token, linehead-token, 'L');, return -1;)
  57.         /*memorize start symbol*/
  58.         if (strcmp(token, START)==0)
  59.            ssym=left;
  60.         /*reading mid part*/
  61.         token=cuttoken(&linehead);
  62.         /*mismatch*/
  63.  if (strcmp(token, GENERATOR)!=0){
  64.  errcode=NOGENERATOR;
  65.  return -1;
  66.  }
  67.         //EGEN(strcmp(token, GENERATOR)!=0, NOGENERATOR, return -1;)
  68.         do{
  69.            /*mid part read, reading first component of right part*/
  70.            rulcount++;
  71.            rolcount=0;
  72.    ruleindex[rulcount].probability=pval;
  73.            token=cuttoken(&linehead);
  74.            /*missing right part*/
  75.            EGEN(*token==''||strcmp(token, SEPARATOR)==0, 
  76.                NORIGHTPART, return -1;)
  77.            /*first right component read, build it into graph*/ 
  78.            ECHK(curr=prer=instnode(token, linehead-token, 'R');, 
  79.                return -1;)
  80.            serialize(left);
  81.            /*draw an arc of "first" type, update role counter*/
  82.            ECHK(reltnodes(curr, left, rulcount, rolcount++, 'f');, 
  83.                return -1;)
  84.            serialize(curr);
  85.            /*repeatedly read the following right conponents*/
  86.            while (*(token=cuttoken(&linehead))!='' &&
  87.                  strcmp(token, SEPARATOR)!=0){
  88.                  ECHK(curr=instnode(token, linehead-token, 'R');,
  89.                      return -1;) 
  90.               
  91.                  /*draw an arc of "adjacent" type*/
  92.                  ECHK(reltnodes(curr, prer, rulcount, rolcount++, 'a');,
  93.                      return -1;)
  94.                  serialize(curr);
  95.                  prer=curr;
  96.            }
  97.         
  98.            /*draw an arc of "last" type, from left to the most right*/
  99.            ECHK(reltnodes(left, curr, rulcount, rolcount, 'l');, 
  100.                return -1;)
  101.        }while(*token!=''); 
  102.   }
  103.   /*missing starting nonterminal*/
  104.   EGEN(ssym==NULL, NOSTART, return -1;)
  105.   /*draw an arc of "adjacent" type, from fininshing symbol to starting symbol*/
  106.   ECHK(reltnodes(fsym, ssym, 0, 1, 'a');, return -1;)
  107.   /*number all the symbols*/
  108.   numnodes();
  109.   grmrindxfini();
  110.   rulupbound=(unsigned int)(rulcount+1);
  111.   return 0;
  112. }
  113.  // extern int maxlink, fufiled;
  114. installdict(){
  115.   char line[MAXLINELEN], *linehead=line, *token;
  116.   wentry_t *wentry;
  117.   unsigned int term;
  118.   for (;fgets(line, MAXLINELEN, pfd)!=NULL;linehead=line){
  119.       token=cuttoken(&linehead);
  120.       if (*token=='')
  121.            continue;
  122.       wentry=dictinsert(token);
  123.       while (*(token=cuttoken(&linehead))!=''){
  124. //  if ((term=token2tcode(token))==-1)
  125. //  printf("%s", token);
  126.   EGEN((term=token2tcode(token))==-1, UNKNOWNTERM, {return -1;})
  127.             adddef(wentry, term);
  128.       }
  129.   }
  130.   wentry=dictinsert("");
  131.   adddef(wentry, fsym->sid);
  132. //  printf("%dn", maxlink);
  133. //  printf("%dn", fufiled);
  134.   return 0;
  135. }