19075Srrh #ifndef lint 2*9081Srrh static char sccsid[] = "@(#)pscan.c 4.2 (Berkeley) 82/11/06"; 39075Srrh #endif not lint 49075Srrh 59075Srrh #include "names.h" 69075Srrh #include "conp.h" 7*9081Srrh #define isadv(c) (c == ADV || c == ADJ_ADV) 8*9081Srrh #define isadj(c) (c == ADJ || c == NOUN_ADJ || c == ADJ_ADV || c == UNK) 9*9081Srrh #define notnoun(c) (c != NOUN && c != UNK && c != NOUN_VERB && c != NV_PL && c != PNOUN) 10*9081Srrh #define issing(c) (c == UNK || c == NOUN_VERB || c == NOUN || c == NOM || c == NOUN_ADJ) 11*9081Srrh #define isnoun(c) (c == NOUN || c == NOUN_VERB || c == NV_PL || c == UNK || c == PNOUN) 12*9081Srrh #define nounnom(c) (c == NOUN || c == NOM) 139075Srrh char lastc,nextc; 149075Srrh int savsub; 159075Srrh scan(si,ce,command) /*scan a phrase */ 169075Srrh int si; 179075Srrh char ce; 189075Srrh { 19*9081Srrh int savi; 209075Srrh char c; 219075Srrh i=si; 229075Srrh if(command == 1)subty = PLURAL; 239075Srrh else subty = 0; 249075Srrh if(sent[i].cc==ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK && sent[i+1].cc != ADJ) 259075Srrh sent[i++].cc = ADV; 269075Srrh done=0; 279075Srrh verb = 0; 289075Srrh verb=getv(i,ce); /*get verb if obvious*/ 299075Srrh if(command == 0)j=getnoun(i,ce); /*get subject*/ 309075Srrh else j = si; 319075Srrh if(i != j || ((i==j) && sent[i].cc == NOUN)){ 329075Srrh i = j+1; 339075Srrh } 349075Srrh for(;((c=sent[i].cc) != ce) && (c != END) && (c != '\0');i++){ 359075Srrh nextc=sent[i+1].cc; 369075Srrh if(i>0){ 379075Srrh lastc=sent[i-1].cc; 389075Srrh if(lastc==BE)be=1; 399075Srrh else{ 409075Srrh if(lastc != ADV)be=0; 419075Srrh } 429075Srrh } 439075Srrh else lastc=0; 449075Srrh if(verb==1)question=0; 459075Srrh switch(c){ 469075Srrh case '"': 47*9081Srrh if(nextc==ED || nextc == MVERB){ 489075Srrh verb=1; 499075Srrh sent[++i].cc=VERB; 509075Srrh subty=SING; 519075Srrh continue; 529075Srrh } 539075Srrh subty=0; 549075Srrh verb=getv(++i,ce); 559075Srrh i=getnoun(i,ce); 569075Srrh continue; 57*9081Srrh case MVERB: 58*9081Srrh sent[i].cc = VERB; 59*9081Srrh if(i < nsleng*.5){ 60*9081Srrh verb = getv(++i,ce); 61*9081Srrh i = getnoun(i,ce); 62*9081Srrh continue; 63*9081Srrh } 64*9081Srrh continue; 659075Srrh case ART: 669075Srrh case ADJ: 679075Srrh case POS: 689075Srrh case ING: 699075Srrh aflg=1; 709075Srrh i=getnoun(i,ce); 719075Srrh aflg=0; 729075Srrh continue; 739075Srrh case PREP: 749075Srrh if(nextc == ce){ 759075Srrh sent[i].cc=ADV; 769075Srrh goto sdone; 779075Srrh } 789075Srrh prep=1; 799075Srrh i=getnoun(++i,ce); 809075Srrh prep=0; 819075Srrh continue; 829075Srrh case VERB_ADJ: 839075Srrh if(verb==0){ 849075Srrh sent[i].cc=VERB; 859075Srrh verb=1; 869075Srrh continue; 879075Srrh } 889075Srrh case NOUN_ADJ: 899075Srrh if(be==1){ 909075Srrh sent[i].cc=ADJ; 919075Srrh continue; 929075Srrh } 939075Srrh case PRONP_ADJ: 949075Srrh case PRONS_ADJ: 959075Srrh i=getnoun(i,ce); 969075Srrh continue; 979075Srrh case NOUN_ADV: 989075Srrh if(verb == 1 && iverb == i+1){ 999075Srrh sent[i].cc = NOUN; 1009075Srrh } 1019075Srrh else { 1029075Srrh sent[i].cc = ADV; 1039075Srrh } 1049075Srrh continue; 1059075Srrh case ADJ_ADV: 1069075Srrh if(be == 1){ 107*9081Srrh if (isadj(nextc)) { 1089075Srrh sent[i].cc = ADV; 1099075Srrh continue; 1109075Srrh } 111*9081Srrh if(nextc == ',' && isadv(sent[i+2].cc)) { 1129075Srrh sent[i++].cc = ADV; 1139075Srrh sent[++i].cc = ADV; 1149075Srrh comma--; 1159075Srrh continue; 1169075Srrh } 1179075Srrh sent[i].cc = ADJ; 1189075Srrh continue; 1199075Srrh } 1209075Srrh if(lastc == NOUN && (nextc == ',' || nextc == END)){ 1219075Srrh sent[i].cc=ADJ; 1229075Srrh continue; 1239075Srrh } 124*9081Srrh if(notnoun(nextc)){ 1259075Srrh sent[i].cc=ADV; 1269075Srrh continue; 1279075Srrh } 1289075Srrh sent[i].cc=ADJ; 1299075Srrh continue; 1309075Srrh case WHO: 1319075Srrh i=who(i,ce); 1329075Srrh continue; 1339075Srrh case PRONP: 1349075Srrh subty=PLURAL; 1359075Srrh continue; 1369075Srrh case NOUN: 1379075Srrh if(nextc==NOUN){ 1389075Srrh sent[i].cc=ADJ; 1399075Srrh continue; 1409075Srrh } 1419075Srrh case PRONS: 1429075Srrh subty=SING; 1439075Srrh continue; 144*9081Srrh case PNOUN: 145*9081Srrh sent[i].cc = NOUN; 146*9081Srrh if(subty == 0)subty=PLURAL; 147*9081Srrh continue; 1489075Srrh case CONJ: 1499075Srrh if(nextc==UNK || nextc == NOUN_VERB || nextc == NV_PL){ 1509075Srrh if(lastc == ADJ)sent[++i].cc = ADJ; 1519075Srrh else sent[++i].cc = VERB; 1529075Srrh } 1539075Srrh if(nextc == ED){ 1549075Srrh sent[++i].cc = VERB; 1559075Srrh } 1569075Srrh continue; 1579075Srrh case AUXP: 1589075Srrh case AUXS: 1599075Srrh case BES: 1609075Srrh case BEP: 1619075Srrh case AUXV: 1629075Srrh case AUX: 1639075Srrh case HAS: 1649075Srrh case HAVE: 1659075Srrh case HAD: 1669075Srrh verb=getv(i,ce); 1679075Srrh continue; 1689075Srrh case ADV: 1699075Srrh case AUXX: 1709075Srrh case VERB: 1719075Srrh case BE: 1729075Srrh case INTER: 1739075Srrh continue; 1749075Srrh case THAT: 1759075Srrh if(nextc==SUBCONJ){ 1769075Srrh sent[i].cc=PRONP; 1779075Srrh goto subc; 1789075Srrh } 1799075Srrh verb=getv(i+1,ce); 1809075Srrh j = i+1; 181*9081Srrh while(isadv(sent[j].cc)) { 1829075Srrh j++; 1839075Srrh } 184*9081Srrh nextc = sent[j].cc; 185*9081Srrh if((verb==1 && iverb== j) || nextc==ED || nextc == VERB_ADJ){ 1869075Srrh sent[i].cc=PRONP; 1879075Srrh while(i+1 < j)sent[++i].cc = ADV; 1889075Srrh } 1899075Srrh else if(verb==0 && nextc==NV_PL && ((lastc==NOUN 190*9081Srrh && issing(sent[i-1].ic)) || lastc == ',')) { 1919075Srrh sent[i].cc=PRONP; 1929075Srrh subty=SING; 193*9081Srrh while(i+1 < j)sent[++i].cc = ADV; 1949075Srrh } 1959075Srrh else if(verb==0 && (nextc==UNK || nextc==NOUN_VERB) && (lastc==NOUN 1969075Srrh && sent[i-1].ic==NV_PL)){ 1979075Srrh subty=PLURAL; 1989075Srrh sent[i].cc=PRONP; 199*9081Srrh while(i+1 < j)sent[++i].cc = ADV; 2009075Srrh } 2019075Srrh else { 2029075Srrh if(i == 0)sent[i].cc=ADJ; 2039075Srrh else sent[i].cc=SUBCONJ; 2049075Srrh j=i; 2059075Srrh subty=0; 2069075Srrh i=getnoun(i+1,ce); 2079075Srrh if(done)sent[j].cc=ADJ; 2089075Srrh } 2099075Srrh continue; 2109075Srrh case ',': 2119075Srrh if(nextc != CONJ){ /*parenthetical*/ 2129075Srrh continue; 2139075Srrh } 2149075Srrh i++; 2159075Srrh comma--; 216*9081Srrh if(sent[i+1].cc == ED || sent[i+1].cc == MVERB){ 2179075Srrh sent[++i].cc = VERB; 2189075Srrh continue; 2199075Srrh } 2209075Srrh if(command == 1){ 2219075Srrh verb = getv(++i,ce); 2229075Srrh continue; 2239075Srrh } 2249075Srrh case SUBCONJ: 2259075Srrh subc: 226*9081Srrh savi = i; 2279075Srrh if(nextc==END||(lastc==',' && nextc==',')){ 2289075Srrh sent[i].cc=ADV; 2299075Srrh continue; 2309075Srrh } 2319075Srrh subty=0; 2329075Srrh ce=','; 2339075Srrh verb=getv(++i,ce); 234*9081Srrh if(sent[savi+1].cc == VERB || sent[savi+1].cc == AUXX) 235*9081Srrh if(sent[savi].cc == SUBCONJ)sent[savi].cc = ADV; 2369075Srrh i=getnoun(i,ce); 2379075Srrh continue; 2389075Srrh case PREP_ADV: 2399075Srrh if(sent[i+2].cc==PREP_ADV &&(sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB 240*9081Srrh && sent[i+1].cc != NV_PL && sent[i+1].cc != PNOUN)){ 2419075Srrh sent[i].cc=ADV; 2429075Srrh sent[i+2].cc=CONJ; 2439075Srrh continue; 2449075Srrh } 2459075Srrh sav=i++; 2469075Srrh savsub = subty; 2479075Srrh pverb=getv(i,ce); 2489075Srrh if((pverb==1 && iverb == i) || sent[i].cc== ED){ 2499075Srrh sent[sav].cc=PRONP; 2509075Srrh sent[i].cc=VERB; 2519075Srrh continue; 2529075Srrh } 2539075Srrh i=getnoun(i,ce); 2549075Srrh if(done==1){ 2559075Srrh sent[sav].cc=ADV; 2569075Srrh goto sdone; 2579075Srrh } 2589075Srrh if(pverb==1 && iverb == i+1){ 2599075Srrh sent[sav].cc=SUBCONJ; 2609075Srrh ce=','; 2619075Srrh continue; 2629075Srrh } 2639075Srrh switch(sent[i+1].cc){ 2649075Srrh case UNK: 2659075Srrh case NV_PL: 2669075Srrh case NOUN_VERB: 2679075Srrh case ED: 2689075Srrh sent[sav].cc=SUBCONJ; 2699075Srrh verb=0; 2709075Srrh ce=','; 2719075Srrh continue; 2729075Srrh default: 2739075Srrh sent[sav].cc=PREP; 2749075Srrh subty = savsub; 2759075Srrh continue; 2769075Srrh } 2779075Srrh case TO: 278*9081Srrh savi = i; 2799075Srrh sent[i++].cc=VERB; 280*9081Srrh sw: 2819075Srrh switch(nextc){ 2829075Srrh case UNK: 2839075Srrh case AUXS: 2849075Srrh case VERB_ADJ: 2859075Srrh case NOUN_VERB: 2869075Srrh case VERB: 287*9081Srrh case MVERB: 2889075Srrh sent[i].cc=VERB; 2899075Srrh continue; 2909075Srrh case HAVE: 2919075Srrh sent[i].cc = VERB; 2929075Srrh if(sent[i+1].cc == ED){ 2939075Srrh sent[++i].cc = VERB; 2949075Srrh continue; 2959075Srrh } 296*9081Srrh if(sent[i+1].cc == ADV)i++; 2979075Srrh if(sent[i+1].cc != BE)continue; 2989075Srrh i++; 2999075Srrh case BE: 3009075Srrh sent[i].cc=VERB; 301*9081Srrh if(sent[i+1].cc == ADV)i++; 3029075Srrh if(sent[i+1].cc == ED || sent[i+1].cc == ING){ 3039075Srrh sent[++i].cc = VERB; 3049075Srrh } 3059075Srrh else if(sent[i+1].cc == UNK){ 3069075Srrh sent[++i].cc = ADJ; 3079075Srrh } 3089075Srrh continue; 309*9081Srrh case ADV: 310*9081Srrh nextc = sent[++i].cc; 311*9081Srrh goto sw; 312*9081Srrh default: 313*9081Srrh sent[savi].cc = PREP; 3149075Srrh prep=1; 3159075Srrh i=getnoun(i,ce); 3169075Srrh prep=0; 3179075Srrh continue; 3189075Srrh } 3199075Srrh case NV_PL: 3209075Srrh if(subty==0){ 3219075Srrh i=getnoun(i,ce); 3229075Srrh subty=PLURAL; 3239075Srrh } 3249075Srrh else if(verb== 0){ /*need verb*/ 3259075Srrh sent[i].cc=VERB; 3269075Srrh verb=1; 3279075Srrh } 3289075Srrh else{ 3299075Srrh i=getnoun(i,ce); 3309075Srrh } 3319075Srrh continue; 3329075Srrh case UNK: 3339075Srrh case NOUN_VERB: 3349075Srrh if(verb==1){ 3359075Srrh if(be==1 && nextc != WHO){ 3369075Srrh sent[i].cc=ADJ; 3379075Srrh continue; 3389075Srrh } 3399075Srrh i=getnoun(i,ce); 3409075Srrh } 341*9081Srrh else if(nextc==NV_PL && isnoun(sent[i+2].cc)) { 3429075Srrh sent[i].cc=NOUN; 3439075Srrh if(sent[i-1].cc == NOUN){ 3449075Srrh sent[i-1].cc = ADJ; 3459075Srrh } 3469075Srrh subty=SING; 3479075Srrh continue; 3489075Srrh } 3499075Srrh else if(subty==0){ 3509075Srrh i=getnoun(i,ce); 3519075Srrh continue; 3529075Srrh } 3539075Srrh else { /* desparation */ 3549075Srrh sent[i].cc=VERB; 3559075Srrh verb=1; 3569075Srrh } 3579075Srrh continue; 3589075Srrh case ED: 3599075Srrh if(verb == 0){ 3609075Srrh sent[i].cc=VERB; 3619075Srrh verb=1; 3629075Srrh } 3639075Srrh else if(sent[i-1].cc == BE){ 3649075Srrh sent[i].cc = VERB; 3659075Srrh } 3669075Srrh else{ 3679075Srrh i=getnoun(i,ce); 3689075Srrh } 3699075Srrh continue; 370*9081Srrh default: printf("got a %c %o on %sat %d\n",sent[i].cc,sent[i].cc,sent[i].sp,i); 3719075Srrh } 3729075Srrh } 3739075Srrh sdone: 3749075Srrh if(sent[i].cc==END && sent[i].ic != ';')return(-1); 3759075Srrh else { 3769075Srrh if(sent[i].ic == ';')sent[i].cc=';'; 3779075Srrh else comma--; 3789075Srrh return(i); 3799075Srrh } 3809075Srrh } 3819075Srrh getv(si,ce) 3829075Srrh int si; 3839075Srrh char ce; 3849075Srrh { 3859075Srrh int conj; 3869075Srrh char c; 3879075Srrh int ik; 3889075Srrh must=0; 3899075Srrh bflg=0; 3909075Srrh hflg=0; 3919075Srrh verbty=0; 3929075Srrh for(j=si;((c=sent[j].cc) != ce) && (c != END); j++){ 3939075Srrh iverb=j; 3949075Srrh switch(c){ 3959075Srrh case ED: 3969075Srrh continue; 3979075Srrh case HAS: 3989075Srrh hflg=1; 3999075Srrh verbty=SING; 4009075Srrh sent[j].cc=AUXX; 4019075Srrh goto next; 4029075Srrh case HAVE: 4039075Srrh if(sent[j-1].cc==TO){ 4049075Srrh continue; 4059075Srrh } 4069075Srrh case HAD: 4079075Srrh hflg=1; 4089075Srrh verbty=PLURAL; 4099075Srrh sent[j].cc=AUXX; 4109075Srrh goto next; 4119075Srrh case BE: 4129075Srrh if(sent[j].ic != BE){ 4139075Srrh return(1); 4149075Srrh } 4159075Srrh continue; 4169075Srrh case VERB: 4179075Srrh if(sent[j-1].cc==TO){ 4189075Srrh continue; 4199075Srrh } 4209075Srrh return(1); 4219075Srrh case AUXX: 4229075Srrh return(1); 4239075Srrh case AUXP: 4249075Srrh must=1; 4259075Srrh verbty=PLURAL; 4269075Srrh sent[j].cc=AUXX; 4279075Srrh goto next; 4289075Srrh case AUXS: 4299075Srrh if(sent[j-1].cc==TO){ 4309075Srrh continue; 4319075Srrh } 4329075Srrh verbty=SING; 4339075Srrh sent[j].cc=AUXX; 4349075Srrh goto next; 4359075Srrh case AUX: 4369075Srrh case AUXV: 4379075Srrh must=1; 4389075Srrh sent[j].cc=AUXX; 4399075Srrh next: 4409075Srrh if(sent[j-1].cc == CONJ && verb == 0)conj = 0; 4419075Srrh else conj = 1; 4429075Srrh if(question==1){ 4439075Srrh j=getnoun(j+1,ce); 4449075Srrh question=0; 4459075Srrh } 4469075Srrh getv2(ce); 4479075Srrh if(sent[j].cc == AUXX){ 4489075Srrh sent[j].cc = VERB; 4499075Srrh } 4509075Srrh if((sent[j].cc!=VERB && sent[j].cc!=BE) && sent[iverb].cc==AUXX){ 4519075Srrh sent[iverb].cc=VERB; 452*9081Srrh for(ik=iverb+1;ik<=j;ik++){ 453*9081Srrh if(sent[ik].ic == NOM)sent[ik].cc=NOUN; 454*9081Srrh else sent[ik].cc=sent[ik].ic; 455*9081Srrh } 4569075Srrh } 4579075Srrh return(conj); 4589075Srrh case BES: 4599075Srrh verbty=SING; 4609075Srrh bflg=1; 4619075Srrh sent[j].cc=BE; 4629075Srrh goto next; 4639075Srrh case BEP: 4649075Srrh verbty=PLURAL; 4659075Srrh bflg=1; 4669075Srrh sent[j].cc=BE; 4679075Srrh goto next; 4689075Srrh case SUBCONJ: 4699075Srrh if(sent[j-1].cc== ',' && sent[j+1].cc == ','){ 4709075Srrh continue; 4719075Srrh } 4729075Srrh case THAT: 4739075Srrh case WHO: 4749075Srrh goto vdone; 4759075Srrh case ',': if(comma==1 && sent[j+1].cc==CONJ){ 4769075Srrh goto vdone; 4779075Srrh } 4789075Srrh } 4799075Srrh } 4809075Srrh vdone: 4819075Srrh return(0); 4829075Srrh } 4839075Srrh getv2(ce) 4849075Srrh char ce; 4859075Srrh { 4869075Srrh int vflg; 4879075Srrh char c; 4889075Srrh vflg=0; 4899075Srrh while(((c=sent[++j].cc) != ce) && (c != END)){ 4909075Srrh switch(c){ 4919075Srrh case NOUN_ADV: 4929075Srrh case ADJ_ADV: 4939075Srrh if(bflg == 0 || sent[j+1].cc == ED || sent[j+1].cc == ING){ 4949075Srrh sent[j].cc = ADV; 4959075Srrh } 4969075Srrh else{ 4979075Srrh j -= 1; 4989075Srrh return; 4999075Srrh } 5009075Srrh case ADV: 5019075Srrh continue; 5029075Srrh case SUBCONJ: 5039075Srrh if(sent[j+1].cc == ED || sent[j+1].cc == ING || sent[j+1].cc == ADV || 5049075Srrh sent[j+1].cc == ADJ_ADV)sent[j].cc = ADV; 5059075Srrh else return; 5069075Srrh continue; 5079075Srrh case VERB: 5089075Srrh return; 5099075Srrh case VERB_ADJ: 5109075Srrh case ED: 5119075Srrh sent[j].cc=VERB; 5129075Srrh return; 5139075Srrh case BE: 5149075Srrh must=0; 5159075Srrh bflg=1; 5169075Srrh continue; 5179075Srrh case ING: 5189075Srrh if(bflg == 1){ 5199075Srrh sent[j].cc = VERB; 5209075Srrh } 5219075Srrh else { 5229075Srrh j -= 1; 5239075Srrh } 5249075Srrh return; 5259075Srrh case NOUN_VERB: 5269075Srrh case UNK: 5279075Srrh if(bflg==1 || vflg==1 || hflg==1){ 5289075Srrh j -= 1; 5299075Srrh return; 5309075Srrh } 5319075Srrh sent[j].cc=VERB; 5329075Srrh return; 5339075Srrh case PRONP_ADJ: 5349075Srrh case PRONS_ADJ: 5359075Srrh c=sent[j+1].cc; 5369075Srrh if(c==ED||c==ING||c==BE||must==1){ 5379075Srrh sent[j].cc = ADV; 5389075Srrh } 5399075Srrh else{ 5409075Srrh j -= 1; 5419075Srrh return; 5429075Srrh } 5439075Srrh continue; 5449075Srrh case AUXV: 5459075Srrh case AUX: 5469075Srrh case AUXP: 5479075Srrh case AUXS: 5489075Srrh case HAD: 5499075Srrh case HAVE: 5509075Srrh case HAS: 5519075Srrh must=0; 5529075Srrh vflg=1; 5539075Srrh sent[j].cc=AUXX; 5549075Srrh continue; 5559075Srrh default: 5569075Srrh j -= 1; 5579075Srrh return; 5589075Srrh } 5599075Srrh } 5609075Srrh j -= 1; 5619075Srrh } 5629075Srrh getnoun(k,ce) 5639075Srrh int k,ce; 5649075Srrh { 5659075Srrh char c; 5669075Srrh int st,t,nextst; 5679075Srrh int rep; 5689075Srrh int t1,tt; 5699075Srrh st=k; 5709075Srrh rep=0; 5719075Srrh b: 5729075Srrh nextst=sent[st+1].cc; 5739075Srrh switch(sent[st].cc){ 5749075Srrh case END: 5759075Srrh done=1; 5769075Srrh break; 5779075Srrh case ',': 5789075Srrh if(ce==','){ 5799075Srrh done=1; 5809075Srrh break; 5819075Srrh } 5829075Srrh else { 5839075Srrh goto getdef; 5849075Srrh } 5859075Srrh case '"': 5869075Srrh if(aflg == 1){ 5879075Srrh st++; 5889075Srrh goto b; 5899075Srrh } 5909075Srrh break; 5919075Srrh case NOUN: 5929075Srrh switch(nextst){ 5939075Srrh case UNK: 5949075Srrh case NOUN_VERB: 5959075Srrh if(verb==1){ 5969075Srrh goto nn; 5979075Srrh } 5989075Srrh if(subty != PLURAL){ 5999075Srrh goto nn; 6009075Srrh } 6019075Srrh break; 6029075Srrh case NV_PL: 6039075Srrh if(verb==1){ 6049075Srrh goto nn; 6059075Srrh } 6069075Srrh if(subty == PLURAL){ 6079075Srrh goto nn; 6089075Srrh } 6099075Srrh break; 610*9081Srrh case PNOUN: 6119075Srrh case NOUN_ADJ: 6129075Srrh case POS: 6139075Srrh case NOUN: 6149075Srrh nn: 6159075Srrh sent[st].cc=ADJ; 6169075Srrh goto b; 6179075Srrh } 6189075Srrh if(prep==0)subty=SING; 6199075Srrh break; 620*9081Srrh case PNOUN: 621*9081Srrh sent[st].cc = NOUN; 622*9081Srrh if(prep == 0)subty=PLURAL; 623*9081Srrh break; 6249075Srrh case ADV: 6259075Srrh st++; 6269075Srrh goto b; 6279075Srrh case WHO: 6289075Srrh st=who(st,ce); 6299075Srrh st++; 6309075Srrh goto b; 6319075Srrh case ADJ_ADV: 6329075Srrh case VERB_ADJ: 6339075Srrh case ED: 6349075Srrh sent[st++].cc=ADJ; 6359075Srrh goto b; 6369075Srrh case ING: 637*9081Srrh if(isnoun(nextst)){ 6389075Srrh sent[st++].cc=ADJ; 6399075Srrh goto b; 6409075Srrh } 6419075Srrh sent[st].cc=NOUN; 6429075Srrh if(prep==0)subty=SING; 6439075Srrh break; 6449075Srrh case ART: 6459075Srrh case POS: 6469075Srrh if(st != k){ 6479075Srrh goto getdef; 6489075Srrh } 6499075Srrh case ADJ: 6509075Srrh st++; 6519075Srrh goto b; 6529075Srrh case PRONP: 6539075Srrh if(prep==0)subty=PLURAL; 6549075Srrh 6559075Srrh break; 6569075Srrh case PRONS: 6579075Srrh if(prep==0)subty=SING; 6589075Srrh break; 6599075Srrh case NOUN_VERB: 660*9081Srrh if((nextst==NOUN|| nextst==PNOUN)||(verb==1 && (nextst== NV_PL|| nextst==NOUN_VERB) )){ 6619075Srrh sent[st].cc=ADJ; 6629075Srrh goto b; 6639075Srrh } 6649075Srrh case NV_PL: 6659075Srrh sent[st].cc=NOUN; 6669075Srrh if(prep==0){ 6679075Srrh if(sent[st].ic==NV_PL)subty=PLURAL; 6689075Srrh else subty=SING; 6699075Srrh } 670*9081Srrh if(sent[st-1].cc == NOUN && nounnom(sent[st-1].ic)) { 6719075Srrh sent[st-1].cc = ADJ; 6729075Srrh } 6739075Srrh break; 6749075Srrh case PRONP_ADJ: 6759075Srrh switch(nextst){ 676*9081Srrh case PNOUN: 6779075Srrh case NOUN_ADJ: 6789075Srrh case NV_PL: 6799075Srrh case ADJ_ADV: 6809075Srrh case PRONS_ADJ: 6819075Srrh case ADJ: 6829075Srrh case ING: 6839075Srrh sent[st++].cc=ADJ; 6849075Srrh goto b; 6859075Srrh case NOUN_VERB: 6869075Srrh case UNK: 6879075Srrh case ED: 6889075Srrh if(verb == 0){ 6899075Srrh goto def; 6909075Srrh } 6919075Srrh else{ 6929075Srrh sent[st++].cc=ADJ; 6939075Srrh goto b; 6949075Srrh } 6959075Srrh case NOUN: 6969075Srrh sent[st++].cc=ADJ; 6979075Srrh if(prep==0)subty=SING; 6989075Srrh break; 6999075Srrh case SUBCONJ: sent[st++].cc=PRONP; /* more than .. */ 7009075Srrh sent[st++].cc=CONJ; 7019075Srrh if(verb==0)verb=getv(st,ce); 7029075Srrh goto b; 7039075Srrh case '"': 7049075Srrh sent[st++].cc = ADJ; 7059075Srrh st++; 7069075Srrh goto b; 7079075Srrh default: 7089075Srrh def: 7099075Srrh sent[st].cc=PRONP; 7109075Srrh if(prep==0)subty=PLURAL; 7119075Srrh 7129075Srrh break; 7139075Srrh } 7149075Srrh break; 7159075Srrh case PRONS_ADJ: 7169075Srrh if(aflg == 1 && nextst != END && nextst != ART){ 7179075Srrh sent[st++].cc=ADJ; 7189075Srrh goto b; 7199075Srrh } 7209075Srrh switch(nextst){ 7219075Srrh case '"': 7229075Srrh sent[st++].cc = ADJ; 7239075Srrh st++; 7249075Srrh goto b; 725*9081Srrh case PNOUN: 7269075Srrh case ING: 7279075Srrh case UNK: 7289075Srrh case NOUN_VERB: 7299075Srrh case NOUN_ADJ: 7309075Srrh case ADJ_ADV: 7319075Srrh case ADJ: 7329075Srrh sent[st++].cc=ADJ; 7339075Srrh goto b; 7349075Srrh case NOUN: 7359075Srrh sent[st++].cc=ADJ; 7369075Srrh if(prep==0)subty=SING; 7379075Srrh break; 7389075Srrh case PRONS_ADJ: 7399075Srrh sent[st++].cc=ADJ; 7409075Srrh sent[st].cc=PRONP; 7419075Srrh if(prep==0)subty=SING; 7429075Srrh break; 7439075Srrh case NV_PL: 7449075Srrh if(verb==1){ 7459075Srrh sent[st++].cc=ADJ; 7469075Srrh sent[st].cc=NOUN; 7479075Srrh if(prep==0)subty=PLURAL; 7489075Srrh 7499075Srrh break; 7509075Srrh } 7519075Srrh sent[st].cc=PRONP; 7529075Srrh if(prep==0)subty=SING; 7539075Srrh break; 7549075Srrh default: 7559075Srrh sent[st].cc=PRONP; 7569075Srrh if(prep==0)subty=SING; 7579075Srrh 7589075Srrh break; 7599075Srrh } 7609075Srrh break; 7619075Srrh case NOUN_ADJ: 762*9081Srrh if(nextst==NOUN||nextst==ADJ||nextst == NOUN_ADJ||nextst==PRONS_ADJ||nextst==PRONP_ADJ||nextst==PNOUN){ 7639075Srrh sent[st++].cc=ADJ; 7649075Srrh goto b; 7659075Srrh } 7669075Srrh if(nextst!=UNK && nextst != NOUN_VERB && nextst != NV_PL){ 7679075Srrh sent[st].cc=NOUN; 7689075Srrh if(prep==0)subty=SING; 7699075Srrh break; 7709075Srrh } 7719075Srrh if(verb==1 || sent[st+2].cc==ED){ 7729075Srrh sent[st++].cc=ADJ; 7739075Srrh goto b; 7749075Srrh } 7759075Srrh sent[st].cc=NOUN; 7769075Srrh if(prep==0)subty=SING; 7779075Srrh break; 778*9081Srrh case UNK: 7799075Srrh if(nextst != UNK){ 7809075Srrh if(nextst == ',' && rep==0){ 7819075Srrh c=sent[st+2].cc; 782*9081Srrh if((c==UNK||c==ADJ||c==NOUN_ADJ||c==ING) && isnoun(sent[st+3].cc)){ 7839075Srrh comma--; 7849075Srrh sent[st].cc=ADJ; 7859075Srrh sent[st+2].cc=ADJ; 7869075Srrh sent[st+3].cc=NOUN; 7879075Srrh if(prep==0){ 7889075Srrh if(sent[st+3].ic==NV_PL)subty=PLURAL; 7899075Srrh else subty=SING; 7909075Srrh } 7919075Srrh return(st+3); 7929075Srrh } 7939075Srrh else { 7949075Srrh sent[st].cc=NOUN; 7959075Srrh if(prep==0)subty=SING; 7969075Srrh break; 7979075Srrh } 7989075Srrh } 7999075Srrh if(nextst==NOUN||nextst==ING ||nextst==NOUN_ADJ|| sent[st-1].cc==ADV 800*9081Srrh || nextst==ADJ || nextst==PNOUN){ 8019075Srrh sent[st++].cc=ADJ; 8029075Srrh goto b; 8039075Srrh } 8049075Srrh if((nextst==NV_PL || nextst==NOUN_VERB) &&(verb==1 ||(verb==0 && (sent[st+2].cc==UNK 8059075Srrh || sent[st+2].cc==NOUN_VERB || sent[st+2].cc==ED||sent[st+2].cc==VERB_ADJ)))){ 8069075Srrh sent[st++].cc=ADJ; 8079075Srrh sent[st].cc=NOUN; 8089075Srrh if(prep == 0)subty=PLURAL; 8099075Srrh break; 8109075Srrh } 811*9081Srrh if(nextst == CONJ && isadv(sent[st+2].cc)){ 8129075Srrh sent[st].cc=ADJ; 8139075Srrh goto b; 8149075Srrh } 8159075Srrh sent[st].cc=NOUN; 8169075Srrh if(prep==0)subty=SING; 8179075Srrh 8189075Srrh break; 8199075Srrh } 8209075Srrh for(t=st+1;sent[t].cc== UNK;t++); 8219075Srrh if(verb==0 && prep == 0){ /* UUU. */ 8229075Srrh if(prep==0)subty=SING; 823*9081Srrh if(sent[t].cc==NV_PL|| sent[t].cc == PNOUN){ /* UUZ.*/ 8249075Srrh if(sent[t+1].cc==UNK || sent[t+1].cc==NOUN_VERB){ /* UUZU */ 8259075Srrh sent[t+1].cc=VERB; 8269075Srrh verb=1; 8279075Srrh sent[t].cc=NOUN; 8289075Srrh t1=t; 8299075Srrh } 830*9081Srrh else if(sent[t].cc == NV_PL){ /* UUZ. */ 8319075Srrh sent[t].cc=VERB; 8329075Srrh verb=1; 8339075Srrh sent[t-1].cc=NOUN; 8349075Srrh t1=t-1; 8359075Srrh } 836*9081Srrh else { 837*9081Srrh sent[t].cc = NOUN; 838*9081Srrh t1 = t; 839*9081Srrh } 8409075Srrh } 8419075Srrh else{ /* UU. */ 8429075Srrh if(sent[t].cc!= ED){ 8439075Srrh sent[t-1].cc=VERB; 8449075Srrh verb=1; 8459075Srrh sent[t-2].cc=NOUN; 8469075Srrh t1=t-2; 8479075Srrh t--; 8489075Srrh } 8499075Srrh else { 8509075Srrh sent[--t].cc=NOUN; 8519075Srrh t1=t; 8529075Srrh } 8539075Srrh } 8549075Srrh } 8559075Srrh else{ 856*9081Srrh if(sent[t].cc==NOUN_VERB|| sent[t].cc==NOUN|| sent[t].cc==NV_PL|| sent[t].cc==PNOUN){ 8579075Srrh sent[t].cc=NOUN; 8589075Srrh if(prep==0)subty=PLURAL; 8599075Srrh t1=t; 8609075Srrh } 8619075Srrh else{ 8629075Srrh sent[--t].cc=NOUN; 8639075Srrh if(prep==0)subty=SING; 8649075Srrh t1=t; 8659075Srrh } 8669075Srrh } 8679075Srrh for(tt=st;tt<t1;tt++)sent[tt].cc=ADJ; 8689075Srrh st=t; 8699075Srrh break; 8709075Srrh } 8719075Srrh getdef: 8729075Srrh if(sent[st].cc == CONJ && sent[st-1].cc == ADJ){ 8739075Srrh st++; 8749075Srrh goto b; 8759075Srrh } 8769075Srrh if(sent[st-1].cc==PREP && ( sent[st].cc == THAT || sent[st].cc == SUBCONJ)){ 8779075Srrh prep=0; 8789075Srrh return(--st); 8799075Srrh } 8809075Srrh if(sent[st].cc != NOUN && sent[st].cc != PRONP && sent[st].cc != PRONS){ 8819075Srrh st--; 8829075Srrh if(sent[st].cc==ADJ && sent[st].ic==ING){ 8839075Srrh sent[st].cc=NOUN; 8849075Srrh if(prep==0)subty=SING; 8859075Srrh } 8869075Srrh else if(sent[st].cc == PREP){ 8879075Srrh sent[st].cc = ADV; 8889075Srrh } 8899075Srrh prep=0; 8909075Srrh return(st); 8919075Srrh } 8929075Srrh if(done==1){ 8939075Srrh prep=0; 8949075Srrh return(st); 8959075Srrh } 8969075Srrh if(sent[st+1].cc== ','){ 8979075Srrh if(sent[st+2].cc==CONJ){ 8989075Srrh if(rep==0){ 8999075Srrh prep=0; 9009075Srrh return(st); 9019075Srrh } 9029075Srrh else{ 9039075Srrh st+=3; 9049075Srrh comma--; 9059075Srrh if(prep==0)subty=PLURAL; 9069075Srrh prep=1; 9079075Srrh goto b; 9089075Srrh } 9099075Srrh } 9109075Srrh if(comma==1){ 9119075Srrh prep=0; 9129075Srrh return(st); 9139075Srrh } 9149075Srrh 9159075Srrh switch(sent[st+2].cc){ 9169075Srrh case PREP: 9179075Srrh case SUBCONJ: 918*9081Srrh case PRONS: 919*9081Srrh case PRONP: 9209075Srrh prep=0; 9219075Srrh return(st); 9229075Srrh default: rep++; 9239075Srrh comma--; 9249075Srrh st+=2; 9259075Srrh if(prep==0)subty=PLURAL; 9269075Srrh prep=1; 9279075Srrh goto b; 9289075Srrh } 9299075Srrh } 9309075Srrh if(sent[st+1].cc==CONJ && sent[st+2].cc != ED){ 9319075Srrh st+=2; 9329075Srrh if(prep==0)subty=PLURAL; 9339075Srrh prep=1; 9349075Srrh goto b; 9359075Srrh } 9369075Srrh prep=0; 9379075Srrh return(st); 9389075Srrh } 9399075Srrh who(kk,ce) 9409075Srrh int kk,ce; 9419075Srrh { 9429075Srrh char c; 9439075Srrh sent[kk].cc=PRONP; 9449075Srrh c=sent[kk+1].cc; 945*9081Srrh while(isadv(c)){ 9469075Srrh sent[++kk].cc = ADV; 9479075Srrh c = sent[kk+1].cc; 9489075Srrh } 949*9081Srrh if(c==UNK||c==NOUN_VERB||c==VERB_ADJ||c==ED|| c==NV_PL||c==MVERB){ 9509075Srrh sent[++kk].cc=VERB; 9519075Srrh if(verb == 0)verb = getv(kk+1,ce); 9529075Srrh return(kk); 9539075Srrh } 9549075Srrh w: switch(sent[++kk].cc){ 9559075Srrh case AUXX: 9569075Srrh case ADV: 9579075Srrh case BE: 9589075Srrh case VERB: 9599075Srrh goto w; 9609075Srrh default: 9619075Srrh verb=getv(kk,ce); 9629075Srrh return(--kk); 9639075Srrh } 9649075Srrh } 965