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;
scan(si,ce,command)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 }
getv(si,ce)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 }
getv2(ce)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 }
getnoun(k,ce)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 }
who(kk,ce)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