19075Srrh #ifndef lint
2*9081Srrh static char sccsid[] = "@(#)pscan.c	4.2	(Berkeley)	82/11/06";
39075Srrh #endif not lint
49075Srrh 
59075Srrh #include "names.h"
69075Srrh #include "conp.h"
7*9081Srrh #define isadv(c)	(c == ADV || c == ADJ_ADV)
8*9081Srrh #define isadj(c)	(c == ADJ || c == NOUN_ADJ || c == ADJ_ADV || c == UNK)
9*9081Srrh #define notnoun(c)	(c != NOUN && c != UNK && c != NOUN_VERB && c != NV_PL && c != PNOUN)
10*9081Srrh #define issing(c)	(c == UNK || c == NOUN_VERB || c == NOUN || c == NOM || c == NOUN_ADJ)
11*9081Srrh #define isnoun(c)	(c == NOUN || c == NOUN_VERB || c == NV_PL || c == UNK || c == PNOUN)
12*9081Srrh #define nounnom(c)	(c == NOUN || c == NOM)
139075Srrh char lastc,nextc;
149075Srrh int savsub;
159075Srrh scan(si,ce,command)	/*scan a phrase */
169075Srrh int si;
179075Srrh char ce;
189075Srrh {
19*9081Srrh 	int savi;
209075Srrh 	char c;
219075Srrh 	i=si;
229075Srrh 	if(command == 1)subty = PLURAL;
239075Srrh 	else subty = 0;
249075Srrh 	if(sent[i].cc==ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK && sent[i+1].cc != ADJ)
259075Srrh 		sent[i++].cc = ADV;
269075Srrh 	done=0;
279075Srrh 	verb = 0;
289075Srrh 	verb=getv(i,ce);	/*get verb if obvious*/
299075Srrh 	if(command == 0)j=getnoun(i,ce);		/*get subject*/
309075Srrh 	else j = si;
319075Srrh 	if(i != j || ((i==j) && sent[i].cc == NOUN)){
329075Srrh 		i = j+1;
339075Srrh 	}
349075Srrh 	for(;((c=sent[i].cc) != ce) && (c != END)  && (c != '\0');i++){
359075Srrh 		nextc=sent[i+1].cc;
369075Srrh 		if(i>0){
379075Srrh 			lastc=sent[i-1].cc;
389075Srrh 			if(lastc==BE)be=1;
399075Srrh 			else{
409075Srrh 				if(lastc != ADV)be=0;
419075Srrh 			}
429075Srrh 		}
439075Srrh 		else lastc=0;
449075Srrh 		if(verb==1)question=0;
459075Srrh 		switch(c){
469075Srrh 		case '"':
47*9081Srrh 			if(nextc==ED || nextc == MVERB){
489075Srrh 				verb=1;
499075Srrh 				sent[++i].cc=VERB;
509075Srrh 				subty=SING;
519075Srrh 				continue;
529075Srrh 			}
539075Srrh 			subty=0;
549075Srrh 			verb=getv(++i,ce);
559075Srrh 			i=getnoun(i,ce);
569075Srrh 			continue;
57*9081Srrh 		case MVERB:
58*9081Srrh 			sent[i].cc = VERB;
59*9081Srrh 			if(i < nsleng*.5){
60*9081Srrh 				verb = getv(++i,ce);
61*9081Srrh 				i = getnoun(i,ce);
62*9081Srrh 				continue;
63*9081Srrh 			}
64*9081Srrh 			continue;
659075Srrh 		case ART:
669075Srrh 		case ADJ:
679075Srrh 		case POS:
689075Srrh 		case ING:
699075Srrh 			aflg=1;
709075Srrh 			i=getnoun(i,ce);
719075Srrh 			aflg=0;
729075Srrh 			continue;
739075Srrh 		case PREP:
749075Srrh 			if(nextc == ce){
759075Srrh 				sent[i].cc=ADV;
769075Srrh 				goto sdone;
779075Srrh 			}
789075Srrh 			prep=1;
799075Srrh 			i=getnoun(++i,ce);
809075Srrh 			prep=0;
819075Srrh 			continue;
829075Srrh 		case VERB_ADJ:
839075Srrh 			if(verb==0){
849075Srrh 				sent[i].cc=VERB;
859075Srrh 				verb=1;
869075Srrh 				continue;
879075Srrh 			}
889075Srrh 		case NOUN_ADJ:
899075Srrh 			if(be==1){
909075Srrh 				sent[i].cc=ADJ;
919075Srrh 				continue;
929075Srrh 			}
939075Srrh 		case PRONP_ADJ:
949075Srrh 		case PRONS_ADJ:
959075Srrh 			i=getnoun(i,ce);
969075Srrh 			continue;
979075Srrh 		case NOUN_ADV:
989075Srrh 			if(verb == 1 && iverb == i+1){
999075Srrh 				sent[i].cc = NOUN;
1009075Srrh 			}
1019075Srrh 			else {
1029075Srrh 				sent[i].cc = ADV;
1039075Srrh 			}
1049075Srrh 			continue;
1059075Srrh 		case ADJ_ADV:
1069075Srrh 			if(be == 1){
107*9081Srrh 				if (isadj(nextc)) {
1089075Srrh 					sent[i].cc = ADV;
1099075Srrh 					continue;
1109075Srrh 				}
111*9081Srrh 				if(nextc == ',' && isadv(sent[i+2].cc)) {
1129075Srrh 					sent[i++].cc = ADV;
1139075Srrh 					sent[++i].cc = ADV;
1149075Srrh 					comma--;
1159075Srrh 					continue;
1169075Srrh 				}
1179075Srrh 				sent[i].cc = ADJ;
1189075Srrh 				continue;
1199075Srrh 			}
1209075Srrh 			if(lastc == NOUN && (nextc == ',' || nextc == END)){
1219075Srrh 				sent[i].cc=ADJ;
1229075Srrh 				continue;
1239075Srrh 			}
124*9081Srrh 			if(notnoun(nextc)){
1259075Srrh 				sent[i].cc=ADV;
1269075Srrh 				continue;
1279075Srrh 			}
1289075Srrh 			sent[i].cc=ADJ;
1299075Srrh 			continue;
1309075Srrh 		case WHO:
1319075Srrh 			i=who(i,ce);
1329075Srrh 			continue;
1339075Srrh 		case PRONP:
1349075Srrh 			subty=PLURAL;
1359075Srrh 			continue;
1369075Srrh 		case NOUN:
1379075Srrh 			if(nextc==NOUN){
1389075Srrh 				sent[i].cc=ADJ;
1399075Srrh 				continue;
1409075Srrh 			}
1419075Srrh 		case PRONS:
1429075Srrh 			subty=SING;
1439075Srrh 			continue;
144*9081Srrh 		case PNOUN:
145*9081Srrh 			sent[i].cc = NOUN;
146*9081Srrh 			if(subty == 0)subty=PLURAL;
147*9081Srrh 			continue;
1489075Srrh 		case CONJ:
1499075Srrh 			if(nextc==UNK || nextc == NOUN_VERB || nextc == NV_PL){
1509075Srrh 				if(lastc == ADJ)sent[++i].cc = ADJ;
1519075Srrh 				else sent[++i].cc = VERB;
1529075Srrh 			}
1539075Srrh 			if(nextc == ED){
1549075Srrh 				sent[++i].cc = VERB;
1559075Srrh 			}
1569075Srrh 			continue;
1579075Srrh 		case AUXP:
1589075Srrh 		case AUXS:
1599075Srrh 		case BES:
1609075Srrh 		case BEP:
1619075Srrh 		case AUXV:
1629075Srrh 		case AUX:
1639075Srrh 		case HAS:
1649075Srrh 		case HAVE:
1659075Srrh 		case HAD:
1669075Srrh 			verb=getv(i,ce);
1679075Srrh 			continue;
1689075Srrh 		case ADV:
1699075Srrh 		case AUXX:
1709075Srrh 		case VERB:
1719075Srrh 		case BE:
1729075Srrh 		case INTER:
1739075Srrh 			continue;
1749075Srrh 		case THAT:
1759075Srrh 			if(nextc==SUBCONJ){
1769075Srrh 				sent[i].cc=PRONP;
1779075Srrh 				goto subc;
1789075Srrh 			}
1799075Srrh 			verb=getv(i+1,ce);
1809075Srrh 			j = i+1;
181*9081Srrh 			while(isadv(sent[j].cc)) {
1829075Srrh 				j++;
1839075Srrh 			}
184*9081Srrh 			nextc = sent[j].cc;
185*9081Srrh 			if((verb==1 && iverb== j) || nextc==ED || nextc == VERB_ADJ){
1869075Srrh 				sent[i].cc=PRONP;
1879075Srrh 				while(i+1 < j)sent[++i].cc = ADV;
1889075Srrh 			}
1899075Srrh 			else if(verb==0 && nextc==NV_PL && ((lastc==NOUN
190*9081Srrh 				&& issing(sent[i-1].ic)) || lastc == ',')) {
1919075Srrh 				sent[i].cc=PRONP;
1929075Srrh 				subty=SING;
193*9081Srrh 				while(i+1 < j)sent[++i].cc = ADV;
1949075Srrh 			}
1959075Srrh 			else if(verb==0 && (nextc==UNK || nextc==NOUN_VERB) && (lastc==NOUN
1969075Srrh 				&& sent[i-1].ic==NV_PL)){
1979075Srrh 				subty=PLURAL;
1989075Srrh 				sent[i].cc=PRONP;
199*9081Srrh 				while(i+1 < j)sent[++i].cc = ADV;
2009075Srrh 			}
2019075Srrh 			else {
2029075Srrh 				if(i == 0)sent[i].cc=ADJ;
2039075Srrh 				else sent[i].cc=SUBCONJ;
2049075Srrh 				j=i;
2059075Srrh 				subty=0;
2069075Srrh 				i=getnoun(i+1,ce);
2079075Srrh 				if(done)sent[j].cc=ADJ;
2089075Srrh 			}
2099075Srrh 			continue;
2109075Srrh 		case ',':
2119075Srrh 			if(nextc != CONJ){	/*parenthetical*/
2129075Srrh 				continue;
2139075Srrh 			}
2149075Srrh 			i++;
2159075Srrh 			comma--;
216*9081Srrh 			if(sent[i+1].cc == ED || sent[i+1].cc == MVERB){
2179075Srrh 				sent[++i].cc = VERB;
2189075Srrh 				continue;
2199075Srrh 			}
2209075Srrh 			if(command == 1){
2219075Srrh 				verb = getv(++i,ce);
2229075Srrh 				continue;
2239075Srrh 			}
2249075Srrh 		case SUBCONJ:
2259075Srrh subc:
226*9081Srrh 			savi = i;
2279075Srrh 			if(nextc==END||(lastc==',' && nextc==',')){
2289075Srrh 				sent[i].cc=ADV;
2299075Srrh 				continue;
2309075Srrh 			}
2319075Srrh 			subty=0;
2329075Srrh 			ce=',';
2339075Srrh 			verb=getv(++i,ce);
234*9081Srrh 			if(sent[savi+1].cc == VERB || sent[savi+1].cc == AUXX)
235*9081Srrh 				if(sent[savi].cc == SUBCONJ)sent[savi].cc = ADV;
2369075Srrh 			i=getnoun(i,ce);
2379075Srrh 			continue;
2389075Srrh 		case PREP_ADV:
2399075Srrh 			if(sent[i+2].cc==PREP_ADV &&(sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB
240*9081Srrh 				&& sent[i+1].cc != NV_PL && sent[i+1].cc != PNOUN)){
2419075Srrh 				sent[i].cc=ADV;
2429075Srrh 				sent[i+2].cc=CONJ;
2439075Srrh 				continue;
2449075Srrh 			}
2459075Srrh 			sav=i++;
2469075Srrh 			savsub = subty;
2479075Srrh 			pverb=getv(i,ce);
2489075Srrh 			if((pverb==1 && iverb == i) || sent[i].cc== ED){
2499075Srrh 				sent[sav].cc=PRONP;
2509075Srrh 				sent[i].cc=VERB;
2519075Srrh 				continue;
2529075Srrh 			}
2539075Srrh 			i=getnoun(i,ce);
2549075Srrh 			if(done==1){
2559075Srrh 				sent[sav].cc=ADV;
2569075Srrh 				goto sdone;
2579075Srrh 			}
2589075Srrh 			if(pverb==1 && iverb == i+1){
2599075Srrh 				sent[sav].cc=SUBCONJ;
2609075Srrh 				ce=',';
2619075Srrh 				continue;
2629075Srrh 			}
2639075Srrh 			switch(sent[i+1].cc){
2649075Srrh 			case UNK:
2659075Srrh 			case NV_PL:
2669075Srrh 			case NOUN_VERB:
2679075Srrh 			case ED:
2689075Srrh 				sent[sav].cc=SUBCONJ;
2699075Srrh 				verb=0;
2709075Srrh 				ce=',';
2719075Srrh 				continue;
2729075Srrh 			default:
2739075Srrh 				sent[sav].cc=PREP;
2749075Srrh 				subty = savsub;
2759075Srrh 				continue;
2769075Srrh 			}
2779075Srrh 		case TO:
278*9081Srrh 			savi = i;
2799075Srrh 			sent[i++].cc=VERB;
280*9081Srrh sw:
2819075Srrh 			switch(nextc){
2829075Srrh 			case UNK:
2839075Srrh 			case AUXS:
2849075Srrh 			case VERB_ADJ:
2859075Srrh 			case NOUN_VERB:
2869075Srrh 			case VERB:
287*9081Srrh 			case MVERB:
2889075Srrh 				sent[i].cc=VERB;
2899075Srrh 				continue;
2909075Srrh 			case HAVE:
2919075Srrh 				sent[i].cc = VERB;
2929075Srrh 				if(sent[i+1].cc == ED){
2939075Srrh 					sent[++i].cc = VERB;
2949075Srrh 					continue;
2959075Srrh 				}
296*9081Srrh 				if(sent[i+1].cc == ADV)i++;
2979075Srrh 				if(sent[i+1].cc != BE)continue;
2989075Srrh 				i++;
2999075Srrh 			case BE:
3009075Srrh 				sent[i].cc=VERB;
301*9081Srrh 				if(sent[i+1].cc == ADV)i++;
3029075Srrh 				if(sent[i+1].cc == ED || sent[i+1].cc == ING){
3039075Srrh 					sent[++i].cc = VERB;
3049075Srrh 				}
3059075Srrh 				else if(sent[i+1].cc == UNK){
3069075Srrh 					sent[++i].cc = ADJ;
3079075Srrh 				}
3089075Srrh 				continue;
309*9081Srrh 			case ADV:
310*9081Srrh 				nextc = sent[++i].cc;
311*9081Srrh 				goto sw;
312*9081Srrh 			default:
313*9081Srrh 				sent[savi].cc = PREP;
3149075Srrh 				prep=1;
3159075Srrh 				i=getnoun(i,ce);
3169075Srrh 				prep=0;
3179075Srrh 				continue;
3189075Srrh 			}
3199075Srrh 		case NV_PL:
3209075Srrh 			if(subty==0){
3219075Srrh 				i=getnoun(i,ce);
3229075Srrh 				subty=PLURAL;
3239075Srrh 			}
3249075Srrh 			else if(verb== 0){	/*need verb*/
3259075Srrh 				sent[i].cc=VERB;
3269075Srrh 				verb=1;
3279075Srrh 			}
3289075Srrh 			else{
3299075Srrh 				i=getnoun(i,ce);
3309075Srrh 			}
3319075Srrh 			continue;
3329075Srrh 		case UNK:
3339075Srrh 		case NOUN_VERB:
3349075Srrh 			if(verb==1){
3359075Srrh 				if(be==1 && nextc != WHO){
3369075Srrh 					sent[i].cc=ADJ;
3379075Srrh 					continue;
3389075Srrh 				}
3399075Srrh 				i=getnoun(i,ce);
3409075Srrh 			}
341*9081Srrh 			else if(nextc==NV_PL && isnoun(sent[i+2].cc)) {
3429075Srrh 				sent[i].cc=NOUN;
3439075Srrh 				if(sent[i-1].cc == NOUN){
3449075Srrh 					sent[i-1].cc = ADJ;
3459075Srrh 				}
3469075Srrh 				subty=SING;
3479075Srrh 				continue;
3489075Srrh 			}
3499075Srrh 			else if(subty==0){
3509075Srrh 				i=getnoun(i,ce);
3519075Srrh 				continue;
3529075Srrh 			}
3539075Srrh 			else {		/* desparation */
3549075Srrh 				sent[i].cc=VERB;
3559075Srrh 				verb=1;
3569075Srrh 			}
3579075Srrh 			continue;
3589075Srrh 		case ED:
3599075Srrh 			if(verb == 0){
3609075Srrh 				sent[i].cc=VERB;
3619075Srrh 				verb=1;
3629075Srrh 			}
3639075Srrh 			else if(sent[i-1].cc == BE){
3649075Srrh 				sent[i].cc = VERB;
3659075Srrh 			}
3669075Srrh 			else{
3679075Srrh 				i=getnoun(i,ce);
3689075Srrh 			}
3699075Srrh 			continue;
370*9081Srrh 		default:	printf("got a %c %o on %sat %d\n",sent[i].cc,sent[i].cc,sent[i].sp,i);
3719075Srrh 		}
3729075Srrh 	}
3739075Srrh sdone:
3749075Srrh 	if(sent[i].cc==END && sent[i].ic != ';')return(-1);
3759075Srrh 	else {
3769075Srrh 		if(sent[i].ic == ';')sent[i].cc=';';
3779075Srrh 		else comma--;
3789075Srrh 		return(i);
3799075Srrh 	}
3809075Srrh }
3819075Srrh getv(si,ce)
3829075Srrh int si;
3839075Srrh char ce;
3849075Srrh {
3859075Srrh 	int conj;
3869075Srrh 	char c;
3879075Srrh 	int ik;
3889075Srrh 	must=0;
3899075Srrh 	bflg=0;
3909075Srrh 	hflg=0;
3919075Srrh 	verbty=0;
3929075Srrh 	for(j=si;((c=sent[j].cc) != ce) && (c != END); j++){
3939075Srrh 		iverb=j;
3949075Srrh 		switch(c){
3959075Srrh 		case ED:
3969075Srrh 			continue;
3979075Srrh 		case HAS:
3989075Srrh 			hflg=1;
3999075Srrh 			verbty=SING;
4009075Srrh 			sent[j].cc=AUXX;
4019075Srrh 			goto next;
4029075Srrh 		case HAVE:
4039075Srrh 			if(sent[j-1].cc==TO){
4049075Srrh 				continue;
4059075Srrh 			}
4069075Srrh 		case HAD:
4079075Srrh 			hflg=1;
4089075Srrh 			verbty=PLURAL;
4099075Srrh 			sent[j].cc=AUXX;
4109075Srrh 			goto next;
4119075Srrh 		case BE:
4129075Srrh 			if(sent[j].ic != BE){
4139075Srrh 				return(1);
4149075Srrh 			}
4159075Srrh 			continue;
4169075Srrh 		case VERB:
4179075Srrh 			if(sent[j-1].cc==TO){
4189075Srrh 				continue;
4199075Srrh 			}
4209075Srrh 			return(1);
4219075Srrh 		case AUXX:
4229075Srrh 			return(1);
4239075Srrh 		case AUXP:
4249075Srrh 			must=1;
4259075Srrh 			verbty=PLURAL;
4269075Srrh 			sent[j].cc=AUXX;
4279075Srrh 			goto next;
4289075Srrh 		case AUXS:
4299075Srrh 			if(sent[j-1].cc==TO){
4309075Srrh 				continue;
4319075Srrh 			}
4329075Srrh 			verbty=SING;
4339075Srrh 			sent[j].cc=AUXX;
4349075Srrh 			goto next;
4359075Srrh 		case AUX:
4369075Srrh 		case AUXV:
4379075Srrh 			must=1;
4389075Srrh 			sent[j].cc=AUXX;
4399075Srrh next:
4409075Srrh 			if(sent[j-1].cc == CONJ && verb == 0)conj = 0;
4419075Srrh 			else conj = 1;
4429075Srrh 			if(question==1){
4439075Srrh 				j=getnoun(j+1,ce);
4449075Srrh 				question=0;
4459075Srrh 			}
4469075Srrh 			getv2(ce);
4479075Srrh 			if(sent[j].cc == AUXX){
4489075Srrh 				sent[j].cc = VERB;
4499075Srrh 			}
4509075Srrh 			if((sent[j].cc!=VERB && sent[j].cc!=BE) && sent[iverb].cc==AUXX){
4519075Srrh 				sent[iverb].cc=VERB;
452*9081Srrh 				for(ik=iverb+1;ik<=j;ik++){
453*9081Srrh 					if(sent[ik].ic == NOM)sent[ik].cc=NOUN;
454*9081Srrh 					else sent[ik].cc=sent[ik].ic;
455*9081Srrh 				}
4569075Srrh 			}
4579075Srrh 			return(conj);
4589075Srrh 		case BES:
4599075Srrh 			verbty=SING;
4609075Srrh 			bflg=1;
4619075Srrh 			sent[j].cc=BE;
4629075Srrh 			goto next;
4639075Srrh 		case BEP:
4649075Srrh 			verbty=PLURAL;
4659075Srrh 			bflg=1;
4669075Srrh 			sent[j].cc=BE;
4679075Srrh 			goto next;
4689075Srrh 		case SUBCONJ:
4699075Srrh 			if(sent[j-1].cc== ',' && sent[j+1].cc == ','){
4709075Srrh 				continue;
4719075Srrh 			}
4729075Srrh 		case THAT:
4739075Srrh 		case WHO:
4749075Srrh 			goto vdone;
4759075Srrh 		case ',':	if(comma==1 && sent[j+1].cc==CONJ){
4769075Srrh 					goto vdone;
4779075Srrh 				}
4789075Srrh 		}
4799075Srrh 	}
4809075Srrh vdone:
4819075Srrh 	return(0);
4829075Srrh }
4839075Srrh getv2(ce)
4849075Srrh char ce;
4859075Srrh {
4869075Srrh 	int vflg;
4879075Srrh 	char c;
4889075Srrh 	vflg=0;
4899075Srrh 	while(((c=sent[++j].cc) != ce) && (c != END)){
4909075Srrh 		switch(c){
4919075Srrh 		case NOUN_ADV:
4929075Srrh 		case ADJ_ADV:
4939075Srrh 			if(bflg == 0 || sent[j+1].cc == ED || sent[j+1].cc == ING){
4949075Srrh 				sent[j].cc = ADV;
4959075Srrh 			}
4969075Srrh 			else{
4979075Srrh 				j -= 1;
4989075Srrh 				return;
4999075Srrh 			}
5009075Srrh 		case ADV:
5019075Srrh 			continue;
5029075Srrh 		case SUBCONJ:
5039075Srrh 			if(sent[j+1].cc == ED || sent[j+1].cc == ING || sent[j+1].cc == ADV ||
5049075Srrh 				sent[j+1].cc == ADJ_ADV)sent[j].cc = ADV;
5059075Srrh 			else return;
5069075Srrh 			continue;
5079075Srrh 		case VERB:
5089075Srrh 			return;
5099075Srrh 		case VERB_ADJ:
5109075Srrh 		case ED:
5119075Srrh 			sent[j].cc=VERB;
5129075Srrh 			return;
5139075Srrh 		case BE:
5149075Srrh 			must=0;
5159075Srrh 			bflg=1;
5169075Srrh 			continue;
5179075Srrh 		case ING:
5189075Srrh 			if(bflg == 1){
5199075Srrh 				sent[j].cc = VERB;
5209075Srrh 			}
5219075Srrh 			else {
5229075Srrh 				j -= 1;
5239075Srrh 			}
5249075Srrh 			return;
5259075Srrh 		case NOUN_VERB:
5269075Srrh 		case UNK:
5279075Srrh 			if(bflg==1 || vflg==1 || hflg==1){
5289075Srrh 				j -= 1;
5299075Srrh 				return;
5309075Srrh 			}
5319075Srrh 			sent[j].cc=VERB;
5329075Srrh 			return;
5339075Srrh 		case PRONP_ADJ:
5349075Srrh 		case PRONS_ADJ:
5359075Srrh 			c=sent[j+1].cc;
5369075Srrh 			if(c==ED||c==ING||c==BE||must==1){
5379075Srrh 				sent[j].cc = ADV;
5389075Srrh 			}
5399075Srrh 			else{
5409075Srrh 				j -= 1;
5419075Srrh 				return;
5429075Srrh 			}
5439075Srrh 			continue;
5449075Srrh 		case AUXV:
5459075Srrh 		case AUX:
5469075Srrh 		case AUXP:
5479075Srrh 		case AUXS:
5489075Srrh 		case HAD:
5499075Srrh 		case HAVE:
5509075Srrh 		case HAS:
5519075Srrh 			must=0;
5529075Srrh 			vflg=1;
5539075Srrh 			sent[j].cc=AUXX;
5549075Srrh 			continue;
5559075Srrh 		default:
5569075Srrh 			j -= 1;
5579075Srrh 			return;
5589075Srrh 		}
5599075Srrh 	}
5609075Srrh 	j -= 1;
5619075Srrh }
5629075Srrh getnoun(k,ce)
5639075Srrh int k,ce;
5649075Srrh {
5659075Srrh 	char c;
5669075Srrh 	int st,t,nextst;
5679075Srrh 	int rep;
5689075Srrh 	int t1,tt;
5699075Srrh 	st=k;
5709075Srrh 	rep=0;
5719075Srrh b:
5729075Srrh 	nextst=sent[st+1].cc;
5739075Srrh 	switch(sent[st].cc){
5749075Srrh 	case END:
5759075Srrh 		done=1;
5769075Srrh 		break;
5779075Srrh 	case ',':
5789075Srrh 		if(ce==','){
5799075Srrh 			done=1;
5809075Srrh 			break;
5819075Srrh 		}
5829075Srrh 		else {
5839075Srrh 			goto getdef;
5849075Srrh 		}
5859075Srrh 	case '"':
5869075Srrh 		if(aflg == 1){
5879075Srrh 			st++;
5889075Srrh 			goto b;
5899075Srrh 		}
5909075Srrh 		break;
5919075Srrh 	case NOUN:
5929075Srrh 		switch(nextst){
5939075Srrh 		case UNK:
5949075Srrh 		case NOUN_VERB:
5959075Srrh 			if(verb==1){
5969075Srrh 				goto nn;
5979075Srrh 			}
5989075Srrh 			if(subty != PLURAL){
5999075Srrh 				goto nn;
6009075Srrh 			}
6019075Srrh 			break;
6029075Srrh 		case NV_PL:
6039075Srrh 			if(verb==1){
6049075Srrh 				goto nn;
6059075Srrh 			}
6069075Srrh 			if(subty == PLURAL){
6079075Srrh 				goto nn;
6089075Srrh 			}
6099075Srrh 			break;
610*9081Srrh 		case PNOUN:
6119075Srrh 		case NOUN_ADJ:
6129075Srrh 		case POS:
6139075Srrh 		case NOUN:
6149075Srrh nn:
6159075Srrh 			sent[st].cc=ADJ;
6169075Srrh 			goto b;
6179075Srrh 		}
6189075Srrh 		if(prep==0)subty=SING;
6199075Srrh 		break;
620*9081Srrh 	case PNOUN:
621*9081Srrh 		sent[st].cc = NOUN;
622*9081Srrh 		if(prep == 0)subty=PLURAL;
623*9081Srrh 		break;
6249075Srrh 	case ADV:
6259075Srrh 		st++;
6269075Srrh 		goto b;
6279075Srrh 	case WHO:
6289075Srrh 		st=who(st,ce);
6299075Srrh 		st++;
6309075Srrh 		goto b;
6319075Srrh 	case ADJ_ADV:
6329075Srrh 	case VERB_ADJ:
6339075Srrh 	case ED:
6349075Srrh 		sent[st++].cc=ADJ;
6359075Srrh 		goto b;
6369075Srrh 	case ING:
637*9081Srrh 		if(isnoun(nextst)){
6389075Srrh 			sent[st++].cc=ADJ;
6399075Srrh 			goto b;
6409075Srrh 		}
6419075Srrh 		sent[st].cc=NOUN;
6429075Srrh 		if(prep==0)subty=SING;
6439075Srrh 		break;
6449075Srrh 	case ART:
6459075Srrh 	case POS:
6469075Srrh 		if(st != k){
6479075Srrh 			goto getdef;
6489075Srrh 		}
6499075Srrh 	case ADJ:
6509075Srrh 		st++;
6519075Srrh 		goto b;
6529075Srrh 	case PRONP:
6539075Srrh 		if(prep==0)subty=PLURAL;
6549075Srrh 
6559075Srrh 		break;
6569075Srrh 	case PRONS:
6579075Srrh 		if(prep==0)subty=SING;
6589075Srrh 		break;
6599075Srrh 	case NOUN_VERB:
660*9081Srrh 		if((nextst==NOUN|| nextst==PNOUN)||(verb==1 && (nextst== NV_PL|| nextst==NOUN_VERB) )){
6619075Srrh 			sent[st].cc=ADJ;
6629075Srrh 			goto b;
6639075Srrh 		}
6649075Srrh 	case NV_PL:
6659075Srrh 		sent[st].cc=NOUN;
6669075Srrh 		if(prep==0){
6679075Srrh 			if(sent[st].ic==NV_PL)subty=PLURAL;
6689075Srrh 			else subty=SING;
6699075Srrh 		}
670*9081Srrh 		if(sent[st-1].cc == NOUN && nounnom(sent[st-1].ic)) {
6719075Srrh 			sent[st-1].cc = ADJ;
6729075Srrh 		}
6739075Srrh 		break;
6749075Srrh 	case PRONP_ADJ:
6759075Srrh 		switch(nextst){
676*9081Srrh 		case PNOUN:
6779075Srrh 		case NOUN_ADJ:
6789075Srrh 		case NV_PL:
6799075Srrh 		case ADJ_ADV:
6809075Srrh 		case PRONS_ADJ:
6819075Srrh 		case ADJ:
6829075Srrh 		case ING:
6839075Srrh 			sent[st++].cc=ADJ;
6849075Srrh 			goto b;
6859075Srrh 		case NOUN_VERB:
6869075Srrh 		case UNK:
6879075Srrh 		case ED:
6889075Srrh 			if(verb == 0){
6899075Srrh 				goto def;
6909075Srrh 			}
6919075Srrh 			else{
6929075Srrh 				sent[st++].cc=ADJ;
6939075Srrh 				goto b;
6949075Srrh 			}
6959075Srrh 		case NOUN:
6969075Srrh 			sent[st++].cc=ADJ;
6979075Srrh 			if(prep==0)subty=SING;
6989075Srrh 			break;
6999075Srrh 		case SUBCONJ:	sent[st++].cc=PRONP;	/* more than .. */
7009075Srrh 			sent[st++].cc=CONJ;
7019075Srrh 			if(verb==0)verb=getv(st,ce);
7029075Srrh 			goto b;
7039075Srrh 		case '"':
7049075Srrh 			sent[st++].cc = ADJ;
7059075Srrh 			st++;
7069075Srrh 			goto b;
7079075Srrh 		default:
7089075Srrh def:
7099075Srrh 			sent[st].cc=PRONP;
7109075Srrh 			if(prep==0)subty=PLURAL;
7119075Srrh 
7129075Srrh 			break;
7139075Srrh 		}
7149075Srrh 		break;
7159075Srrh 	case PRONS_ADJ:
7169075Srrh 		if(aflg == 1 && nextst != END && nextst != ART){
7179075Srrh 			sent[st++].cc=ADJ;
7189075Srrh 			goto b;
7199075Srrh 		}
7209075Srrh 		switch(nextst){
7219075Srrh 		case '"':
7229075Srrh 			sent[st++].cc = ADJ;
7239075Srrh 			st++;
7249075Srrh 			goto b;
725*9081Srrh 		case PNOUN:
7269075Srrh 		case ING:
7279075Srrh 		case UNK:
7289075Srrh 		case NOUN_VERB:
7299075Srrh 		case NOUN_ADJ:
7309075Srrh 		case ADJ_ADV:
7319075Srrh 		case ADJ:
7329075Srrh 			sent[st++].cc=ADJ;
7339075Srrh 			goto b;
7349075Srrh 		case NOUN:
7359075Srrh 			sent[st++].cc=ADJ;
7369075Srrh 			if(prep==0)subty=SING;
7379075Srrh 			break;
7389075Srrh 		case PRONS_ADJ:
7399075Srrh 			sent[st++].cc=ADJ;
7409075Srrh 			sent[st].cc=PRONP;
7419075Srrh 			if(prep==0)subty=SING;
7429075Srrh 			break;
7439075Srrh 		case NV_PL:
7449075Srrh 			if(verb==1){
7459075Srrh 				sent[st++].cc=ADJ;
7469075Srrh 				sent[st].cc=NOUN;
7479075Srrh 				if(prep==0)subty=PLURAL;
7489075Srrh 
7499075Srrh 				break;
7509075Srrh 			}
7519075Srrh 			sent[st].cc=PRONP;
7529075Srrh 			if(prep==0)subty=SING;
7539075Srrh 			break;
7549075Srrh 		default:
7559075Srrh 			sent[st].cc=PRONP;
7569075Srrh 			if(prep==0)subty=SING;
7579075Srrh 
7589075Srrh 			break;
7599075Srrh 		}
7609075Srrh 		break;
7619075Srrh 	case NOUN_ADJ:
762*9081Srrh 		if(nextst==NOUN||nextst==ADJ||nextst == NOUN_ADJ||nextst==PRONS_ADJ||nextst==PRONP_ADJ||nextst==PNOUN){
7639075Srrh 			sent[st++].cc=ADJ;
7649075Srrh 			goto b;
7659075Srrh 		}
7669075Srrh 		if(nextst!=UNK && nextst != NOUN_VERB && nextst != NV_PL){
7679075Srrh 			sent[st].cc=NOUN;
7689075Srrh 			if(prep==0)subty=SING;
7699075Srrh 			break;
7709075Srrh 		}
7719075Srrh 		if(verb==1 || sent[st+2].cc==ED){
7729075Srrh 			sent[st++].cc=ADJ;
7739075Srrh 			goto b;
7749075Srrh 		}
7759075Srrh 		sent[st].cc=NOUN;
7769075Srrh 		if(prep==0)subty=SING;
7779075Srrh 		break;
778*9081Srrh 	case UNK:
7799075Srrh 		if(nextst != UNK){
7809075Srrh 			if(nextst == ',' && rep==0){
7819075Srrh 				c=sent[st+2].cc;
782*9081Srrh 				if((c==UNK||c==ADJ||c==NOUN_ADJ||c==ING) && isnoun(sent[st+3].cc)){
7839075Srrh 					comma--;
7849075Srrh 					sent[st].cc=ADJ;
7859075Srrh 					sent[st+2].cc=ADJ;
7869075Srrh 					sent[st+3].cc=NOUN;
7879075Srrh 					if(prep==0){
7889075Srrh 						if(sent[st+3].ic==NV_PL)subty=PLURAL;
7899075Srrh 						else subty=SING;
7909075Srrh 					}
7919075Srrh 					return(st+3);
7929075Srrh 				}
7939075Srrh 				else {
7949075Srrh 					sent[st].cc=NOUN;
7959075Srrh 					if(prep==0)subty=SING;
7969075Srrh 					break;
7979075Srrh 				}
7989075Srrh 			}
7999075Srrh 			if(nextst==NOUN||nextst==ING ||nextst==NOUN_ADJ|| sent[st-1].cc==ADV
800*9081Srrh 				|| nextst==ADJ || nextst==PNOUN){
8019075Srrh 				sent[st++].cc=ADJ;
8029075Srrh 				goto b;
8039075Srrh 			}
8049075Srrh 			if((nextst==NV_PL || nextst==NOUN_VERB) &&(verb==1 ||(verb==0 && (sent[st+2].cc==UNK
8059075Srrh 				|| sent[st+2].cc==NOUN_VERB || sent[st+2].cc==ED||sent[st+2].cc==VERB_ADJ)))){
8069075Srrh 					sent[st++].cc=ADJ;
8079075Srrh 					sent[st].cc=NOUN;
8089075Srrh 					if(prep == 0)subty=PLURAL;
8099075Srrh 					break;
8109075Srrh 				}
811*9081Srrh 			if(nextst == CONJ && isadv(sent[st+2].cc)){
8129075Srrh 				sent[st].cc=ADJ;
8139075Srrh 				goto b;
8149075Srrh 			}
8159075Srrh 			sent[st].cc=NOUN;
8169075Srrh 			if(prep==0)subty=SING;
8179075Srrh 
8189075Srrh 			break;
8199075Srrh 		}
8209075Srrh 		for(t=st+1;sent[t].cc== UNK;t++);
8219075Srrh 		if(verb==0 && prep == 0){		/* UUU. */
8229075Srrh 			if(prep==0)subty=SING;
823*9081Srrh 			if(sent[t].cc==NV_PL|| sent[t].cc == PNOUN){	/* UUZ.*/
8249075Srrh 				if(sent[t+1].cc==UNK || sent[t+1].cc==NOUN_VERB){	/* UUZU */
8259075Srrh 					sent[t+1].cc=VERB;
8269075Srrh 					verb=1;
8279075Srrh 					sent[t].cc=NOUN;
8289075Srrh 					t1=t;
8299075Srrh 				}
830*9081Srrh 				else if(sent[t].cc == NV_PL){		/* UUZ. */
8319075Srrh 					sent[t].cc=VERB;
8329075Srrh 					verb=1;
8339075Srrh 					sent[t-1].cc=NOUN;
8349075Srrh 					t1=t-1;
8359075Srrh 				}
836*9081Srrh 				else {
837*9081Srrh 					sent[t].cc = NOUN;
838*9081Srrh 					t1 = t;
839*9081Srrh 				}
8409075Srrh 			}
8419075Srrh 			else{		/* UU. */
8429075Srrh 				if(sent[t].cc!= ED){
8439075Srrh 					sent[t-1].cc=VERB;
8449075Srrh 					verb=1;
8459075Srrh 					sent[t-2].cc=NOUN;
8469075Srrh 					t1=t-2;
8479075Srrh 					t--;
8489075Srrh 				}
8499075Srrh 				else {
8509075Srrh 					sent[--t].cc=NOUN;
8519075Srrh 					t1=t;
8529075Srrh 				}
8539075Srrh 			}
8549075Srrh 		}
8559075Srrh 		else{
856*9081Srrh 			if(sent[t].cc==NOUN_VERB|| sent[t].cc==NOUN|| sent[t].cc==NV_PL|| sent[t].cc==PNOUN){
8579075Srrh 				sent[t].cc=NOUN;
8589075Srrh 				if(prep==0)subty=PLURAL;
8599075Srrh 				t1=t;
8609075Srrh 			}
8619075Srrh 			else{
8629075Srrh 				sent[--t].cc=NOUN;
8639075Srrh 				if(prep==0)subty=SING;
8649075Srrh 				t1=t;
8659075Srrh 			}
8669075Srrh 		}
8679075Srrh 		for(tt=st;tt<t1;tt++)sent[tt].cc=ADJ;
8689075Srrh 		st=t;
8699075Srrh 		break;
8709075Srrh 	}
8719075Srrh getdef:
8729075Srrh 	if(sent[st].cc == CONJ && sent[st-1].cc == ADJ){
8739075Srrh 		st++;
8749075Srrh 		goto b;
8759075Srrh 	}
8769075Srrh 	if(sent[st-1].cc==PREP && ( sent[st].cc == THAT || sent[st].cc == SUBCONJ)){
8779075Srrh 		prep=0;
8789075Srrh 		return(--st);
8799075Srrh 	}
8809075Srrh 	if(sent[st].cc != NOUN && sent[st].cc != PRONP && sent[st].cc != PRONS){
8819075Srrh 		st--;
8829075Srrh 		if(sent[st].cc==ADJ && sent[st].ic==ING){
8839075Srrh 			sent[st].cc=NOUN;
8849075Srrh 			if(prep==0)subty=SING;
8859075Srrh 		}
8869075Srrh 		else if(sent[st].cc == PREP){
8879075Srrh 			sent[st].cc = ADV;
8889075Srrh 		}
8899075Srrh 		prep=0;
8909075Srrh 		return(st);
8919075Srrh 	}
8929075Srrh 	if(done==1){
8939075Srrh 		prep=0;
8949075Srrh 		return(st);
8959075Srrh 	}
8969075Srrh 	if(sent[st+1].cc== ','){
8979075Srrh 		if(sent[st+2].cc==CONJ){
8989075Srrh 			if(rep==0){
8999075Srrh 				prep=0;
9009075Srrh 				return(st);
9019075Srrh 			}
9029075Srrh 			else{
9039075Srrh 				st+=3;
9049075Srrh 				comma--;
9059075Srrh 				if(prep==0)subty=PLURAL;
9069075Srrh 				prep=1;
9079075Srrh 				goto b;
9089075Srrh 			}
9099075Srrh 		}
9109075Srrh 		if(comma==1){
9119075Srrh 			prep=0;
9129075Srrh 			return(st);
9139075Srrh 		}
9149075Srrh 
9159075Srrh 		switch(sent[st+2].cc){
9169075Srrh 		case PREP:
9179075Srrh 		case SUBCONJ:
918*9081Srrh 		case PRONS:
919*9081Srrh 		case PRONP:
9209075Srrh 			prep=0;
9219075Srrh 			return(st);
9229075Srrh 		default:	rep++;
9239075Srrh 			comma--;
9249075Srrh 			st+=2;
9259075Srrh 			if(prep==0)subty=PLURAL;
9269075Srrh 			prep=1;
9279075Srrh 			goto b;
9289075Srrh 		}
9299075Srrh 	}
9309075Srrh 	if(sent[st+1].cc==CONJ && sent[st+2].cc != ED){
9319075Srrh 		st+=2;
9329075Srrh 		if(prep==0)subty=PLURAL;
9339075Srrh 		prep=1;
9349075Srrh 		goto b;
9359075Srrh 	}
9369075Srrh 	prep=0;
9379075Srrh 	return(st);
9389075Srrh }
9399075Srrh who(kk,ce)
9409075Srrh int kk,ce;
9419075Srrh {
9429075Srrh 	char c;
9439075Srrh 	sent[kk].cc=PRONP;
9449075Srrh 	c=sent[kk+1].cc;
945*9081Srrh 	while(isadv(c)){
9469075Srrh 		sent[++kk].cc = ADV;
9479075Srrh 		c = sent[kk+1].cc;
9489075Srrh 	}
949*9081Srrh 	if(c==UNK||c==NOUN_VERB||c==VERB_ADJ||c==ED|| c==NV_PL||c==MVERB){
9509075Srrh 		sent[++kk].cc=VERB;
9519075Srrh 		if(verb == 0)verb = getv(kk+1,ce);
9529075Srrh 		return(kk);
9539075Srrh 	}
9549075Srrh w:	switch(sent[++kk].cc){
9559075Srrh 	case AUXX:
9569075Srrh 	case ADV:
9579075Srrh 	case BE:
9589075Srrh 	case VERB:
9599075Srrh 		goto w;
9609075Srrh 	default:
9619075Srrh 		verb=getv(kk,ce);
9629075Srrh 		return(--kk);
9639075Srrh 	}
9649075Srrh }
965