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