⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grmrpars.cpp

📁 中科院开源的ictprop源码,使用方法: 1、修改源码中的InputComboBox.cpp文件 InvokeAction里面的txt文件路径换成你的本地路径; 2、入口在帮助里面
💻 CPP
字号:
#include "stdafx.h"
#include "error.h"
#include "symbol.h"
#include "grmrgrph.h"
#include "grmrpars.h"
#include "sntncelex.h"

FILE *pfg;
FILE *pfd;
FILE *pft;
int verbose;
int ntrees=0;

char *cuttoken(char **lhd){
  char c, *token;

  /*skip all blanks*/
  while ((c=**lhd)!='\0' && (c==' ' || c=='\t' || c=='\n'))
        (*lhd)++;
  token=*lhd;

  /*forward*/
  while ((c=**lhd)!='\0' && !(c==' ' || c=='\t' || c=='\n'))
        (*lhd)++;

  /*terminate and proceed*/
  if (**lhd!='\0'){
     **lhd='\0';
     (*lhd)++;
  }    

  return token;
}

char *uncuttoken(char **lhd, char *token){
	char *tmplhd;

	tmplhd=(*lhd);

	*lhd=token;
	*(--tmplhd)=' ';

	return *lhd;
}


parseg(){
  char line[MAXLINELEN], *linehead=line, *token;
  symbol_node_t *left, *prer, *curr;
  unsigned int rolcount;
  double pval;

  grmrindxinit();
  /*install the finishing symbol*/
  ECHK(instfinode();, return -1;)

  /*repeatedly reading rules*/
  for (;fgets(line, MAXLINELEN, pfg)!=NULL;linehead=line){
        /*reading left part*/
        token=cuttoken(&linehead);
        if (*token=='\0')
           /*skip blank lines*/
           continue;

        if (*token=='%')
           break;

		/*probability of the rule*/
		pval=atof(token);


		token=cuttoken(&linehead);
        /*left part read, build it into graph*/
        ECHK(left=instnode(token, linehead-token, 'L');, return -1;)
        /*memorize start symbol*/
        if (strcmp(token, START)==0)
           ssym=left;

        /*reading mid part*/
        token=cuttoken(&linehead);
        /*mismatch*/
		 if (strcmp(token, GENERATOR)!=0){
			 errcode=NOGENERATOR;
			 return -1;
		 }
        //EGEN(strcmp(token, GENERATOR)!=0, NOGENERATOR, return -1;)

        do{
           /*mid part read, reading first component of right part*/
           rulcount++;
           rolcount=0;
		   ruleindex[rulcount].probability=pval;

           token=cuttoken(&linehead);
           /*missing right part*/
           EGEN(*token=='\0'||strcmp(token, SEPARATOR)==0, 
               NORIGHTPART, return -1;)

           /*first right component read, build it into graph*/ 
           ECHK(curr=prer=instnode(token, linehead-token, 'R');, 
               return -1;)

           serialize(left);
           /*draw an arc of "first" type, update role counter*/
           ECHK(reltnodes(curr, left, rulcount, rolcount++, 'f');, 
               return -1;)
           serialize(curr);

           /*repeatedly read the following right conponents*/
           while (*(token=cuttoken(&linehead))!='\0' &&
                 strcmp(token, SEPARATOR)!=0){
                 ECHK(curr=instnode(token, linehead-token, 'R');,
                     return -1;) 
              
                 /*draw an arc of "adjacent" type*/
                 ECHK(reltnodes(curr, prer, rulcount, rolcount++, 'a');,
                     return -1;)
                 serialize(curr);

                 prer=curr;
           }
        
           /*draw an arc of "last" type, from left to the most right*/
           ECHK(reltnodes(left, curr, rulcount, rolcount, 'l');, 
               return -1;)

       }while(*token!='\0'); 
  }

  /*missing starting nonterminal*/
  EGEN(ssym==NULL, NOSTART, return -1;)
  /*draw an arc of "adjacent" type, from fininshing symbol to starting symbol*/
  ECHK(reltnodes(fsym, ssym, 0, 1, 'a');, return -1;)

  /*number all the symbols*/
  numnodes();
  grmrindxfini();
  rulupbound=(unsigned int)(rulcount+1);

  return 0;
}

 // extern int maxlink, fufiled;

installdict(){
  char line[MAXLINELEN], *linehead=line, *token;
  wentry_t *wentry;
  unsigned int term;

  for (;fgets(line, MAXLINELEN, pfd)!=NULL;linehead=line){
      token=cuttoken(&linehead);
      if (*token=='\0')
           continue;
      wentry=dictinsert(token);

      while (*(token=cuttoken(&linehead))!='\0'){
		//  if ((term=token2tcode(token))==-1)
		//	 printf("%s", token);
		  EGEN((term=token2tcode(token))==-1, UNKNOWNTERM, {return -1;})
            adddef(wentry, term);
      }
  }

  wentry=dictinsert("");
  adddef(wentry, fsym->sid);

//  printf("%d\n", maxlink);
//  printf("%d\n", fufiled);
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -