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

📄 wnparse.y

📁 一个与传统电子字典不同的字典
💻 Y
📖 第 1 页 / 共 2 页
字号:
%{#include "wngrind.h"static char *Id = "$Id: wnparse.y,v 1.48 2005/01/31 20:04:03 wn Rel $";Pointer ptrlist = NULL;		/* keep track of ptrs in syngroup */Framelist frlist = NULL;	/* keep track of frames in syngroup */G_Synset lastss = NULL;		/* last synset in list */Synonym lastsyn = NULL;		/* last synonym in this synset */Symbol satellite = NULL;	/* satellite pointed to */int headptr = FALSE;		/* indicate whether ptr is to head word */int headword = FALSE;		/* indicate whether word is head word */int foundhyper = FALSE;		/* indicate whether hypernym found in synset */short wdcnt = 0;		/* index of current synonym in synset */int aclass = 0;			/* keep track of adjective clss in syngroup */int wsense = 0;			/* keep track of word's sense number */int sense = 0;			/* keep track of sense number for ptrs */int satellite_sense = 0;	/* sense number for pointer to satellite */int cluscnt = 1;		/* count clusters (needed to resolve ptrs) */char *label;char buf[100];			/* useful buffer for building messages */char fnbuf[100];		/* save cross-file pointer for warning msg */%}%start wordnet%union {    char *tx;			/* for definitions, WYRD print names */    int number;			/* file #, sense # */    G_Synset ss;			/* for pointers to sense space */    Pointer p;			/* for pointers */    Synonym s;			/* for synonyms */    Symbol sym;			/* for pointer into symbol table */    Framelist fr;		/* for frame lists */}%token <tx> NOUNSYNSET VERBSYNSET ADJSYNSET ADVSYNSET%token <tx> OPENCLUS CLOSECLUS%token <tx> DEFN WYRD HEADWYRD VERBFRAMES FILENAME%token <number> NUM PTRSYM ADJCLASS SYNSET SYNSETKEY%type <number> adjclass key%type <fr> framelist%type <tx> defn%type <p> ptr ptrs%type <s> syns headsyn%type <sym> psyn syn syngroup headwyrd%type <ss> nss vss rss ahead ass fan fanlist acluster asslist%%wordnet: wordnet wordelem 	|	;wordelem: nss	{ if ($1) AddSynset($1); }	| vss	{ if ($1) AddSynset($1); }	| rss	{ if ($1) AddSynset($1); }	| acluster { }        | fan {	    if ($1) {		$1->isfanss = FALSE;		$1->part = ADJ;		$1->clusnum = 0;		AddSynset($1);	    }	}	| ']' {	yyerror("']' without matching '['\n"); }	;nss: NOUNSYNSET syns ptrs defn '}' key	{             $$ = MakeSynset(NOUN, $2, $3, NULL, $4, $6);	}	| NOUNSYNSET syns defn '}' key	{            $$ = MakeSynset(NOUN, $2, NULL, NULL, $3, $5);	}	;vss: VERBSYNSET syns ptrs framelist defn '}' key	{            $$ = MakeSynset(VERB, $2, $3, $4, $5, $7);	}	| VERBSYNSET syns framelist defn '}' key	{	    $$ = MakeSynset(VERB, $2, NULL, $3, $4, $6);	}        | VERBSYNSET syns ptrs defn '}' key	{	    $$ = MakeSynset(VERB, $2, $3, NULL, $4, $6);	}        | VERBSYNSET syns defn '}' key	{ 	    $$ = MakeSynset(VERB, $2, NULL, NULL, $3, $5);	}        ;rss: ADVSYNSET syns ptrs defn '}' key	{             $$ = MakeSynset(ADV, $2, $3, NULL, $4, $6);	}	| ADVSYNSET syns defn '}' key	{            $$ = MakeSynset(ADV, $2, NULL, NULL, $3, $5);	}	;syns:	{ $$=NULL; }        | syns syngroup	{	    wdcnt++;	    $$ = AddSynonym($1, CreateSynonym($2,					      (unsigned char)wsense,					      (headword ? -wdcnt : wdcnt),					      (unsigned char)aclass,					      label));	    headword = FALSE;	    aclass = 0;	}        | syns syn adjclass	{	    wdcnt++;	    $$ = AddSynonym($1, CreateSynonym($2,					      (unsigned char)wsense,					      (headword ? -wdcnt : wdcnt),					      (unsigned char)$3,					      label));	    headword = FALSE;	    aclass = 0;	}        | syns error	{ 	    yyerror("Error in synonym list, "); 	    if ($1) {		fprintf(logfile, "last good synonym: \"%s\"\n",			PrintSynonym(lastsyn));	    } else if (!wdcnt) {		fprintf(logfile, "invalid string found\n");	    } else {		fprintf(logfile,"first synonym group is bad\n");	    }	    $$ = $1;	}        ;syngroup: '[' syn adjclass ptrs ']'	{            aclass = $3;	    MakeSyngroup($4, NULL);	    $$ = $2;	}        | '[' syn adjclass ptrs framelist ']'	{            aclass = $3;	    MakeSyngroup($4, $5);	    $$ = $2;	}        | '[' syn adjclass framelist ']'	{            aclass = $3;	    MakeSyngroup(NULL, $4);	    $$ = $2;	}        ;syn: WYRD	{            $$ = CreateSymbol(strlower($1));	    label = UseLabel($1); /* decide whether to save original string */	    headword = FALSE;	    wsense = 0;	}        | WYRD NUM	{ 	    $$ = CreateSymbol(strlower($1));	    label = UseLabel($1); /* decide whether to save original string */	    headword = FALSE;	    wsense = $2;	    if (wsense > MAXID) {		sprintf(buf, "ID must be less than 16: %s%d\n",			$$->label, wsense);		yyerror(buf);	    }	}        | HEADWYRD	{	    $$ = CreateSymbol(strlower($1));/* If file is adj.all, then label must be NULL.  Otherwise, allow upper   case in synset since there's no head. */	    if ( ! strcmp(filelist[curfilenum()].fname, "adj.all" ) ) {		label = NULL;		headword = TRUE;	    } else {		label = UseLabel($1);		headword = FALSE;	    }	    wsense = 0;	}        | HEADWYRD NUM	{ 	    $$ = CreateSymbol(strlower($1));/* If file is adj.all, then label must be NULL.  Otherwise, allow upper   case in synset since there's no head. */	    if ( ! strcmp(filelist[curfilenum()].fname, "adj.all" ) ) {		label = NULL;		headword = TRUE;	    } else {		label = UseLabel($1);		headword = FALSE;	    }	    wsense = $2;	    if (wsense > MAXID) {		sprintf(buf, "ID must be less than 16: %s%d\n",			$$->label, wsense);		yyerror(buf);	    }	}        ;psyn: WYRD	{            $$ = CreateSymbol(strlower($1));	    sense = 0;	    satellite = NULL;	    satellite_sense = 0;	    headptr = FALSE;	    fnbuf[0] = '\0';	}        | WYRD NUM	{ 	    $$ = CreateSymbol(strlower($1));	    sense = $2;	    satellite = NULL;	    satellite_sense = 0;	    headptr = FALSE;	    fnbuf[0] = '\0';	}        | HEADWYRD {	    $$ = CreateSymbol(strlower($1));	    sense = 0;	    satellite = NULL;	    satellite_sense = 0;	    headptr = TRUE;	    fnbuf[0] = '\0';	}        | HEADWYRD NUM	{ 	    $$ = CreateSymbol(strlower($1));	    sense = $2;	    satellite = NULL;	    satellite_sense = 0;	    headptr = TRUE;	    fnbuf[0] = '\0';	}        | FILENAME WYRD	{	    $$ = CreateSymbol(strlower($2));	    sense = 0;	    satellite = NULL;	    satellite_sense = 0;	    headptr = FALSE;	    strcpy(fnbuf, $1);	/* save filename for warning msg */	    free($1);		/* free space malloc'd for string */	}        | FILENAME WYRD NUM	{ 	    $$ = CreateSymbol(strlower($2));	    sense = $3;	    satellite = NULL;	    satellite_sense = 0;	    headptr = FALSE;	    strcpy(fnbuf, $1);	/* save filename for warning msg */	    free($1);		/* free space malloc'd for string */	}        | FILENAME WYRD '^' WYRD	{/* new ones start here */	    $$ = CreateSymbol(strlower($2));	    sense = 0;	    satellite = CreateSymbol(strlower($4));	    satellite_sense = 0;	    headptr = FALSE;	    strcpy(fnbuf, $1);	/* save filename for warning msg */	    free($1);		/* free space malloc'd for string */	}        | FILENAME WYRD NUM '^' WYRD	{	    $$ = CreateSymbol(strlower($2));	    sense = $3;	    satellite = CreateSymbol(strlower($5));	    satellite_sense = 0;	    headptr = FALSE;	    strcpy(fnbuf, $1);	/* save filename for warning msg */	    free($1);		/* free space malloc'd for string */	}        | FILENAME WYRD NUM '^' WYRD NUM	{	    $$ = CreateSymbol(strlower($2));	    sense = $3;	    satellite = CreateSymbol(strlower($5));	    satellite_sense = $6;	    headptr = FALSE;	    strcpy(fnbuf, $1);	/* save filename for warning msg */	    free($1);		/* free space malloc'd for string */	}        | FILENAME WYRD '^' WYRD NUM	{	    $$ = CreateSymbol(strlower($2));	    sense = 0;	    satellite = CreateSymbol(strlower($4));	    satellite_sense = $5;	    headptr = FALSE;	    strcpy(fnbuf, $1);	/* save filename for warning msg */	    free($1);		/* free space malloc'd for string */	}        ;ptr: psyn PTRSYM	{ $$ = DoPointer($1, $2); } ;ptrs: ptrs ptr	{            if ($2) {		$$ = AddPointer($1, $2);	    } else { 		$$=$1;	    }	}        | ptr	{ $$=$1; }        | ptrs error	{	    Pointer p;	    yyerror("Error in pointer list, ");	    p = $1;	    if (p) {		for (; p->pnext; p = p->pnext);	/* find end of list */		fprintf(logfile,			"last valid pointer: \"%s\"\n",			PrintPointer(p));	    } else		fprintf(logfile,"first pointer in list is bad\n");	    $$=$1;	}        ;defn:	{ $$ = NULL; }        | DEFN	{ $$ = $1; }        ;key:    { $$ = NULL; }        | SYNSETKEY { $$ = $1; }adjclass: ','	{ $$=0; }        | ADJCLASS ','	{ $$=$1; }        ;framelist: VERBFRAMES NUM	{            if ($2 < 1 || $2 > NUMFRAMES) {		sprintf(buf, "Bad frame number: %d\n", $2);		yyerror(buf);		$$ = CreateFramelist(0);	    } else		$$ = CreateFramelist($2);	}        | framelist ',' NUM	{	    if ($3 < 1 || $3 > NUMFRAMES) {		sprintf(buf, "Bad frame number: %d\n", $3);		yyerror(buf);		$$ = $1;	    } else {		$1->frames[($3-1)/32] |= 1<<(($3 - 1) % 32);		$$ = $1;	    }	}        | framelist error	{ 	    yyerror("Error in frame list.\n"); 	    $$ = $1;	}        ;acluster: OPENCLUS asslist CLOSECLUS	{ cluscnt++; $$ = $2; }        | error ']'	{	    $$=NULL;	    yyerror("Had trouble finding the beginning of this cluster\n");	    yyerrok;	}	        ;asslist: ass	{ $$ = $1; }	| asslist '-' ass	{ $$ = $1; }	;ass: ahead fanlist	{            if ($1) {		$1->fans = $2;		$1->clusnum = cluscnt;		AddSynset($1);	    }	    $$ = $1;	}	| error fanlist {	    $$=NULL;	    yyerror("Can't find a head synset for this part of the cluster\n");	}	;fanlist:	{ $$=NULL; }	| fan fanlist	{ if ($1) $1->ssnext = $2; $$ = $1; }	    	;fan:  ADJSYNSET syns ptrs defn  '}' key	{	    if ($$ = MakeSynset(SATELLITE, $2, $3, NULL, $4, $6)) {		$$->isfanss = TRUE;		$$->clusnum = cluscnt;		AddToSynList($$); /* need since AddSynset() not done */	    }	}	| ADJSYNSET syns defn '}' key	{	    if ($$ = MakeSynset(SATELLITE, $2, NULL, NULL, $3, $5)) {		$$->isfanss = TRUE;		$$->clusnum = cluscnt;		AddToSynList($$); /* need since AddSynset() not done */	    }	}	| '[' fan	{	    yyerror("Opened a '[' in the middle of a cluster somewhere above here\n");	    $$=$2;	}	;ahead:  ADJSYNSET headsyn syns ptrs defn '}' key	{	    $$ = MakeSynset(ADJ, InsertSynonym($3, $2), $4, NULL, $5, $7);	}	| ADJSYNSET headsyn syns defn '}' key	{	    $$ = MakeSynset(ADJ, InsertSynonym($3, $2), NULL, NULL, $4, $6);	}	;headsyn: headwyrd	{           wdcnt = 1;           $$ = CreateSynonym($1,			      (unsigned char)wsense,			      -wdcnt,			      (unsigned char)aclass,			      NULL);	   headword = FALSE;	   aclass = 0;       }       | '[' headwyrd ptrs ']'	{	   MakeSyngroup($3, NULL);	   wdcnt = 1;	   $$ = CreateSynonym($2,			      (unsigned char)wsense,			      -wdcnt,			      (unsigned char)aclass,			      NULL);	   headword = FALSE;	   aclass = 0;       }        ;headwyrd: HEADWYRD adjclass	{	    $$ = CreateSymbol(strlower($1));	    wsense = 0;    	    aclass = $2;	    headword = TRUE;	}	| HEADWYRD NUM adjclass	{	    $$ = CreateSymbol(strlower($1));	    wsense = $2;	    aclass = $3;	    headword = TRUE;	}	;%%static void AddToSynList();

⌨️ 快捷键说明

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