📄 wnparse.y
字号:
%{#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 + -