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