xref: /csrg-svn/usr.bin/diction/style3/pscan.c (revision 61978)
148247Sbostic /*-
248247Sbostic  * %sccs.include.proprietary.c%
348247Sbostic  */
448247Sbostic 
59075Srrh #ifndef lint
6*61978Sbostic static char sccsid[] = "@(#)pscan.c	8.1 (Berkeley) 06/06/93";
748247Sbostic #endif /* not lint */
89075Srrh 
99075Srrh #include "names.h"
109075Srrh #include "conp.h"
119081Srrh #define isadv(c)	(c == ADV || c == ADJ_ADV)
129081Srrh #define isadj(c)	(c == ADJ || c == NOUN_ADJ || c == ADJ_ADV || c == UNK)
139081Srrh #define notnoun(c)	(c != NOUN && c != UNK && c != NOUN_VERB && c != NV_PL && c != PNOUN)
149081Srrh #define issing(c)	(c == UNK || c == NOUN_VERB || c == NOUN || c == NOM || c == NOUN_ADJ)
159081Srrh #define isnoun(c)	(c == NOUN || c == NOUN_VERB || c == NV_PL || c == UNK || c == PNOUN)
169081Srrh #define nounnom(c)	(c == NOUN || c == NOM)
179075Srrh char lastc,nextc;
189075Srrh int savsub;
scan(si,ce,command)199075Srrh scan(si,ce,command)	/*scan a phrase */
209075Srrh int si;
219075Srrh char ce;
229075Srrh {
239081Srrh 	int savi;
249075Srrh 	char c;
259075Srrh 	i=si;
269075Srrh 	if(command == 1)subty = PLURAL;
279075Srrh 	else subty = 0;
289075Srrh 	if(sent[i].cc==ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK && sent[i+1].cc != ADJ)
299075Srrh 		sent[i++].cc = ADV;
309075Srrh 	done=0;
319075Srrh 	verb = 0;
329075Srrh 	verb=getv(i,ce);	/*get verb if obvious*/
339075Srrh 	if(command == 0)j=getnoun(i,ce);		/*get subject*/
349075Srrh 	else j = si;
359075Srrh 	if(i != j || ((i==j) && sent[i].cc == NOUN)){
369075Srrh 		i = j+1;
379075Srrh 	}
389075Srrh 	for(;((c=sent[i].cc) != ce) && (c != END)  && (c != '\0');i++){
399075Srrh 		nextc=sent[i+1].cc;
409075Srrh 		if(i>0){
419075Srrh 			lastc=sent[i-1].cc;
429075Srrh 			if(lastc==BE)be=1;
439075Srrh 			else{
449075Srrh 				if(lastc != ADV)be=0;
459075Srrh 			}
469075Srrh 		}
479075Srrh 		else lastc=0;
489075Srrh 		if(verb==1)question=0;
499075Srrh 		switch(c){
509075Srrh 		case '"':
519081Srrh 			if(nextc==ED || nextc == MVERB){
529075Srrh 				verb=1;
539075Srrh 				sent[++i].cc=VERB;
549075Srrh 				subty=SING;
559075Srrh 				continue;
569075Srrh 			}
579075Srrh 			subty=0;
589075Srrh 			verb=getv(++i,ce);
599075Srrh 			i=getnoun(i,ce);
609075Srrh 			continue;
619081Srrh 		case MVERB:
629081Srrh 			sent[i].cc = VERB;
639081Srrh 			if(i < nsleng*.5){
649081Srrh 				verb = getv(++i,ce);
659081Srrh 				i = getnoun(i,ce);
669081Srrh 				continue;
679081Srrh 			}
689081Srrh 			continue;
699075Srrh 		case ART:
709075Srrh 		case ADJ:
719075Srrh 		case POS:
729075Srrh 		case ING:
739075Srrh 			aflg=1;
749075Srrh 			i=getnoun(i,ce);
759075Srrh 			aflg=0;
769075Srrh 			continue;
779075Srrh 		case PREP:
789075Srrh 			if(nextc == ce){
799075Srrh 				sent[i].cc=ADV;
809075Srrh 				goto sdone;
819075Srrh 			}
829075Srrh 			prep=1;
839075Srrh 			i=getnoun(++i,ce);
849075Srrh 			prep=0;
859075Srrh 			continue;
869075Srrh 		case VERB_ADJ:
879075Srrh 			if(verb==0){
889075Srrh 				sent[i].cc=VERB;
899075Srrh 				verb=1;
909075Srrh 				continue;
919075Srrh 			}
929075Srrh 		case NOUN_ADJ:
939075Srrh 			if(be==1){
949075Srrh 				sent[i].cc=ADJ;
959075Srrh 				continue;
969075Srrh 			}
979075Srrh 		case PRONP_ADJ:
989075Srrh 		case PRONS_ADJ:
999075Srrh 			i=getnoun(i,ce);
1009075Srrh 			continue;
1019075Srrh 		case NOUN_ADV:
1029075Srrh 			if(verb == 1 && iverb == i+1){
1039075Srrh 				sent[i].cc = NOUN;
1049075Srrh 			}
1059075Srrh 			else {
1069075Srrh 				sent[i].cc = ADV;
1079075Srrh 			}
1089075Srrh 			continue;
1099075Srrh 		case ADJ_ADV:
1109075Srrh 			if(be == 1){
1119081Srrh 				if (isadj(nextc)) {
1129075Srrh 					sent[i].cc = ADV;
1139075Srrh 					continue;
1149075Srrh 				}
1159081Srrh 				if(nextc == ',' && isadv(sent[i+2].cc)) {
1169075Srrh 					sent[i++].cc = ADV;
1179075Srrh 					sent[++i].cc = ADV;
1189075Srrh 					comma--;
1199075Srrh 					continue;
1209075Srrh 				}
1219075Srrh 				sent[i].cc = ADJ;
1229075Srrh 				continue;
1239075Srrh 			}
1249075Srrh 			if(lastc == NOUN && (nextc == ',' || nextc == END)){
1259075Srrh 				sent[i].cc=ADJ;
1269075Srrh 				continue;
1279075Srrh 			}
1289081Srrh 			if(notnoun(nextc)){
1299075Srrh 				sent[i].cc=ADV;
1309075Srrh 				continue;
1319075Srrh 			}
1329075Srrh 			sent[i].cc=ADJ;
1339075Srrh 			continue;
1349075Srrh 		case WHO:
1359075Srrh 			i=who(i,ce);
1369075Srrh 			continue;
1379075Srrh 		case PRONP:
1389075Srrh 			subty=PLURAL;
1399075Srrh 			continue;
1409075Srrh 		case NOUN:
1419075Srrh 			if(nextc==NOUN){
1429075Srrh 				sent[i].cc=ADJ;
1439075Srrh 				continue;
1449075Srrh 			}
1459075Srrh 		case PRONS:
1469075Srrh 			subty=SING;
1479075Srrh 			continue;
1489081Srrh 		case PNOUN:
1499081Srrh 			sent[i].cc = NOUN;
1509081Srrh 			if(subty == 0)subty=PLURAL;
1519081Srrh 			continue;
1529075Srrh 		case CONJ:
1539075Srrh 			if(nextc==UNK || nextc == NOUN_VERB || nextc == NV_PL){
1549075Srrh 				if(lastc == ADJ)sent[++i].cc = ADJ;
1559075Srrh 				else sent[++i].cc = VERB;
1569075Srrh 			}
1579075Srrh 			if(nextc == ED){
1589075Srrh 				sent[++i].cc = VERB;
1599075Srrh 			}
1609075Srrh 			continue;
1619075Srrh 		case AUXP:
1629075Srrh 		case AUXS:
1639075Srrh 		case BES:
1649075Srrh 		case BEP:
1659075Srrh 		case AUXV:
1669075Srrh 		case AUX:
1679075Srrh 		case HAS:
1689075Srrh 		case HAVE:
1699075Srrh 		case HAD:
1709075Srrh 			verb=getv(i,ce);
1719075Srrh 			continue;
1729075Srrh 		case ADV:
1739075Srrh 		case AUXX:
1749075Srrh 		case VERB:
1759075Srrh 		case BE:
1769075Srrh 		case INTER:
1779075Srrh 			continue;
1789075Srrh 		case THAT:
1799075Srrh 			if(nextc==SUBCONJ){
1809075Srrh 				sent[i].cc=PRONP;
1819075Srrh 				goto subc;
1829075Srrh 			}
1839075Srrh 			verb=getv(i+1,ce);
1849075Srrh 			j = i+1;
1859081Srrh 			while(isadv(sent[j].cc)) {
1869075Srrh 				j++;
1879075Srrh 			}
1889081Srrh 			nextc = sent[j].cc;
1899081Srrh 			if((verb==1 && iverb== j) || nextc==ED || nextc == VERB_ADJ){
1909075Srrh 				sent[i].cc=PRONP;
1919075Srrh 				while(i+1 < j)sent[++i].cc = ADV;
1929075Srrh 			}
1939075Srrh 			else if(verb==0 && nextc==NV_PL && ((lastc==NOUN
1949081Srrh 				&& issing(sent[i-1].ic)) || lastc == ',')) {
1959075Srrh 				sent[i].cc=PRONP;
1969075Srrh 				subty=SING;
1979081Srrh 				while(i+1 < j)sent[++i].cc = ADV;
1989075Srrh 			}
1999075Srrh 			else if(verb==0 && (nextc==UNK || nextc==NOUN_VERB) && (lastc==NOUN
2009075Srrh 				&& sent[i-1].ic==NV_PL)){
2019075Srrh 				subty=PLURAL;
2029075Srrh 				sent[i].cc=PRONP;
2039081Srrh 				while(i+1 < j)sent[++i].cc = ADV;
2049075Srrh 			}
2059075Srrh 			else {
2069075Srrh 				if(i == 0)sent[i].cc=ADJ;
2079075Srrh 				else sent[i].cc=SUBCONJ;
2089075Srrh 				j=i;
2099075Srrh 				subty=0;
2109075Srrh 				i=getnoun(i+1,ce);
2119075Srrh 				if(done)sent[j].cc=ADJ;
2129075Srrh 			}
2139075Srrh 			continue;
2149075Srrh 		case ',':
2159075Srrh 			if(nextc != CONJ){	/*parenthetical*/
2169075Srrh 				continue;
2179075Srrh 			}
2189075Srrh 			i++;
2199075Srrh 			comma--;
2209081Srrh 			if(sent[i+1].cc == ED || sent[i+1].cc == MVERB){
2219075Srrh 				sent[++i].cc = VERB;
2229075Srrh 				continue;
2239075Srrh 			}
2249075Srrh 			if(command == 1){
2259075Srrh 				verb = getv(++i,ce);
2269075Srrh 				continue;
2279075Srrh 			}
2289075Srrh 		case SUBCONJ:
2299075Srrh subc:
2309081Srrh 			savi = i;
2319075Srrh 			if(nextc==END||(lastc==',' && nextc==',')){
2329075Srrh 				sent[i].cc=ADV;
2339075Srrh 				continue;
2349075Srrh 			}
2359075Srrh 			subty=0;
2369075Srrh 			ce=',';
2379075Srrh 			verb=getv(++i,ce);
2389081Srrh 			if(sent[savi+1].cc == VERB || sent[savi+1].cc == AUXX)
2399081Srrh 				if(sent[savi].cc == SUBCONJ)sent[savi].cc = ADV;
2409075Srrh 			i=getnoun(i,ce);
2419075Srrh 			continue;
2429075Srrh 		case PREP_ADV:
2439075Srrh 			if(sent[i+2].cc==PREP_ADV &&(sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB
2449081Srrh 				&& sent[i+1].cc != NV_PL && sent[i+1].cc != PNOUN)){
2459075Srrh 				sent[i].cc=ADV;
2469075Srrh 				sent[i+2].cc=CONJ;
2479075Srrh 				continue;
2489075Srrh 			}
2499075Srrh 			sav=i++;
2509075Srrh 			savsub = subty;
2519075Srrh 			pverb=getv(i,ce);
2529075Srrh 			if((pverb==1 && iverb == i) || sent[i].cc== ED){
2539075Srrh 				sent[sav].cc=PRONP;
2549075Srrh 				sent[i].cc=VERB;
2559075Srrh 				continue;
2569075Srrh 			}
2579075Srrh 			i=getnoun(i,ce);
2589075Srrh 			if(done==1){
2599075Srrh 				sent[sav].cc=ADV;
2609075Srrh 				goto sdone;
2619075Srrh 			}
2629075Srrh 			if(pverb==1 && iverb == i+1){
2639075Srrh 				sent[sav].cc=SUBCONJ;
2649075Srrh 				ce=',';
2659075Srrh 				continue;
2669075Srrh 			}
2679075Srrh 			switch(sent[i+1].cc){
2689075Srrh 			case UNK:
2699075Srrh 			case NV_PL:
2709075Srrh 			case NOUN_VERB:
2719075Srrh 			case ED:
2729075Srrh 				sent[sav].cc=SUBCONJ;
2739075Srrh 				verb=0;
2749075Srrh 				ce=',';
2759075Srrh 				continue;
2769075Srrh 			default:
2779075Srrh 				sent[sav].cc=PREP;
2789075Srrh 				subty = savsub;
2799075Srrh 				continue;
2809075Srrh 			}
2819075Srrh 		case TO:
2829081Srrh 			savi = i;
2839075Srrh 			sent[i++].cc=VERB;
2849081Srrh sw:
2859075Srrh 			switch(nextc){
2869075Srrh 			case UNK:
2879075Srrh 			case AUXS:
2889075Srrh 			case VERB_ADJ:
2899075Srrh 			case NOUN_VERB:
2909075Srrh 			case VERB:
2919081Srrh 			case MVERB:
2929075Srrh 				sent[i].cc=VERB;
2939075Srrh 				continue;
2949075Srrh 			case HAVE:
2959075Srrh 				sent[i].cc = VERB;
2969075Srrh 				if(sent[i+1].cc == ED){
2979075Srrh 					sent[++i].cc = VERB;
2989075Srrh 					continue;
2999075Srrh 				}
3009081Srrh 				if(sent[i+1].cc == ADV)i++;
3019075Srrh 				if(sent[i+1].cc != BE)continue;
3029075Srrh 				i++;
3039075Srrh 			case BE:
3049075Srrh 				sent[i].cc=VERB;
3059081Srrh 				if(sent[i+1].cc == ADV)i++;
3069075Srrh 				if(sent[i+1].cc == ED || sent[i+1].cc == ING){
3079075Srrh 					sent[++i].cc = VERB;
3089075Srrh 				}
3099075Srrh 				else if(sent[i+1].cc == UNK){
3109075Srrh 					sent[++i].cc = ADJ;
3119075Srrh 				}
3129075Srrh 				continue;
3139081Srrh 			case ADV:
3149081Srrh 				nextc = sent[++i].cc;
3159081Srrh 				goto sw;
3169081Srrh 			default:
3179081Srrh 				sent[savi].cc = PREP;
3189075Srrh 				prep=1;
3199075Srrh 				i=getnoun(i,ce);
3209075Srrh 				prep=0;
3219075Srrh 				continue;
3229075Srrh 			}
3239075Srrh 		case NV_PL:
3249075Srrh 			if(subty==0){
3259075Srrh 				i=getnoun(i,ce);
3269075Srrh 				subty=PLURAL;
3279075Srrh 			}
3289075Srrh 			else if(verb== 0){	/*need verb*/
3299075Srrh 				sent[i].cc=VERB;
3309075Srrh 				verb=1;
3319075Srrh 			}
3329075Srrh 			else{
3339075Srrh 				i=getnoun(i,ce);
3349075Srrh 			}
3359075Srrh 			continue;
3369075Srrh 		case UNK:
3379075Srrh 		case NOUN_VERB:
3389075Srrh 			if(verb==1){
3399075Srrh 				if(be==1 && nextc != WHO){
3409075Srrh 					sent[i].cc=ADJ;
3419075Srrh 					continue;
3429075Srrh 				}
3439075Srrh 				i=getnoun(i,ce);
3449075Srrh 			}
3459081Srrh 			else if(nextc==NV_PL && isnoun(sent[i+2].cc)) {
3469075Srrh 				sent[i].cc=NOUN;
3479075Srrh 				if(sent[i-1].cc == NOUN){
3489075Srrh 					sent[i-1].cc = ADJ;
3499075Srrh 				}
3509075Srrh 				subty=SING;
3519075Srrh 				continue;
3529075Srrh 			}
3539075Srrh 			else if(subty==0){
3549075Srrh 				i=getnoun(i,ce);
3559075Srrh 				continue;
3569075Srrh 			}
3579075Srrh 			else {		/* desparation */
3589075Srrh 				sent[i].cc=VERB;
3599075Srrh 				verb=1;
3609075Srrh 			}
3619075Srrh 			continue;
3629075Srrh 		case ED:
3639075Srrh 			if(verb == 0){
3649075Srrh 				sent[i].cc=VERB;
3659075Srrh 				verb=1;
3669075Srrh 			}
3679075Srrh 			else if(sent[i-1].cc == BE){
3689075Srrh 				sent[i].cc = VERB;
3699075Srrh 			}
3709075Srrh 			else{
3719075Srrh 				i=getnoun(i,ce);
3729075Srrh 			}
3739075Srrh 			continue;
3749081Srrh 		default:	printf("got a %c %o on %sat %d\n",sent[i].cc,sent[i].cc,sent[i].sp,i);
3759075Srrh 		}
3769075Srrh 	}
3779075Srrh sdone:
3789075Srrh 	if(sent[i].cc==END && sent[i].ic != ';')return(-1);
3799075Srrh 	else {
3809075Srrh 		if(sent[i].ic == ';')sent[i].cc=';';
3819075Srrh 		else comma--;
3829075Srrh 		return(i);
3839075Srrh 	}
3849075Srrh }
getv(si,ce)3859075Srrh getv(si,ce)
3869075Srrh int si;
3879075Srrh char ce;
3889075Srrh {
3899075Srrh 	int conj;
3909075Srrh 	char c;
3919075Srrh 	int ik;
3929075Srrh 	must=0;
3939075Srrh 	bflg=0;
3949075Srrh 	hflg=0;
3959075Srrh 	verbty=0;
3969075Srrh 	for(j=si;((c=sent[j].cc) != ce) && (c != END); j++){
3979075Srrh 		iverb=j;
3989075Srrh 		switch(c){
3999075Srrh 		case ED:
4009075Srrh 			continue;
4019075Srrh 		case HAS:
4029075Srrh 			hflg=1;
4039075Srrh 			verbty=SING;
4049075Srrh 			sent[j].cc=AUXX;
4059075Srrh 			goto next;
4069075Srrh 		case HAVE:
4079075Srrh 			if(sent[j-1].cc==TO){
4089075Srrh 				continue;
4099075Srrh 			}
4109075Srrh 		case HAD:
4119075Srrh 			hflg=1;
4129075Srrh 			verbty=PLURAL;
4139075Srrh 			sent[j].cc=AUXX;
4149075Srrh 			goto next;
4159075Srrh 		case BE:
4169075Srrh 			if(sent[j].ic != BE){
4179075Srrh 				return(1);
4189075Srrh 			}
4199075Srrh 			continue;
4209075Srrh 		case VERB:
4219075Srrh 			if(sent[j-1].cc==TO){
4229075Srrh 				continue;
4239075Srrh 			}
4249075Srrh 			return(1);
4259075Srrh 		case AUXX:
4269075Srrh 			return(1);
4279075Srrh 		case AUXP:
4289075Srrh 			must=1;
4299075Srrh 			verbty=PLURAL;
4309075Srrh 			sent[j].cc=AUXX;
4319075Srrh 			goto next;
4329075Srrh 		case AUXS:
4339075Srrh 			if(sent[j-1].cc==TO){
4349075Srrh 				continue;
4359075Srrh 			}
4369075Srrh 			verbty=SING;
4379075Srrh 			sent[j].cc=AUXX;
4389075Srrh 			goto next;
4399075Srrh 		case AUX:
4409075Srrh 		case AUXV:
4419075Srrh 			must=1;
4429075Srrh 			sent[j].cc=AUXX;
4439075Srrh next:
4449075Srrh 			if(sent[j-1].cc == CONJ && verb == 0)conj = 0;
4459075Srrh 			else conj = 1;
4469075Srrh 			if(question==1){
4479075Srrh 				j=getnoun(j+1,ce);
4489075Srrh 				question=0;
4499075Srrh 			}
4509075Srrh 			getv2(ce);
4519075Srrh 			if(sent[j].cc == AUXX){
4529075Srrh 				sent[j].cc = VERB;
4539075Srrh 			}
4549075Srrh 			if((sent[j].cc!=VERB && sent[j].cc!=BE) && sent[iverb].cc==AUXX){
4559075Srrh 				sent[iverb].cc=VERB;
4569081Srrh 				for(ik=iverb+1;ik<=j;ik++){
4579081Srrh 					if(sent[ik].ic == NOM)sent[ik].cc=NOUN;
4589081Srrh 					else sent[ik].cc=sent[ik].ic;
4599081Srrh 				}
4609075Srrh 			}
4619075Srrh 			return(conj);
4629075Srrh 		case BES:
4639075Srrh 			verbty=SING;
4649075Srrh 			bflg=1;
4659075Srrh 			sent[j].cc=BE;
4669075Srrh 			goto next;
4679075Srrh 		case BEP:
4689075Srrh 			verbty=PLURAL;
4699075Srrh 			bflg=1;
4709075Srrh 			sent[j].cc=BE;
4719075Srrh 			goto next;
4729075Srrh 		case SUBCONJ:
4739075Srrh 			if(sent[j-1].cc== ',' && sent[j+1].cc == ','){
4749075Srrh 				continue;
4759075Srrh 			}
4769075Srrh 		case THAT:
4779075Srrh 		case WHO:
4789075Srrh 			goto vdone;
4799075Srrh 		case ',':	if(comma==1 && sent[j+1].cc==CONJ){
4809075Srrh 					goto vdone;
4819075Srrh 				}
4829075Srrh 		}
4839075Srrh 	}
4849075Srrh vdone:
4859075Srrh 	return(0);
4869075Srrh }
getv2(ce)4879075Srrh getv2(ce)
4889075Srrh char ce;
4899075Srrh {
4909075Srrh 	int vflg;
4919075Srrh 	char c;
4929075Srrh 	vflg=0;
4939075Srrh 	while(((c=sent[++j].cc) != ce) && (c != END)){
4949075Srrh 		switch(c){
4959075Srrh 		case NOUN_ADV:
4969075Srrh 		case ADJ_ADV:
4979075Srrh 			if(bflg == 0 || sent[j+1].cc == ED || sent[j+1].cc == ING){
4989075Srrh 				sent[j].cc = ADV;
4999075Srrh 			}
5009075Srrh 			else{
5019075Srrh 				j -= 1;
5029075Srrh 				return;
5039075Srrh 			}
5049075Srrh 		case ADV:
5059075Srrh 			continue;
5069075Srrh 		case SUBCONJ:
5079075Srrh 			if(sent[j+1].cc == ED || sent[j+1].cc == ING || sent[j+1].cc == ADV ||
5089075Srrh 				sent[j+1].cc == ADJ_ADV)sent[j].cc = ADV;
5099075Srrh 			else return;
5109075Srrh 			continue;
5119075Srrh 		case VERB:
5129075Srrh 			return;
5139075Srrh 		case VERB_ADJ:
5149075Srrh 		case ED:
5159075Srrh 			sent[j].cc=VERB;
5169075Srrh 			return;
5179075Srrh 		case BE:
5189075Srrh 			must=0;
5199075Srrh 			bflg=1;
5209075Srrh 			continue;
5219075Srrh 		case ING:
5229075Srrh 			if(bflg == 1){
5239075Srrh 				sent[j].cc = VERB;
5249075Srrh 			}
5259075Srrh 			else {
5269075Srrh 				j -= 1;
5279075Srrh 			}
5289075Srrh 			return;
5299075Srrh 		case NOUN_VERB:
5309075Srrh 		case UNK:
5319075Srrh 			if(bflg==1 || vflg==1 || hflg==1){
5329075Srrh 				j -= 1;
5339075Srrh 				return;
5349075Srrh 			}
5359075Srrh 			sent[j].cc=VERB;
5369075Srrh 			return;
5379075Srrh 		case PRONP_ADJ:
5389075Srrh 		case PRONS_ADJ:
5399075Srrh 			c=sent[j+1].cc;
5409075Srrh 			if(c==ED||c==ING||c==BE||must==1){
5419075Srrh 				sent[j].cc = ADV;
5429075Srrh 			}
5439075Srrh 			else{
5449075Srrh 				j -= 1;
5459075Srrh 				return;
5469075Srrh 			}
5479075Srrh 			continue;
5489075Srrh 		case AUXV:
5499075Srrh 		case AUX:
5509075Srrh 		case AUXP:
5519075Srrh 		case AUXS:
5529075Srrh 		case HAD:
5539075Srrh 		case HAVE:
5549075Srrh 		case HAS:
5559075Srrh 			must=0;
5569075Srrh 			vflg=1;
5579075Srrh 			sent[j].cc=AUXX;
5589075Srrh 			continue;
5599075Srrh 		default:
5609075Srrh 			j -= 1;
5619075Srrh 			return;
5629075Srrh 		}
5639075Srrh 	}
5649075Srrh 	j -= 1;
5659075Srrh }
getnoun(k,ce)5669075Srrh getnoun(k,ce)
5679075Srrh int k,ce;
5689075Srrh {
5699075Srrh 	char c;
5709075Srrh 	int st,t,nextst;
5719075Srrh 	int rep;
5729075Srrh 	int t1,tt;
5739075Srrh 	st=k;
5749075Srrh 	rep=0;
5759075Srrh b:
5769075Srrh 	nextst=sent[st+1].cc;
5779075Srrh 	switch(sent[st].cc){
5789075Srrh 	case END:
5799075Srrh 		done=1;
5809075Srrh 		break;
5819075Srrh 	case ',':
5829075Srrh 		if(ce==','){
5839075Srrh 			done=1;
5849075Srrh 			break;
5859075Srrh 		}
5869075Srrh 		else {
5879075Srrh 			goto getdef;
5889075Srrh 		}
5899075Srrh 	case '"':
5909075Srrh 		if(aflg == 1){
5919075Srrh 			st++;
5929075Srrh 			goto b;
5939075Srrh 		}
5949075Srrh 		break;
5959075Srrh 	case NOUN:
5969075Srrh 		switch(nextst){
5979075Srrh 		case UNK:
5989075Srrh 		case NOUN_VERB:
5999075Srrh 			if(verb==1){
6009075Srrh 				goto nn;
6019075Srrh 			}
6029075Srrh 			if(subty != PLURAL){
6039075Srrh 				goto nn;
6049075Srrh 			}
6059075Srrh 			break;
6069075Srrh 		case NV_PL:
6079075Srrh 			if(verb==1){
6089075Srrh 				goto nn;
6099075Srrh 			}
6109075Srrh 			if(subty == PLURAL){
6119075Srrh 				goto nn;
6129075Srrh 			}
6139075Srrh 			break;
6149081Srrh 		case PNOUN:
6159075Srrh 		case NOUN_ADJ:
6169075Srrh 		case POS:
6179075Srrh 		case NOUN:
6189075Srrh nn:
6199075Srrh 			sent[st].cc=ADJ;
6209075Srrh 			goto b;
6219075Srrh 		}
6229075Srrh 		if(prep==0)subty=SING;
6239075Srrh 		break;
6249081Srrh 	case PNOUN:
6259081Srrh 		sent[st].cc = NOUN;
6269081Srrh 		if(prep == 0)subty=PLURAL;
6279081Srrh 		break;
6289075Srrh 	case ADV:
6299075Srrh 		st++;
6309075Srrh 		goto b;
6319075Srrh 	case WHO:
6329075Srrh 		st=who(st,ce);
6339075Srrh 		st++;
6349075Srrh 		goto b;
6359075Srrh 	case ADJ_ADV:
6369075Srrh 	case VERB_ADJ:
6379075Srrh 	case ED:
6389075Srrh 		sent[st++].cc=ADJ;
6399075Srrh 		goto b;
6409075Srrh 	case ING:
6419081Srrh 		if(isnoun(nextst)){
6429075Srrh 			sent[st++].cc=ADJ;
6439075Srrh 			goto b;
6449075Srrh 		}
6459075Srrh 		sent[st].cc=NOUN;
6469075Srrh 		if(prep==0)subty=SING;
6479075Srrh 		break;
6489075Srrh 	case ART:
6499075Srrh 	case POS:
6509075Srrh 		if(st != k){
6519075Srrh 			goto getdef;
6529075Srrh 		}
6539075Srrh 	case ADJ:
6549075Srrh 		st++;
6559075Srrh 		goto b;
6569075Srrh 	case PRONP:
6579075Srrh 		if(prep==0)subty=PLURAL;
6589075Srrh 
6599075Srrh 		break;
6609075Srrh 	case PRONS:
6619075Srrh 		if(prep==0)subty=SING;
6629075Srrh 		break;
6639075Srrh 	case NOUN_VERB:
6649081Srrh 		if((nextst==NOUN|| nextst==PNOUN)||(verb==1 && (nextst== NV_PL|| nextst==NOUN_VERB) )){
6659075Srrh 			sent[st].cc=ADJ;
6669075Srrh 			goto b;
6679075Srrh 		}
6689075Srrh 	case NV_PL:
6699075Srrh 		sent[st].cc=NOUN;
6709075Srrh 		if(prep==0){
6719075Srrh 			if(sent[st].ic==NV_PL)subty=PLURAL;
6729075Srrh 			else subty=SING;
6739075Srrh 		}
6749081Srrh 		if(sent[st-1].cc == NOUN && nounnom(sent[st-1].ic)) {
6759075Srrh 			sent[st-1].cc = ADJ;
6769075Srrh 		}
6779075Srrh 		break;
6789075Srrh 	case PRONP_ADJ:
6799075Srrh 		switch(nextst){
6809081Srrh 		case PNOUN:
6819075Srrh 		case NOUN_ADJ:
6829075Srrh 		case NV_PL:
6839075Srrh 		case ADJ_ADV:
6849075Srrh 		case PRONS_ADJ:
6859075Srrh 		case ADJ:
6869075Srrh 		case ING:
6879075Srrh 			sent[st++].cc=ADJ;
6889075Srrh 			goto b;
6899075Srrh 		case NOUN_VERB:
6909075Srrh 		case UNK:
6919075Srrh 		case ED:
6929075Srrh 			if(verb == 0){
6939075Srrh 				goto def;
6949075Srrh 			}
6959075Srrh 			else{
6969075Srrh 				sent[st++].cc=ADJ;
6979075Srrh 				goto b;
6989075Srrh 			}
6999075Srrh 		case NOUN:
7009075Srrh 			sent[st++].cc=ADJ;
7019075Srrh 			if(prep==0)subty=SING;
7029075Srrh 			break;
7039075Srrh 		case SUBCONJ:	sent[st++].cc=PRONP;	/* more than .. */
7049075Srrh 			sent[st++].cc=CONJ;
7059075Srrh 			if(verb==0)verb=getv(st,ce);
7069075Srrh 			goto b;
7079075Srrh 		case '"':
7089075Srrh 			sent[st++].cc = ADJ;
7099075Srrh 			st++;
7109075Srrh 			goto b;
7119075Srrh 		default:
7129075Srrh def:
7139075Srrh 			sent[st].cc=PRONP;
7149075Srrh 			if(prep==0)subty=PLURAL;
7159075Srrh 
7169075Srrh 			break;
7179075Srrh 		}
7189075Srrh 		break;
7199075Srrh 	case PRONS_ADJ:
7209075Srrh 		if(aflg == 1 && nextst != END && nextst != ART){
7219075Srrh 			sent[st++].cc=ADJ;
7229075Srrh 			goto b;
7239075Srrh 		}
7249075Srrh 		switch(nextst){
7259075Srrh 		case '"':
7269075Srrh 			sent[st++].cc = ADJ;
7279075Srrh 			st++;
7289075Srrh 			goto b;
7299081Srrh 		case PNOUN:
7309075Srrh 		case ING:
7319075Srrh 		case UNK:
7329075Srrh 		case NOUN_VERB:
7339075Srrh 		case NOUN_ADJ:
7349075Srrh 		case ADJ_ADV:
7359075Srrh 		case ADJ:
7369075Srrh 			sent[st++].cc=ADJ;
7379075Srrh 			goto b;
7389075Srrh 		case NOUN:
7399075Srrh 			sent[st++].cc=ADJ;
7409075Srrh 			if(prep==0)subty=SING;
7419075Srrh 			break;
7429075Srrh 		case PRONS_ADJ:
7439075Srrh 			sent[st++].cc=ADJ;
7449075Srrh 			sent[st].cc=PRONP;
7459075Srrh 			if(prep==0)subty=SING;
7469075Srrh 			break;
7479075Srrh 		case NV_PL:
7489075Srrh 			if(verb==1){
7499075Srrh 				sent[st++].cc=ADJ;
7509075Srrh 				sent[st].cc=NOUN;
7519075Srrh 				if(prep==0)subty=PLURAL;
7529075Srrh 
7539075Srrh 				break;
7549075Srrh 			}
7559075Srrh 			sent[st].cc=PRONP;
7569075Srrh 			if(prep==0)subty=SING;
7579075Srrh 			break;
7589075Srrh 		default:
7599075Srrh 			sent[st].cc=PRONP;
7609075Srrh 			if(prep==0)subty=SING;
7619075Srrh 
7629075Srrh 			break;
7639075Srrh 		}
7649075Srrh 		break;
7659075Srrh 	case NOUN_ADJ:
7669081Srrh 		if(nextst==NOUN||nextst==ADJ||nextst == NOUN_ADJ||nextst==PRONS_ADJ||nextst==PRONP_ADJ||nextst==PNOUN){
7679075Srrh 			sent[st++].cc=ADJ;
7689075Srrh 			goto b;
7699075Srrh 		}
7709075Srrh 		if(nextst!=UNK && nextst != NOUN_VERB && nextst != NV_PL){
7719075Srrh 			sent[st].cc=NOUN;
7729075Srrh 			if(prep==0)subty=SING;
7739075Srrh 			break;
7749075Srrh 		}
7759075Srrh 		if(verb==1 || sent[st+2].cc==ED){
7769075Srrh 			sent[st++].cc=ADJ;
7779075Srrh 			goto b;
7789075Srrh 		}
7799075Srrh 		sent[st].cc=NOUN;
7809075Srrh 		if(prep==0)subty=SING;
7819075Srrh 		break;
7829081Srrh 	case UNK:
7839075Srrh 		if(nextst != UNK){
7849075Srrh 			if(nextst == ',' && rep==0){
7859075Srrh 				c=sent[st+2].cc;
7869081Srrh 				if((c==UNK||c==ADJ||c==NOUN_ADJ||c==ING) && isnoun(sent[st+3].cc)){
7879075Srrh 					comma--;
7889075Srrh 					sent[st].cc=ADJ;
7899075Srrh 					sent[st+2].cc=ADJ;
7909075Srrh 					sent[st+3].cc=NOUN;
7919075Srrh 					if(prep==0){
7929075Srrh 						if(sent[st+3].ic==NV_PL)subty=PLURAL;
7939075Srrh 						else subty=SING;
7949075Srrh 					}
7959075Srrh 					return(st+3);
7969075Srrh 				}
7979075Srrh 				else {
7989075Srrh 					sent[st].cc=NOUN;
7999075Srrh 					if(prep==0)subty=SING;
8009075Srrh 					break;
8019075Srrh 				}
8029075Srrh 			}
8039075Srrh 			if(nextst==NOUN||nextst==ING ||nextst==NOUN_ADJ|| sent[st-1].cc==ADV
8049081Srrh 				|| nextst==ADJ || nextst==PNOUN){
8059075Srrh 				sent[st++].cc=ADJ;
8069075Srrh 				goto b;
8079075Srrh 			}
8089075Srrh 			if((nextst==NV_PL || nextst==NOUN_VERB) &&(verb==1 ||(verb==0 && (sent[st+2].cc==UNK
8099075Srrh 				|| sent[st+2].cc==NOUN_VERB || sent[st+2].cc==ED||sent[st+2].cc==VERB_ADJ)))){
8109075Srrh 					sent[st++].cc=ADJ;
8119075Srrh 					sent[st].cc=NOUN;
8129075Srrh 					if(prep == 0)subty=PLURAL;
8139075Srrh 					break;
8149075Srrh 				}
8159081Srrh 			if(nextst == CONJ && isadv(sent[st+2].cc)){
8169075Srrh 				sent[st].cc=ADJ;
8179075Srrh 				goto b;
8189075Srrh 			}
8199075Srrh 			sent[st].cc=NOUN;
8209075Srrh 			if(prep==0)subty=SING;
8219075Srrh 
8229075Srrh 			break;
8239075Srrh 		}
8249075Srrh 		for(t=st+1;sent[t].cc== UNK;t++);
8259075Srrh 		if(verb==0 && prep == 0){		/* UUU. */
8269075Srrh 			if(prep==0)subty=SING;
8279081Srrh 			if(sent[t].cc==NV_PL|| sent[t].cc == PNOUN){	/* UUZ.*/
8289075Srrh 				if(sent[t+1].cc==UNK || sent[t+1].cc==NOUN_VERB){	/* UUZU */
8299075Srrh 					sent[t+1].cc=VERB;
8309075Srrh 					verb=1;
8319075Srrh 					sent[t].cc=NOUN;
8329075Srrh 					t1=t;
8339075Srrh 				}
8349081Srrh 				else if(sent[t].cc == NV_PL){		/* UUZ. */
8359075Srrh 					sent[t].cc=VERB;
8369075Srrh 					verb=1;
8379075Srrh 					sent[t-1].cc=NOUN;
8389075Srrh 					t1=t-1;
8399075Srrh 				}
8409081Srrh 				else {
8419081Srrh 					sent[t].cc = NOUN;
8429081Srrh 					t1 = t;
8439081Srrh 				}
8449075Srrh 			}
8459075Srrh 			else{		/* UU. */
8469075Srrh 				if(sent[t].cc!= ED){
8479075Srrh 					sent[t-1].cc=VERB;
8489075Srrh 					verb=1;
8499075Srrh 					sent[t-2].cc=NOUN;
8509075Srrh 					t1=t-2;
8519075Srrh 					t--;
8529075Srrh 				}
8539075Srrh 				else {
8549075Srrh 					sent[--t].cc=NOUN;
8559075Srrh 					t1=t;
8569075Srrh 				}
8579075Srrh 			}
8589075Srrh 		}
8599075Srrh 		else{
8609081Srrh 			if(sent[t].cc==NOUN_VERB|| sent[t].cc==NOUN|| sent[t].cc==NV_PL|| sent[t].cc==PNOUN){
8619075Srrh 				sent[t].cc=NOUN;
8629075Srrh 				if(prep==0)subty=PLURAL;
8639075Srrh 				t1=t;
8649075Srrh 			}
8659075Srrh 			else{
8669075Srrh 				sent[--t].cc=NOUN;
8679075Srrh 				if(prep==0)subty=SING;
8689075Srrh 				t1=t;
8699075Srrh 			}
8709075Srrh 		}
8719075Srrh 		for(tt=st;tt<t1;tt++)sent[tt].cc=ADJ;
8729075Srrh 		st=t;
8739075Srrh 		break;
8749075Srrh 	}
8759075Srrh getdef:
8769075Srrh 	if(sent[st].cc == CONJ && sent[st-1].cc == ADJ){
8779075Srrh 		st++;
8789075Srrh 		goto b;
8799075Srrh 	}
8809075Srrh 	if(sent[st-1].cc==PREP && ( sent[st].cc == THAT || sent[st].cc == SUBCONJ)){
8819075Srrh 		prep=0;
8829075Srrh 		return(--st);
8839075Srrh 	}
8849075Srrh 	if(sent[st].cc != NOUN && sent[st].cc != PRONP && sent[st].cc != PRONS){
8859075Srrh 		st--;
8869075Srrh 		if(sent[st].cc==ADJ && sent[st].ic==ING){
8879075Srrh 			sent[st].cc=NOUN;
8889075Srrh 			if(prep==0)subty=SING;
8899075Srrh 		}
8909075Srrh 		else if(sent[st].cc == PREP){
8919075Srrh 			sent[st].cc = ADV;
8929075Srrh 		}
8939075Srrh 		prep=0;
8949075Srrh 		return(st);
8959075Srrh 	}
8969075Srrh 	if(done==1){
8979075Srrh 		prep=0;
8989075Srrh 		return(st);
8999075Srrh 	}
9009075Srrh 	if(sent[st+1].cc== ','){
9019075Srrh 		if(sent[st+2].cc==CONJ){
9029075Srrh 			if(rep==0){
9039075Srrh 				prep=0;
9049075Srrh 				return(st);
9059075Srrh 			}
9069075Srrh 			else{
9079075Srrh 				st+=3;
9089075Srrh 				comma--;
9099075Srrh 				if(prep==0)subty=PLURAL;
9109075Srrh 				prep=1;
9119075Srrh 				goto b;
9129075Srrh 			}
9139075Srrh 		}
9149075Srrh 		if(comma==1){
9159075Srrh 			prep=0;
9169075Srrh 			return(st);
9179075Srrh 		}
9189075Srrh 
9199075Srrh 		switch(sent[st+2].cc){
9209075Srrh 		case PREP:
9219075Srrh 		case SUBCONJ:
9229081Srrh 		case PRONS:
9239081Srrh 		case PRONP:
9249075Srrh 			prep=0;
9259075Srrh 			return(st);
9269075Srrh 		default:	rep++;
9279075Srrh 			comma--;
9289075Srrh 			st+=2;
9299075Srrh 			if(prep==0)subty=PLURAL;
9309075Srrh 			prep=1;
9319075Srrh 			goto b;
9329075Srrh 		}
9339075Srrh 	}
9349075Srrh 	if(sent[st+1].cc==CONJ && sent[st+2].cc != ED){
9359075Srrh 		st+=2;
9369075Srrh 		if(prep==0)subty=PLURAL;
9379075Srrh 		prep=1;
9389075Srrh 		goto b;
9399075Srrh 	}
9409075Srrh 	prep=0;
9419075Srrh 	return(st);
9429075Srrh }
who(kk,ce)9439075Srrh who(kk,ce)
9449075Srrh int kk,ce;
9459075Srrh {
9469075Srrh 	char c;
9479075Srrh 	sent[kk].cc=PRONP;
9489075Srrh 	c=sent[kk+1].cc;
9499081Srrh 	while(isadv(c)){
9509075Srrh 		sent[++kk].cc = ADV;
9519075Srrh 		c = sent[kk+1].cc;
9529075Srrh 	}
9539081Srrh 	if(c==UNK||c==NOUN_VERB||c==VERB_ADJ||c==ED|| c==NV_PL||c==MVERB){
9549075Srrh 		sent[++kk].cc=VERB;
9559075Srrh 		if(verb == 0)verb = getv(kk+1,ce);
9569075Srrh 		return(kk);
9579075Srrh 	}
9589075Srrh w:	switch(sent[++kk].cc){
9599075Srrh 	case AUXX:
9609075Srrh 	case ADV:
9619075Srrh 	case BE:
9629075Srrh 	case VERB:
9639075Srrh 		goto w;
9649075Srrh 	default:
9659075Srrh 		verb=getv(kk,ce);
9669075Srrh 		return(--kk);
9679075Srrh 	}
9689075Srrh }
969