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