1*9075Srrh #ifndef lint
2*9075Srrh static char sccsid[] = "@(#)pscan.c	4.1	(Berkeley)	82/11/06";
3*9075Srrh #endif not lint
4*9075Srrh 
5*9075Srrh #include "names.h"
6*9075Srrh #include "conp.h"
7*9075Srrh char lastc,nextc;
8*9075Srrh int savsub;
9*9075Srrh scan(si,ce,command)	/*scan a phrase */
10*9075Srrh int si;
11*9075Srrh char ce;
12*9075Srrh {
13*9075Srrh 	char c;
14*9075Srrh 	i=si;
15*9075Srrh 	if(command == 1)subty = PLURAL;
16*9075Srrh 	else subty = 0;
17*9075Srrh 	if(sent[i].cc==ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK && sent[i+1].cc != ADJ)
18*9075Srrh 		sent[i++].cc = ADV;
19*9075Srrh 	done=0;
20*9075Srrh 	verb = 0;
21*9075Srrh 	verb=getv(i,ce);	/*get verb if obvious*/
22*9075Srrh 	if(command == 0)j=getnoun(i,ce);		/*get subject*/
23*9075Srrh 	else j = si;
24*9075Srrh 	if(i != j || ((i==j) && sent[i].cc == NOUN)){
25*9075Srrh 		i = j+1;
26*9075Srrh 	}
27*9075Srrh 	for(;((c=sent[i].cc) != ce) && (c != END)  && (c != '\0');i++){
28*9075Srrh 		nextc=sent[i+1].cc;
29*9075Srrh 		if(i>0){
30*9075Srrh 			lastc=sent[i-1].cc;
31*9075Srrh 			if(lastc==BE)be=1;
32*9075Srrh 			else{
33*9075Srrh 				if(lastc != ADV)be=0;
34*9075Srrh 			}
35*9075Srrh 		}
36*9075Srrh 		else lastc=0;
37*9075Srrh 		if(verb==1)question=0;
38*9075Srrh 		switch(c){
39*9075Srrh 		case '"':
40*9075Srrh 			if(nextc==ED){
41*9075Srrh 				verb=1;
42*9075Srrh 				sent[++i].cc=VERB;
43*9075Srrh 				subty=SING;
44*9075Srrh 				continue;
45*9075Srrh 			}
46*9075Srrh 			subty=0;
47*9075Srrh 			verb=getv(++i,ce);
48*9075Srrh 			i=getnoun(i,ce);
49*9075Srrh 			continue;
50*9075Srrh 		case ART:
51*9075Srrh 		case ADJ:
52*9075Srrh 		case POS:
53*9075Srrh 		case ING:
54*9075Srrh 			aflg=1;
55*9075Srrh 			i=getnoun(i,ce);
56*9075Srrh 			aflg=0;
57*9075Srrh 			continue;
58*9075Srrh 		case PREP:
59*9075Srrh 			if(nextc == ce){
60*9075Srrh 				sent[i].cc=ADV;
61*9075Srrh 				goto sdone;
62*9075Srrh 			}
63*9075Srrh 			prep=1;
64*9075Srrh 			i=getnoun(++i,ce);
65*9075Srrh 			prep=0;
66*9075Srrh 			continue;
67*9075Srrh 		case VERB_ADJ:
68*9075Srrh 			if(verb==0){
69*9075Srrh 				sent[i].cc=VERB;
70*9075Srrh 				verb=1;
71*9075Srrh 				continue;
72*9075Srrh 			}
73*9075Srrh 		case NOUN_ADJ:
74*9075Srrh 			if(be==1){
75*9075Srrh 				sent[i].cc=ADJ;
76*9075Srrh 				continue;
77*9075Srrh 			}
78*9075Srrh 		case PRONP_ADJ:
79*9075Srrh 		case PRONS_ADJ:
80*9075Srrh 			i=getnoun(i,ce);
81*9075Srrh 			continue;
82*9075Srrh 		case NOUN_ADV:
83*9075Srrh 			if(verb == 1 && iverb == i+1){
84*9075Srrh 				sent[i].cc = NOUN;
85*9075Srrh 			}
86*9075Srrh 			else {
87*9075Srrh 				sent[i].cc = ADV;
88*9075Srrh 			}
89*9075Srrh 			continue;
90*9075Srrh 		case ADJ_ADV:
91*9075Srrh 			if(be == 1){
92*9075Srrh 				if(nextc == ADJ || nextc == NOUN_ADJ || nextc == ADJ_ADV || nextc == UNK){
93*9075Srrh 					sent[i].cc = ADV;
94*9075Srrh 					continue;
95*9075Srrh 				}
96*9075Srrh 				if(nextc == ',' && (sent[i+2].cc == ADJ_ADV || sent[i+2].cc == ADV)){
97*9075Srrh 					sent[i++].cc = ADV;
98*9075Srrh 					sent[++i].cc = ADV;
99*9075Srrh 					comma--;
100*9075Srrh 					continue;
101*9075Srrh 				}
102*9075Srrh 				sent[i].cc = ADJ;
103*9075Srrh 				continue;
104*9075Srrh 			}
105*9075Srrh 			if(lastc == NOUN && (nextc == ',' || nextc == END)){
106*9075Srrh 				sent[i].cc=ADJ;
107*9075Srrh 				continue;
108*9075Srrh 			}
109*9075Srrh 			if(nextc!= UNK && nextc != NOUN_VERB && nextc != NOUN && nextc != NV_PL){
110*9075Srrh 				sent[i].cc=ADV;
111*9075Srrh 				continue;
112*9075Srrh 			}
113*9075Srrh 			sent[i].cc=ADJ;
114*9075Srrh 			continue;
115*9075Srrh 		case WHO:
116*9075Srrh 			i=who(i,ce);
117*9075Srrh 			continue;
118*9075Srrh 		case PRONP:
119*9075Srrh 			subty=PLURAL;
120*9075Srrh 			continue;
121*9075Srrh 		case NOUN:
122*9075Srrh 			if(nextc==NOUN){
123*9075Srrh 				sent[i].cc=ADJ;
124*9075Srrh 				continue;
125*9075Srrh 			}
126*9075Srrh 		case PRONS:
127*9075Srrh 			subty=SING;
128*9075Srrh 			continue;
129*9075Srrh 		case CONJ:
130*9075Srrh 			if(nextc==UNK || nextc == NOUN_VERB || nextc == NV_PL){
131*9075Srrh 				if(lastc == ADJ)sent[++i].cc = ADJ;
132*9075Srrh 				else sent[++i].cc = VERB;
133*9075Srrh 			}
134*9075Srrh 			if(nextc == ED){
135*9075Srrh 				sent[++i].cc = VERB;
136*9075Srrh 			}
137*9075Srrh 			continue;
138*9075Srrh 		case AUXP:
139*9075Srrh 		case AUXS:
140*9075Srrh 		case BES:
141*9075Srrh 		case BEP:
142*9075Srrh 		case AUXV:
143*9075Srrh 		case AUX:
144*9075Srrh 		case HAS:
145*9075Srrh 		case HAVE:
146*9075Srrh 		case HAD:
147*9075Srrh 			verb=getv(i,ce);
148*9075Srrh 			continue;
149*9075Srrh 		case ADV:
150*9075Srrh 		case AUXX:
151*9075Srrh 		case VERB:
152*9075Srrh 		case BE:
153*9075Srrh 		case INTER:
154*9075Srrh 			continue;
155*9075Srrh 		case THAT:
156*9075Srrh 			if(nextc==SUBCONJ){
157*9075Srrh 				sent[i].cc=PRONP;
158*9075Srrh 				goto subc;
159*9075Srrh 			}
160*9075Srrh 			verb=getv(i+1,ce);
161*9075Srrh 			j = i+1;
162*9075Srrh 			while(sent[j].cc == ADV || sent[j].cc == ADJ_ADV){
163*9075Srrh 				j++;
164*9075Srrh 			}
165*9075Srrh 			if((verb==1 && iverb== j) || sent[j].cc==ED || sent[j].cc == VERB_ADJ){
166*9075Srrh 				sent[i].cc=PRONP;
167*9075Srrh 				while(i+1 < j)sent[++i].cc = ADV;
168*9075Srrh 			}
169*9075Srrh 			else if(verb==0 && nextc==NV_PL && ((lastc==NOUN
170*9075Srrh 				&& (sent[i-1].ic==UNK || sent[i-1].ic==NOUN_VERB|| sent[i-1].ic==NOUN))|| lastc == ',')){
171*9075Srrh 				sent[i].cc=PRONP;
172*9075Srrh 				subty=SING;
173*9075Srrh 			}
174*9075Srrh 			else if(verb==0 && (nextc==UNK || nextc==NOUN_VERB) && (lastc==NOUN
175*9075Srrh 				&& sent[i-1].ic==NV_PL)){
176*9075Srrh 				subty=PLURAL;
177*9075Srrh 				sent[i].cc=PRONP;
178*9075Srrh 			}
179*9075Srrh 			else {
180*9075Srrh 				if(i == 0)sent[i].cc=ADJ;
181*9075Srrh 				else sent[i].cc=SUBCONJ;
182*9075Srrh 				j=i;
183*9075Srrh 				subty=0;
184*9075Srrh 				i=getnoun(i+1,ce);
185*9075Srrh 				if(done)sent[j].cc=ADJ;
186*9075Srrh 			}
187*9075Srrh 			continue;
188*9075Srrh 		case ',':
189*9075Srrh 			if(nextc != CONJ){	/*parenthetical*/
190*9075Srrh 				continue;
191*9075Srrh 			}
192*9075Srrh 			i++;
193*9075Srrh 			comma--;
194*9075Srrh 			if(sent[i+1].cc == ED){
195*9075Srrh 				sent[++i].cc = VERB;
196*9075Srrh 				continue;
197*9075Srrh 			}
198*9075Srrh 			if(command == 1){
199*9075Srrh 				verb = getv(++i,ce);
200*9075Srrh 				continue;
201*9075Srrh 			}
202*9075Srrh 		case SUBCONJ:
203*9075Srrh subc:
204*9075Srrh 			if(nextc==END||(lastc==',' && nextc==',')){
205*9075Srrh 				sent[i].cc=ADV;
206*9075Srrh 				continue;
207*9075Srrh 			}
208*9075Srrh 			subty=0;
209*9075Srrh 			ce=',';
210*9075Srrh 			verb=getv(++i,ce);
211*9075Srrh 			i=getnoun(i,ce);
212*9075Srrh 			continue;
213*9075Srrh 		case PREP_ADV:
214*9075Srrh 			if(sent[i+2].cc==PREP_ADV &&(sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB
215*9075Srrh 				&& sent[i+1].cc != NV_PL)){
216*9075Srrh 				sent[i].cc=ADV;
217*9075Srrh 				sent[i+2].cc=CONJ;
218*9075Srrh 				continue;
219*9075Srrh 			}
220*9075Srrh 			sav=i++;
221*9075Srrh 			savsub = subty;
222*9075Srrh 			pverb=getv(i,ce);
223*9075Srrh 			if((pverb==1 && iverb == i) || sent[i].cc== ED){
224*9075Srrh 				sent[sav].cc=PRONP;
225*9075Srrh 				sent[i].cc=VERB;
226*9075Srrh 				continue;
227*9075Srrh 			}
228*9075Srrh 			i=getnoun(i,ce);
229*9075Srrh 			if(done==1){
230*9075Srrh 				sent[sav].cc=ADV;
231*9075Srrh 				goto sdone;
232*9075Srrh 			}
233*9075Srrh 			if(pverb==1 && iverb == i+1){
234*9075Srrh 				sent[sav].cc=SUBCONJ;
235*9075Srrh 				ce=',';
236*9075Srrh 				continue;
237*9075Srrh 			}
238*9075Srrh 			switch(sent[i+1].cc){
239*9075Srrh 			case UNK:
240*9075Srrh 			case NV_PL:
241*9075Srrh 			case NOUN_VERB:
242*9075Srrh 			case ED:
243*9075Srrh 				sent[sav].cc=SUBCONJ;
244*9075Srrh 				verb=0;
245*9075Srrh 				ce=',';
246*9075Srrh 				continue;
247*9075Srrh 			default:
248*9075Srrh 				sent[sav].cc=PREP;
249*9075Srrh 				subty = savsub;
250*9075Srrh 				continue;
251*9075Srrh 			}
252*9075Srrh 		case TO:
253*9075Srrh 			sent[i++].cc=VERB;
254*9075Srrh 			switch(nextc){
255*9075Srrh 			case UNK:
256*9075Srrh 			case AUXS:
257*9075Srrh 			case VERB_ADJ:
258*9075Srrh 			case NOUN_VERB:
259*9075Srrh 			case ED:
260*9075Srrh 			case VERB:
261*9075Srrh 				sent[i].cc=VERB;
262*9075Srrh 				continue;
263*9075Srrh 			case HAVE:
264*9075Srrh 				sent[i].cc = VERB;
265*9075Srrh 				if(sent[i+1].cc == ED){
266*9075Srrh 					sent[++i].cc = VERB;
267*9075Srrh 					continue;
268*9075Srrh 				}
269*9075Srrh 				if(sent[i+1].cc != BE)continue;
270*9075Srrh 				i++;
271*9075Srrh 			case BE:
272*9075Srrh 				sent[i].cc=VERB;
273*9075Srrh 				if(sent[i+1].cc == ED || sent[i+1].cc == ING){
274*9075Srrh 					sent[++i].cc = VERB;
275*9075Srrh 				}
276*9075Srrh 				else if(sent[i+1].cc == UNK){
277*9075Srrh 					sent[++i].cc = ADJ;
278*9075Srrh 				}
279*9075Srrh 				continue;
280*9075Srrh 			default:
281*9075Srrh 				sent[i-1].cc = PREP;
282*9075Srrh 				prep=1;
283*9075Srrh 				i=getnoun(i,ce);
284*9075Srrh 				prep=0;
285*9075Srrh 				continue;
286*9075Srrh 			}
287*9075Srrh 		case NV_PL:
288*9075Srrh 			if(subty==0){
289*9075Srrh 				i=getnoun(i,ce);
290*9075Srrh 				subty=PLURAL;
291*9075Srrh 			}
292*9075Srrh 			else if(verb== 0){	/*need verb*/
293*9075Srrh 				sent[i].cc=VERB;
294*9075Srrh 				verb=1;
295*9075Srrh 			}
296*9075Srrh 			else{
297*9075Srrh 				i=getnoun(i,ce);
298*9075Srrh 			}
299*9075Srrh 			continue;
300*9075Srrh 		case UNK:
301*9075Srrh 		case NOUN_VERB:
302*9075Srrh 			if(verb==1){
303*9075Srrh 				if(be==1 && nextc != WHO){
304*9075Srrh 					sent[i].cc=ADJ;
305*9075Srrh 					continue;
306*9075Srrh 				}
307*9075Srrh 				i=getnoun(i,ce);
308*9075Srrh 			}
309*9075Srrh 			else if(nextc==NV_PL &&( sent[i+2].cc==NOUN_VERB || sent[i+2].cc==NOUN||
310*9075Srrh 				sent[i+2].cc==UNK || sent[i+2].cc==NV_PL)){
311*9075Srrh 				sent[i].cc=NOUN;
312*9075Srrh 				if(sent[i-1].cc == NOUN){
313*9075Srrh 					sent[i-1].cc = ADJ;
314*9075Srrh 				}
315*9075Srrh 				subty=SING;
316*9075Srrh 				continue;
317*9075Srrh 			}
318*9075Srrh 			else if(subty==0){
319*9075Srrh 				i=getnoun(i,ce);
320*9075Srrh 				continue;
321*9075Srrh 			}
322*9075Srrh 			else {		/* desparation */
323*9075Srrh 				sent[i].cc=VERB;
324*9075Srrh 				verb=1;
325*9075Srrh 			}
326*9075Srrh 			continue;
327*9075Srrh 		case ED:
328*9075Srrh 			if(verb == 0){
329*9075Srrh 				sent[i].cc=VERB;
330*9075Srrh 				verb=1;
331*9075Srrh 			}
332*9075Srrh 			else if(sent[i-1].cc == BE){
333*9075Srrh 				sent[i].cc = VERB;
334*9075Srrh 			}
335*9075Srrh 			else{
336*9075Srrh 				i=getnoun(i,ce);
337*9075Srrh 			}
338*9075Srrh 			continue;
339*9075Srrh 		default:	printf("got a %c on %s\n",sent[i].cc,sent[i].sp);
340*9075Srrh 		}
341*9075Srrh 	}
342*9075Srrh sdone:
343*9075Srrh 	if(sent[i].cc==END && sent[i].ic != ';')return(-1);
344*9075Srrh 	else {
345*9075Srrh 		if(sent[i].ic == ';')sent[i].cc=';';
346*9075Srrh 		else comma--;
347*9075Srrh 		return(i);
348*9075Srrh 	}
349*9075Srrh }
350*9075Srrh getv(si,ce)
351*9075Srrh int si;
352*9075Srrh char ce;
353*9075Srrh {
354*9075Srrh 	int conj;
355*9075Srrh 	char c;
356*9075Srrh 	int ik;
357*9075Srrh 	must=0;
358*9075Srrh 	bflg=0;
359*9075Srrh 	hflg=0;
360*9075Srrh 	verbty=0;
361*9075Srrh 	for(j=si;((c=sent[j].cc) != ce) && (c != END); j++){
362*9075Srrh 		iverb=j;
363*9075Srrh 		switch(c){
364*9075Srrh 		case ED:
365*9075Srrh 			continue;
366*9075Srrh 		case HAS:
367*9075Srrh 			hflg=1;
368*9075Srrh 			verbty=SING;
369*9075Srrh 			sent[j].cc=AUXX;
370*9075Srrh 			goto next;
371*9075Srrh 		case HAVE:
372*9075Srrh 			if(sent[j-1].cc==TO){
373*9075Srrh 				continue;
374*9075Srrh 			}
375*9075Srrh 		case HAD:
376*9075Srrh 			hflg=1;
377*9075Srrh 			verbty=PLURAL;
378*9075Srrh 			sent[j].cc=AUXX;
379*9075Srrh 			goto next;
380*9075Srrh 		case BE:
381*9075Srrh 			if(sent[j].ic != BE){
382*9075Srrh 				return(1);
383*9075Srrh 			}
384*9075Srrh 			continue;
385*9075Srrh 		case VERB:
386*9075Srrh 			if(sent[j-1].cc==TO){
387*9075Srrh 				continue;
388*9075Srrh 			}
389*9075Srrh 			return(1);
390*9075Srrh 		case AUXX:
391*9075Srrh 			return(1);
392*9075Srrh 		case AUXP:
393*9075Srrh 			must=1;
394*9075Srrh 			verbty=PLURAL;
395*9075Srrh 			sent[j].cc=AUXX;
396*9075Srrh 			goto next;
397*9075Srrh 		case AUXS:
398*9075Srrh 			if(sent[j-1].cc==TO){
399*9075Srrh 				continue;
400*9075Srrh 			}
401*9075Srrh 			verbty=SING;
402*9075Srrh 			sent[j].cc=AUXX;
403*9075Srrh 			goto next;
404*9075Srrh 		case AUX:
405*9075Srrh 		case AUXV:
406*9075Srrh 			must=1;
407*9075Srrh 			sent[j].cc=AUXX;
408*9075Srrh next:
409*9075Srrh 			if(sent[j-1].cc == CONJ && verb == 0)conj = 0;
410*9075Srrh 			else conj = 1;
411*9075Srrh 			if(question==1){
412*9075Srrh 				j=getnoun(j+1,ce);
413*9075Srrh 				question=0;
414*9075Srrh 			}
415*9075Srrh 			getv2(ce);
416*9075Srrh 			if(sent[j].cc == AUXX){
417*9075Srrh 				sent[j].cc = VERB;
418*9075Srrh 			}
419*9075Srrh 			if((sent[j].cc!=VERB && sent[j].cc!=BE) && sent[iverb].cc==AUXX){
420*9075Srrh 				sent[iverb].cc=VERB;
421*9075Srrh 				for(ik=iverb+1;ik<=j;ik++)sent[ik].cc=sent[ik].ic;
422*9075Srrh 			}
423*9075Srrh 			return(conj);
424*9075Srrh 		case BES:
425*9075Srrh 			verbty=SING;
426*9075Srrh 			bflg=1;
427*9075Srrh 			sent[j].cc=BE;
428*9075Srrh 			goto next;
429*9075Srrh 		case BEP:
430*9075Srrh 			verbty=PLURAL;
431*9075Srrh 			bflg=1;
432*9075Srrh 			sent[j].cc=BE;
433*9075Srrh 			goto next;
434*9075Srrh 		case SUBCONJ:
435*9075Srrh 			if(sent[j-1].cc== ',' && sent[j+1].cc == ','){
436*9075Srrh 				continue;
437*9075Srrh 			}
438*9075Srrh 		case THAT:
439*9075Srrh 		case WHO:
440*9075Srrh 			goto vdone;
441*9075Srrh 		case ',':	if(comma==1 && sent[j+1].cc==CONJ){
442*9075Srrh 					goto vdone;
443*9075Srrh 				}
444*9075Srrh 		}
445*9075Srrh 	}
446*9075Srrh vdone:
447*9075Srrh 	return(0);
448*9075Srrh }
449*9075Srrh getv2(ce)
450*9075Srrh char ce;
451*9075Srrh {
452*9075Srrh 	int vflg;
453*9075Srrh 	char c;
454*9075Srrh 	vflg=0;
455*9075Srrh 	while(((c=sent[++j].cc) != ce) && (c != END)){
456*9075Srrh 		switch(c){
457*9075Srrh 		case NOUN_ADV:
458*9075Srrh 		case ADJ_ADV:
459*9075Srrh 			if(bflg == 0 || sent[j+1].cc == ED || sent[j+1].cc == ING){
460*9075Srrh 				sent[j].cc = ADV;
461*9075Srrh 			}
462*9075Srrh 			else{
463*9075Srrh 				j -= 1;
464*9075Srrh 				return;
465*9075Srrh 			}
466*9075Srrh 		case ADV:
467*9075Srrh 			continue;
468*9075Srrh 		case SUBCONJ:
469*9075Srrh 			if(sent[j+1].cc == ED || sent[j+1].cc == ING || sent[j+1].cc == ADV ||
470*9075Srrh 				sent[j+1].cc == ADJ_ADV)sent[j].cc = ADV;
471*9075Srrh 			else return;
472*9075Srrh 			continue;
473*9075Srrh 		case VERB:
474*9075Srrh 			return;
475*9075Srrh 		case VERB_ADJ:
476*9075Srrh 		case ED:
477*9075Srrh 			sent[j].cc=VERB;
478*9075Srrh 			return;
479*9075Srrh 		case BE:
480*9075Srrh 			must=0;
481*9075Srrh 			bflg=1;
482*9075Srrh 			continue;
483*9075Srrh 		case ING:
484*9075Srrh 			if(bflg == 1){
485*9075Srrh 				sent[j].cc = VERB;
486*9075Srrh 			}
487*9075Srrh 			else {
488*9075Srrh 				j -= 1;
489*9075Srrh 			}
490*9075Srrh 			return;
491*9075Srrh 		case NOUN_VERB:
492*9075Srrh 		case UNK:
493*9075Srrh 			if(bflg==1 || vflg==1 || hflg==1){
494*9075Srrh 				j -= 1;
495*9075Srrh 				return;
496*9075Srrh 			}
497*9075Srrh 			sent[j].cc=VERB;
498*9075Srrh 			return;
499*9075Srrh 		case PRONP_ADJ:
500*9075Srrh 		case PRONS_ADJ:
501*9075Srrh 			c=sent[j+1].cc;
502*9075Srrh 			if(c==ED||c==ING||c==BE||must==1){
503*9075Srrh 				sent[j].cc = ADV;
504*9075Srrh 			}
505*9075Srrh 			else{
506*9075Srrh 				j -= 1;
507*9075Srrh 				return;
508*9075Srrh 			}
509*9075Srrh 			continue;
510*9075Srrh 		case AUXV:
511*9075Srrh 		case AUX:
512*9075Srrh 		case AUXP:
513*9075Srrh 		case AUXS:
514*9075Srrh 		case HAD:
515*9075Srrh 		case HAVE:
516*9075Srrh 		case HAS:
517*9075Srrh 			must=0;
518*9075Srrh 			vflg=1;
519*9075Srrh 			sent[j].cc=AUXX;
520*9075Srrh 			continue;
521*9075Srrh 		default:
522*9075Srrh 			j -= 1;
523*9075Srrh 			return;
524*9075Srrh 		}
525*9075Srrh 	}
526*9075Srrh 	j -= 1;
527*9075Srrh }
528*9075Srrh getnoun(k,ce)
529*9075Srrh int k,ce;
530*9075Srrh {
531*9075Srrh 	char c;
532*9075Srrh 	int st,t,nextst;
533*9075Srrh 	int rep;
534*9075Srrh 	int t1,tt;
535*9075Srrh 	st=k;
536*9075Srrh 	rep=0;
537*9075Srrh b:
538*9075Srrh 	nextst=sent[st+1].cc;
539*9075Srrh 	switch(sent[st].cc){
540*9075Srrh 	case END:
541*9075Srrh 		done=1;
542*9075Srrh 		break;
543*9075Srrh 	case ',':
544*9075Srrh 		if(ce==','){
545*9075Srrh 			done=1;
546*9075Srrh 			break;
547*9075Srrh 		}
548*9075Srrh 		else {
549*9075Srrh 			goto getdef;
550*9075Srrh 		}
551*9075Srrh 	case '"':
552*9075Srrh 		if(aflg == 1){
553*9075Srrh 			st++;
554*9075Srrh 			goto b;
555*9075Srrh 		}
556*9075Srrh 		break;
557*9075Srrh 	case NOUN:
558*9075Srrh 		switch(nextst){
559*9075Srrh 		case UNK:
560*9075Srrh 		case NOUN_VERB:
561*9075Srrh 			if(verb==1){
562*9075Srrh 				goto nn;
563*9075Srrh 			}
564*9075Srrh 			if(subty != PLURAL){
565*9075Srrh 				goto nn;
566*9075Srrh 			}
567*9075Srrh 			break;
568*9075Srrh 		case NV_PL:
569*9075Srrh 			if(verb==1){
570*9075Srrh 				goto nn;
571*9075Srrh 			}
572*9075Srrh 			if(subty == PLURAL){
573*9075Srrh 				goto nn;
574*9075Srrh 			}
575*9075Srrh 			break;
576*9075Srrh 		case NOUN_ADJ:
577*9075Srrh 		case POS:
578*9075Srrh 		case NOUN:
579*9075Srrh nn:
580*9075Srrh 			sent[st].cc=ADJ;
581*9075Srrh 			goto b;
582*9075Srrh 		}
583*9075Srrh 		if(prep==0)subty=SING;
584*9075Srrh 		break;
585*9075Srrh 	case ADV:
586*9075Srrh 		st++;
587*9075Srrh 		goto b;
588*9075Srrh 	case WHO:
589*9075Srrh 		st=who(st,ce);
590*9075Srrh 		st++;
591*9075Srrh 		goto b;
592*9075Srrh 	case ADJ_ADV:
593*9075Srrh 	case VERB_ADJ:
594*9075Srrh 	case ED:
595*9075Srrh 		sent[st++].cc=ADJ;
596*9075Srrh 		goto b;
597*9075Srrh 	case ING:
598*9075Srrh 		if(nextst==UNK || nextst==NOUN_VERB || nextst==NOUN || nextst==NV_PL){
599*9075Srrh 			sent[st++].cc=ADJ;
600*9075Srrh 			goto b;
601*9075Srrh 		}
602*9075Srrh 		sent[st].cc=NOUN;
603*9075Srrh 		if(prep==0)subty=SING;
604*9075Srrh 		break;
605*9075Srrh 	case ART:
606*9075Srrh 	case POS:
607*9075Srrh 		if(st != k){
608*9075Srrh 			goto getdef;
609*9075Srrh 		}
610*9075Srrh 	case ADJ:
611*9075Srrh 		st++;
612*9075Srrh 		goto b;
613*9075Srrh 	case PRONP:
614*9075Srrh 		if(prep==0)subty=PLURAL;
615*9075Srrh 
616*9075Srrh 		break;
617*9075Srrh 	case PRONS:
618*9075Srrh 		if(prep==0)subty=SING;
619*9075Srrh 		break;
620*9075Srrh 	case NOUN_VERB:
621*9075Srrh 		if(nextst==NOUN||(verb==1 && (nextst== NV_PL|| nextst==NOUN_VERB) )){
622*9075Srrh 			sent[st].cc=ADJ;
623*9075Srrh 			goto b;
624*9075Srrh 		}
625*9075Srrh 	case NV_PL:
626*9075Srrh 		sent[st].cc=NOUN;
627*9075Srrh 		if(prep==0){
628*9075Srrh 			if(sent[st].ic==NV_PL)subty=PLURAL;
629*9075Srrh 			else subty=SING;
630*9075Srrh 		}
631*9075Srrh 		if(sent[st-1].cc == NOUN && sent[st-1].ic == NOUN){
632*9075Srrh 			sent[st-1].cc = ADJ;
633*9075Srrh 		}
634*9075Srrh 		break;
635*9075Srrh 	case PRONP_ADJ:
636*9075Srrh 		switch(nextst){
637*9075Srrh 		case NOUN_ADJ:
638*9075Srrh 		case NV_PL:
639*9075Srrh 		case ADJ_ADV:
640*9075Srrh 		case PRONS_ADJ:
641*9075Srrh 		case ADJ:
642*9075Srrh 		case ING:
643*9075Srrh 			sent[st++].cc=ADJ;
644*9075Srrh 			goto b;
645*9075Srrh 		case NOUN_VERB:
646*9075Srrh 		case UNK:
647*9075Srrh 		case ED:
648*9075Srrh 			if(verb == 0){
649*9075Srrh 				goto def;
650*9075Srrh 			}
651*9075Srrh 			else{
652*9075Srrh 				sent[st++].cc=ADJ;
653*9075Srrh 				goto b;
654*9075Srrh 			}
655*9075Srrh 		case NOUN:
656*9075Srrh 			sent[st++].cc=ADJ;
657*9075Srrh 			if(prep==0)subty=SING;
658*9075Srrh 			break;
659*9075Srrh 		case SUBCONJ:	sent[st++].cc=PRONP;	/* more than .. */
660*9075Srrh 			sent[st++].cc=CONJ;
661*9075Srrh 			if(verb==0)verb=getv(st,ce);
662*9075Srrh 			goto b;
663*9075Srrh 		case '"':
664*9075Srrh 			sent[st++].cc = ADJ;
665*9075Srrh 			st++;
666*9075Srrh 			goto b;
667*9075Srrh 		default:
668*9075Srrh def:
669*9075Srrh 			sent[st].cc=PRONP;
670*9075Srrh 			if(prep==0)subty=PLURAL;
671*9075Srrh 
672*9075Srrh 			break;
673*9075Srrh 		}
674*9075Srrh 		break;
675*9075Srrh 	case PRONS_ADJ:
676*9075Srrh 		if(aflg == 1 && nextst != END && nextst != ART){
677*9075Srrh 			sent[st++].cc=ADJ;
678*9075Srrh 			goto b;
679*9075Srrh 		}
680*9075Srrh 		switch(nextst){
681*9075Srrh 		case '"':
682*9075Srrh 			sent[st++].cc = ADJ;
683*9075Srrh 			st++;
684*9075Srrh 			goto b;
685*9075Srrh 		case ING:
686*9075Srrh 		case UNK:
687*9075Srrh 		case NOUN_VERB:
688*9075Srrh 		case NOUN_ADJ:
689*9075Srrh 		case ADJ_ADV:
690*9075Srrh 		case ADJ:
691*9075Srrh 			sent[st++].cc=ADJ;
692*9075Srrh 			goto b;
693*9075Srrh 		case NOUN:
694*9075Srrh 			sent[st++].cc=ADJ;
695*9075Srrh 			if(prep==0)subty=SING;
696*9075Srrh 			break;
697*9075Srrh 		case PRONS_ADJ:
698*9075Srrh 			sent[st++].cc=ADJ;
699*9075Srrh 			sent[st].cc=PRONP;
700*9075Srrh 			if(prep==0)subty=SING;
701*9075Srrh 			break;
702*9075Srrh 		case NV_PL:
703*9075Srrh 			if(verb==1){
704*9075Srrh 				sent[st++].cc=ADJ;
705*9075Srrh 				sent[st].cc=NOUN;
706*9075Srrh 				if(prep==0)subty=PLURAL;
707*9075Srrh 
708*9075Srrh 				break;
709*9075Srrh 			}
710*9075Srrh 			sent[st].cc=PRONP;
711*9075Srrh 			if(prep==0)subty=SING;
712*9075Srrh 			break;
713*9075Srrh 		default:
714*9075Srrh 			sent[st].cc=PRONP;
715*9075Srrh 			if(prep==0)subty=SING;
716*9075Srrh 
717*9075Srrh 			break;
718*9075Srrh 		}
719*9075Srrh 		break;
720*9075Srrh 	case NOUN_ADJ:
721*9075Srrh 		if(nextst==NOUN||nextst==ADJ||nextst == NOUN_ADJ||nextst==PRONS_ADJ||nextst==PRONP_ADJ){
722*9075Srrh 			sent[st++].cc=ADJ;
723*9075Srrh 			goto b;
724*9075Srrh 		}
725*9075Srrh 		if(nextst!=UNK && nextst != NOUN_VERB && nextst != NV_PL){
726*9075Srrh 			sent[st].cc=NOUN;
727*9075Srrh 			if(prep==0)subty=SING;
728*9075Srrh 			break;
729*9075Srrh 		}
730*9075Srrh 		if(verb==1 || sent[st+2].cc==ED){
731*9075Srrh 			sent[st++].cc=ADJ;
732*9075Srrh 			goto b;
733*9075Srrh 		}
734*9075Srrh 		sent[st].cc=NOUN;
735*9075Srrh 		if(prep==0)subty=SING;
736*9075Srrh 		break;
737*9075Srrh 	case UNK:
738*9075Srrh 		if(nextst != UNK){
739*9075Srrh 			if(nextst == ',' && rep==0){
740*9075Srrh 				c=sent[st+2].cc;
741*9075Srrh 				if((c==UNK||c==ADJ||c==NOUN_ADJ||c==ING) && (sent[st+3].cc==UNK||sent[st+3].cc==NOUN_VERB
742*9075Srrh 					|| sent[st+3].cc==NV_PL)){
743*9075Srrh 					comma--;
744*9075Srrh 					sent[st].cc=ADJ;
745*9075Srrh 					sent[st+2].cc=ADJ;
746*9075Srrh 					sent[st+3].cc=NOUN;
747*9075Srrh 					if(prep==0){
748*9075Srrh 						if(sent[st+3].ic==NV_PL)subty=PLURAL;
749*9075Srrh 						else subty=SING;
750*9075Srrh 					}
751*9075Srrh 					return(st+3);
752*9075Srrh 				}
753*9075Srrh 				else {
754*9075Srrh 					sent[st].cc=NOUN;
755*9075Srrh 					if(prep==0)subty=SING;
756*9075Srrh 					break;
757*9075Srrh 				}
758*9075Srrh 			}
759*9075Srrh 			if(nextst==NOUN||nextst==ING ||nextst==NOUN_ADJ|| sent[st-1].cc==ADV
760*9075Srrh 				|| nextst==ADJ){
761*9075Srrh 				sent[st++].cc=ADJ;
762*9075Srrh 				goto b;
763*9075Srrh 			}
764*9075Srrh 			if((nextst==NV_PL || nextst==NOUN_VERB) &&(verb==1 ||(verb==0 && (sent[st+2].cc==UNK
765*9075Srrh 				|| sent[st+2].cc==NOUN_VERB || sent[st+2].cc==ED||sent[st+2].cc==VERB_ADJ)))){
766*9075Srrh 					sent[st++].cc=ADJ;
767*9075Srrh 					sent[st].cc=NOUN;
768*9075Srrh 					if(prep == 0)subty=PLURAL;
769*9075Srrh 					break;
770*9075Srrh 				}
771*9075Srrh 			if(nextst==CONJ &&(sent[st+2].cc==ADJ||sent[st+2].cc==ADJ_ADV)){
772*9075Srrh 				sent[st].cc=ADJ;
773*9075Srrh 				goto b;
774*9075Srrh 			}
775*9075Srrh 			sent[st].cc=NOUN;
776*9075Srrh 			if(prep==0)subty=SING;
777*9075Srrh 
778*9075Srrh 			break;
779*9075Srrh 		}
780*9075Srrh 		for(t=st+1;sent[t].cc== UNK;t++);
781*9075Srrh 		if(verb==0 && prep == 0){		/* UUU. */
782*9075Srrh 			if(prep==0)subty=SING;
783*9075Srrh 			if(sent[t].cc==NV_PL){	/* UUZ.*/
784*9075Srrh 				if(sent[t+1].cc==UNK || sent[t+1].cc==NOUN_VERB){	/* UUZU */
785*9075Srrh 					sent[t+1].cc=VERB;
786*9075Srrh 					verb=1;
787*9075Srrh 					sent[t].cc=NOUN;
788*9075Srrh 					t1=t;
789*9075Srrh 				}
790*9075Srrh 				else{		/* UUZ. */
791*9075Srrh 					sent[t].cc=VERB;
792*9075Srrh 					verb=1;
793*9075Srrh 					sent[t-1].cc=NOUN;
794*9075Srrh 					t1=t-1;
795*9075Srrh 				}
796*9075Srrh 			}
797*9075Srrh 			else{		/* UU. */
798*9075Srrh 				if(sent[t].cc!= ED){
799*9075Srrh 					sent[t-1].cc=VERB;
800*9075Srrh 					verb=1;
801*9075Srrh 					sent[t-2].cc=NOUN;
802*9075Srrh 					t1=t-2;
803*9075Srrh 					t--;
804*9075Srrh 				}
805*9075Srrh 				else {
806*9075Srrh 					sent[--t].cc=NOUN;
807*9075Srrh 					t1=t;
808*9075Srrh 				}
809*9075Srrh 			}
810*9075Srrh 		}
811*9075Srrh 		else{
812*9075Srrh 			if(sent[t].cc==NOUN_VERB|| sent[t].cc==NOUN|| sent[t].cc==NV_PL){
813*9075Srrh 				sent[t].cc=NOUN;
814*9075Srrh 				if(prep==0)subty=PLURAL;
815*9075Srrh 				t1=t;
816*9075Srrh 			}
817*9075Srrh 			else{
818*9075Srrh 				sent[--t].cc=NOUN;
819*9075Srrh 				if(prep==0)subty=SING;
820*9075Srrh 				t1=t;
821*9075Srrh 			}
822*9075Srrh 		}
823*9075Srrh 		for(tt=st;tt<t1;tt++)sent[tt].cc=ADJ;
824*9075Srrh 		st=t;
825*9075Srrh 		break;
826*9075Srrh 	}
827*9075Srrh getdef:
828*9075Srrh 	if(sent[st].cc == CONJ && sent[st-1].cc == ADJ){
829*9075Srrh 		st++;
830*9075Srrh 		goto b;
831*9075Srrh 	}
832*9075Srrh 	if(sent[st-1].cc==PREP && ( sent[st].cc == THAT || sent[st].cc == SUBCONJ)){
833*9075Srrh 		prep=0;
834*9075Srrh 		return(--st);
835*9075Srrh 	}
836*9075Srrh 	if(sent[st].cc != NOUN && sent[st].cc != PRONP && sent[st].cc != PRONS){
837*9075Srrh 		st--;
838*9075Srrh 		if(sent[st].cc==ADJ && sent[st].ic==ING){
839*9075Srrh 			sent[st].cc=NOUN;
840*9075Srrh 			if(prep==0)subty=SING;
841*9075Srrh 		}
842*9075Srrh 		else if(sent[st].cc == PREP){
843*9075Srrh 			sent[st].cc = ADV;
844*9075Srrh 		}
845*9075Srrh 		prep=0;
846*9075Srrh 		return(st);
847*9075Srrh 	}
848*9075Srrh 	if(done==1){
849*9075Srrh 		prep=0;
850*9075Srrh 		return(st);
851*9075Srrh 	}
852*9075Srrh 	if(sent[st+1].cc== ','){
853*9075Srrh 		if(sent[st+2].cc==CONJ){
854*9075Srrh 			if(rep==0){
855*9075Srrh 				prep=0;
856*9075Srrh 				return(st);
857*9075Srrh 			}
858*9075Srrh 			else{
859*9075Srrh 				st+=3;
860*9075Srrh 				comma--;
861*9075Srrh 				if(prep==0)subty=PLURAL;
862*9075Srrh 				prep=1;
863*9075Srrh 				goto b;
864*9075Srrh 			}
865*9075Srrh 		}
866*9075Srrh 		if(comma==1){
867*9075Srrh 			prep=0;
868*9075Srrh 			return(st);
869*9075Srrh 		}
870*9075Srrh 
871*9075Srrh 		switch(sent[st+2].cc){
872*9075Srrh 		case PREP:
873*9075Srrh 		case SUBCONJ:
874*9075Srrh 			prep=0;
875*9075Srrh 			return(st);
876*9075Srrh 		default:	rep++;
877*9075Srrh 			comma--;
878*9075Srrh 			st+=2;
879*9075Srrh 			if(prep==0)subty=PLURAL;
880*9075Srrh 			prep=1;
881*9075Srrh 			goto b;
882*9075Srrh 		}
883*9075Srrh 	}
884*9075Srrh 	if(sent[st+1].cc==CONJ && sent[st+2].cc != ED){
885*9075Srrh 		st+=2;
886*9075Srrh 		if(prep==0)subty=PLURAL;
887*9075Srrh 		prep=1;
888*9075Srrh 		goto b;
889*9075Srrh 	}
890*9075Srrh 	prep=0;
891*9075Srrh 	return(st);
892*9075Srrh }
893*9075Srrh who(kk,ce)
894*9075Srrh int kk,ce;
895*9075Srrh {
896*9075Srrh 	char c;
897*9075Srrh 	sent[kk].cc=PRONP;
898*9075Srrh 	c=sent[kk+1].cc;
899*9075Srrh 	while(c==ADV||c==ADJ_ADV){
900*9075Srrh 		sent[++kk].cc = ADV;
901*9075Srrh 		c = sent[kk+1].cc;
902*9075Srrh 	}
903*9075Srrh 	if(c==UNK||c==NOUN_VERB||c==VERB_ADJ||c==ED|| c==NV_PL){
904*9075Srrh 		sent[++kk].cc=VERB;
905*9075Srrh 		if(verb == 0)verb = getv(kk+1,ce);
906*9075Srrh 		return(kk);
907*9075Srrh 	}
908*9075Srrh w:	switch(sent[++kk].cc){
909*9075Srrh 	case AUXX:
910*9075Srrh 	case ADV:
911*9075Srrh 	case BE:
912*9075Srrh 	case VERB:
913*9075Srrh 		goto w;
914*9075Srrh 	default:
915*9075Srrh 		verb=getv(kk,ce);
916*9075Srrh 		return(--kk);
917*9075Srrh 	}
918*9075Srrh }
919