pscan.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 965 行 · 第 1/2 页

C
965
字号
#ifndef lintstatic char sccsid[] = "@(#)pscan.c	4.2	(Berkeley)	82/11/06";#endif not lint#include "names.h"#include "conp.h"#define isadv(c)	(c == ADV || c == ADJ_ADV)#define isadj(c)	(c == ADJ || c == NOUN_ADJ || c == ADJ_ADV || c == UNK)#define notnoun(c)	(c != NOUN && c != UNK && c != NOUN_VERB && c != NV_PL && c != PNOUN)#define issing(c)	(c == UNK || c == NOUN_VERB || c == NOUN || c == NOM || c == NOUN_ADJ)#define isnoun(c)	(c == NOUN || c == NOUN_VERB || c == NV_PL || c == UNK || c == PNOUN)#define nounnom(c)	(c == NOUN || c == NOM)char lastc,nextc;int savsub;scan(si,ce,command)	/*scan a phrase */int si; char ce;{	int savi;	char c;	i=si;	if(command == 1)subty = PLURAL;	else subty = 0;	if(sent[i].cc==ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK && sent[i+1].cc != ADJ)		sent[i++].cc = ADV;	done=0;	verb = 0;	verb=getv(i,ce);	/*get verb if obvious*/	if(command == 0)j=getnoun(i,ce);		/*get subject*/	else j = si;	if(i != j || ((i==j) && sent[i].cc == NOUN)){		i = j+1;	}	for(;((c=sent[i].cc) != ce) && (c != END)  && (c != '\0');i++){		nextc=sent[i+1].cc;		if(i>0){			lastc=sent[i-1].cc;			if(lastc==BE)be=1;			else{				if(lastc != ADV)be=0;			}		}		else lastc=0;		if(verb==1)question=0;		switch(c){		case '"':			if(nextc==ED || nextc == MVERB){				verb=1;				sent[++i].cc=VERB;				subty=SING;				continue;			}			subty=0;			verb=getv(++i,ce);			i=getnoun(i,ce);			continue;		case MVERB:			sent[i].cc = VERB;			if(i < nsleng*.5){				verb = getv(++i,ce);				i = getnoun(i,ce);				continue;			}			continue;		case ART:		case ADJ:		case POS:			case ING:			aflg=1;			i=getnoun(i,ce);			aflg=0;			continue;		case PREP:				if(nextc == ce){				sent[i].cc=ADV;				goto sdone;			}			prep=1;			i=getnoun(++i,ce);			prep=0;			continue;		case VERB_ADJ:			if(verb==0){				sent[i].cc=VERB;				verb=1;				continue;			}		case NOUN_ADJ:			if(be==1){				sent[i].cc=ADJ;				continue;			}		case PRONP_ADJ:		case PRONS_ADJ:			i=getnoun(i,ce);			continue;		case NOUN_ADV:			if(verb == 1 && iverb == i+1){				sent[i].cc = NOUN;			}			else {				sent[i].cc = ADV;			}			continue;		case ADJ_ADV:			if(be == 1){				if (isadj(nextc)) {					sent[i].cc = ADV;					continue;				}				if(nextc == ',' && isadv(sent[i+2].cc)) {					sent[i++].cc = ADV;					sent[++i].cc = ADV;					comma--;					continue;				}				sent[i].cc = ADJ;				continue;			}			if(lastc == NOUN && (nextc == ',' || nextc == END)){				sent[i].cc=ADJ;				continue;			}			if(notnoun(nextc)){				sent[i].cc=ADV;				continue;			}			sent[i].cc=ADJ;			continue;		case WHO:			i=who(i,ce);			continue;		case PRONP:			subty=PLURAL;			continue;		case NOUN:			if(nextc==NOUN){				sent[i].cc=ADJ;				continue;			}		case PRONS:			subty=SING;			continue;		case PNOUN:			sent[i].cc = NOUN;			if(subty == 0)subty=PLURAL;			continue;		case CONJ:			if(nextc==UNK || nextc == NOUN_VERB || nextc == NV_PL){				if(lastc == ADJ)sent[++i].cc = ADJ;				else sent[++i].cc = VERB;			}			if(nextc == ED){				sent[++i].cc = VERB;			}			continue;		case AUXP:		case AUXS:		case BES:		case BEP:		case AUXV:		case AUX:		case HAS:		case HAVE:		case HAD:			verb=getv(i,ce);			continue;		case ADV:		case AUXX:		case VERB:		case BE:		case INTER:			continue;		case THAT:			if(nextc==SUBCONJ){				sent[i].cc=PRONP;				goto subc;			}			verb=getv(i+1,ce);			j = i+1;			while(isadv(sent[j].cc)) {				j++;			}			nextc = sent[j].cc;			if((verb==1 && iverb== j) || nextc==ED || nextc == VERB_ADJ){				sent[i].cc=PRONP;				while(i+1 < j)sent[++i].cc = ADV;			}			else if(verb==0 && nextc==NV_PL && ((lastc==NOUN				&& issing(sent[i-1].ic)) || lastc == ',')) {				sent[i].cc=PRONP;				subty=SING;				while(i+1 < j)sent[++i].cc = ADV;			}			else if(verb==0 && (nextc==UNK || nextc==NOUN_VERB) && (lastc==NOUN				&& sent[i-1].ic==NV_PL)){				subty=PLURAL;				sent[i].cc=PRONP;				while(i+1 < j)sent[++i].cc = ADV;			}			else {				if(i == 0)sent[i].cc=ADJ;				else sent[i].cc=SUBCONJ;				j=i;				subty=0;				i=getnoun(i+1,ce);				if(done)sent[j].cc=ADJ;			}			continue;		case ',':			if(nextc != CONJ){	/*parenthetical*/				continue;			}			i++;			comma--;			if(sent[i+1].cc == ED || sent[i+1].cc == MVERB){				sent[++i].cc = VERB;				continue;			}			if(command == 1){				verb = getv(++i,ce);				continue;			}		case SUBCONJ:	subc:			savi = i;			if(nextc==END||(lastc==',' && nextc==',')){				sent[i].cc=ADV;				continue;			}			subty=0;			ce=',';			verb=getv(++i,ce);			if(sent[savi+1].cc == VERB || sent[savi+1].cc == AUXX)				if(sent[savi].cc == SUBCONJ)sent[savi].cc = ADV;			i=getnoun(i,ce);			continue;		case PREP_ADV:			if(sent[i+2].cc==PREP_ADV &&(sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB				&& sent[i+1].cc != NV_PL && sent[i+1].cc != PNOUN)){				sent[i].cc=ADV;				sent[i+2].cc=CONJ;				continue;			}			sav=i++;			savsub = subty;			pverb=getv(i,ce);			if((pverb==1 && iverb == i) || sent[i].cc== ED){				sent[sav].cc=PRONP;				sent[i].cc=VERB;				continue;			}			i=getnoun(i,ce);			if(done==1){				sent[sav].cc=ADV;				goto sdone;			}			if(pverb==1 && iverb == i+1){				sent[sav].cc=SUBCONJ;				ce=',';				continue;			}			switch(sent[i+1].cc){			case UNK:			case NV_PL:			case NOUN_VERB:			case ED:				sent[sav].cc=SUBCONJ;				verb=0;				ce=',';				continue;			default:				sent[sav].cc=PREP;				subty = savsub;				continue;			}		case TO:				savi = i;			sent[i++].cc=VERB;sw:			switch(nextc){			case UNK:			case AUXS:			case VERB_ADJ:			case NOUN_VERB:				case VERB:			case MVERB:				sent[i].cc=VERB;				continue;			case HAVE:				sent[i].cc = VERB;				if(sent[i+1].cc == ED){					sent[++i].cc = VERB;					continue;				}				if(sent[i+1].cc == ADV)i++;				if(sent[i+1].cc != BE)continue;				i++;			case BE:					sent[i].cc=VERB;				if(sent[i+1].cc == ADV)i++;				if(sent[i+1].cc == ED || sent[i+1].cc == ING){					sent[++i].cc = VERB;				}				else if(sent[i+1].cc == UNK){					sent[++i].cc = ADJ;				}				continue;			case ADV:				nextc = sent[++i].cc;				goto sw;			default:				sent[savi].cc = PREP;				prep=1;				i=getnoun(i,ce);				prep=0;				continue;			}		case NV_PL: 			if(subty==0){				i=getnoun(i,ce);				subty=PLURAL;			}			else if(verb== 0){	/*need verb*/				sent[i].cc=VERB;				verb=1;			}			else{				i=getnoun(i,ce);			}			continue;		case UNK:			case NOUN_VERB:			if(verb==1){				if(be==1 && nextc != WHO){					sent[i].cc=ADJ;					continue;				}				i=getnoun(i,ce);			}			else if(nextc==NV_PL && isnoun(sent[i+2].cc)) {				sent[i].cc=NOUN;				if(sent[i-1].cc == NOUN){					sent[i-1].cc = ADJ;				}				subty=SING;				continue;			}			else if(subty==0){				i=getnoun(i,ce);				continue;			}			else {		/* desparation */				sent[i].cc=VERB;				verb=1;			}			continue;		case ED:			if(verb == 0){				sent[i].cc=VERB;				verb=1;			}			else if(sent[i-1].cc == BE){				sent[i].cc = VERB;			}			else{				i=getnoun(i,ce);			}			continue;		default:	printf("got a %c %o on %sat %d\n",sent[i].cc,sent[i].cc,sent[i].sp,i);		}	}sdone:	if(sent[i].cc==END && sent[i].ic != ';')return(-1);	else {		if(sent[i].ic == ';')sent[i].cc=';';		else comma--;		return(i);	}}getv(si,ce)int si; char ce;{	int conj;	char c;	int ik;	must=0;	bflg=0;	hflg=0;	verbty=0;	for(j=si;((c=sent[j].cc) != ce) && (c != END); j++){		iverb=j;		switch(c){		case ED:			continue;		case HAS:			hflg=1;			verbty=SING;			sent[j].cc=AUXX;			goto next;		case HAVE:			if(sent[j-1].cc==TO){				continue;			}		case HAD:			hflg=1;			verbty=PLURAL;			sent[j].cc=AUXX;			goto next;		case BE:			if(sent[j].ic != BE){				return(1);			}			continue;		case VERB:				if(sent[j-1].cc==TO){				continue;			}			return(1);		case AUXX:			return(1);		case AUXP:				must=1;			verbty=PLURAL;			sent[j].cc=AUXX;			goto next;		case AUXS:				if(sent[j-1].cc==TO){				continue;			}			verbty=SING;			sent[j].cc=AUXX;			goto next;		case AUX:		case AUXV:			must=1;			sent[j].cc=AUXX;next:				if(sent[j-1].cc == CONJ && verb == 0)conj = 0;			else conj = 1;			if(question==1){				j=getnoun(j+1,ce);				question=0;			}			getv2(ce);			if(sent[j].cc == AUXX){				sent[j].cc = VERB;			}			if((sent[j].cc!=VERB && sent[j].cc!=BE) && sent[iverb].cc==AUXX){				sent[iverb].cc=VERB;				for(ik=iverb+1;ik<=j;ik++){					if(sent[ik].ic == NOM)sent[ik].cc=NOUN;					else sent[ik].cc=sent[ik].ic;				}			}			return(conj);		case BES:				verbty=SING;			bflg=1;			sent[j].cc=BE;			goto next;		case BEP:				verbty=PLURAL;			bflg=1;			sent[j].cc=BE;			goto next;		case SUBCONJ:			if(sent[j-1].cc== ',' && sent[j+1].cc == ','){				continue;			}		case THAT:		case WHO:			goto vdone;		case ',':	if(comma==1 && sent[j+1].cc==CONJ){					goto vdone;				}		}	}vdone:	return(0);}getv2(ce)

⌨️ 快捷键说明

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