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