1*48247Sbostic /*- 2*48247Sbostic * %sccs.include.proprietary.c% 3*48247Sbostic */ 4*48247Sbostic 59075Srrh #ifndef lint 6*48247Sbostic static char sccsid[] = "@(#)pscan.c 4.3 (Berkeley) 04/17/91"; 7*48247Sbostic #endif /* not lint */ 89075Srrh 99075Srrh #include "names.h" 109075Srrh #include "conp.h" 119081Srrh #define isadv(c) (c == ADV || c == ADJ_ADV) 129081Srrh #define isadj(c) (c == ADJ || c == NOUN_ADJ || c == ADJ_ADV || c == UNK) 139081Srrh #define notnoun(c) (c != NOUN && c != UNK && c != NOUN_VERB && c != NV_PL && c != PNOUN) 149081Srrh #define issing(c) (c == UNK || c == NOUN_VERB || c == NOUN || c == NOM || c == NOUN_ADJ) 159081Srrh #define isnoun(c) (c == NOUN || c == NOUN_VERB || c == NV_PL || c == UNK || c == PNOUN) 169081Srrh #define nounnom(c) (c == NOUN || c == NOM) 179075Srrh char lastc,nextc; 189075Srrh int savsub; 199075Srrh scan(si,ce,command) /*scan a phrase */ 209075Srrh int si; 219075Srrh char ce; 229075Srrh { 239081Srrh int savi; 249075Srrh char c; 259075Srrh i=si; 269075Srrh if(command == 1)subty = PLURAL; 279075Srrh else subty = 0; 289075Srrh if(sent[i].cc==ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK && sent[i+1].cc != ADJ) 299075Srrh sent[i++].cc = ADV; 309075Srrh done=0; 319075Srrh verb = 0; 329075Srrh verb=getv(i,ce); /*get verb if obvious*/ 339075Srrh if(command == 0)j=getnoun(i,ce); /*get subject*/ 349075Srrh else j = si; 359075Srrh if(i != j || ((i==j) && sent[i].cc == NOUN)){ 369075Srrh i = j+1; 379075Srrh } 389075Srrh for(;((c=sent[i].cc) != ce) && (c != END) && (c != '\0');i++){ 399075Srrh nextc=sent[i+1].cc; 409075Srrh if(i>0){ 419075Srrh lastc=sent[i-1].cc; 429075Srrh if(lastc==BE)be=1; 439075Srrh else{ 449075Srrh if(lastc != ADV)be=0; 459075Srrh } 469075Srrh } 479075Srrh else lastc=0; 489075Srrh if(verb==1)question=0; 499075Srrh switch(c){ 509075Srrh case '"': 519081Srrh if(nextc==ED || nextc == MVERB){ 529075Srrh verb=1; 539075Srrh sent[++i].cc=VERB; 549075Srrh subty=SING; 559075Srrh continue; 569075Srrh } 579075Srrh subty=0; 589075Srrh verb=getv(++i,ce); 599075Srrh i=getnoun(i,ce); 609075Srrh continue; 619081Srrh case MVERB: 629081Srrh sent[i].cc = VERB; 639081Srrh if(i < nsleng*.5){ 649081Srrh verb = getv(++i,ce); 659081Srrh i = getnoun(i,ce); 669081Srrh continue; 679081Srrh } 689081Srrh continue; 699075Srrh case ART: 709075Srrh case ADJ: 719075Srrh case POS: 729075Srrh case ING: 739075Srrh aflg=1; 749075Srrh i=getnoun(i,ce); 759075Srrh aflg=0; 769075Srrh continue; 779075Srrh case PREP: 789075Srrh if(nextc == ce){ 799075Srrh sent[i].cc=ADV; 809075Srrh goto sdone; 819075Srrh } 829075Srrh prep=1; 839075Srrh i=getnoun(++i,ce); 849075Srrh prep=0; 859075Srrh continue; 869075Srrh case VERB_ADJ: 879075Srrh if(verb==0){ 889075Srrh sent[i].cc=VERB; 899075Srrh verb=1; 909075Srrh continue; 919075Srrh } 929075Srrh case NOUN_ADJ: 939075Srrh if(be==1){ 949075Srrh sent[i].cc=ADJ; 959075Srrh continue; 969075Srrh } 979075Srrh case PRONP_ADJ: 989075Srrh case PRONS_ADJ: 999075Srrh i=getnoun(i,ce); 1009075Srrh continue; 1019075Srrh case NOUN_ADV: 1029075Srrh if(verb == 1 && iverb == i+1){ 1039075Srrh sent[i].cc = NOUN; 1049075Srrh } 1059075Srrh else { 1069075Srrh sent[i].cc = ADV; 1079075Srrh } 1089075Srrh continue; 1099075Srrh case ADJ_ADV: 1109075Srrh if(be == 1){ 1119081Srrh if (isadj(nextc)) { 1129075Srrh sent[i].cc = ADV; 1139075Srrh continue; 1149075Srrh } 1159081Srrh if(nextc == ',' && isadv(sent[i+2].cc)) { 1169075Srrh sent[i++].cc = ADV; 1179075Srrh sent[++i].cc = ADV; 1189075Srrh comma--; 1199075Srrh continue; 1209075Srrh } 1219075Srrh sent[i].cc = ADJ; 1229075Srrh continue; 1239075Srrh } 1249075Srrh if(lastc == NOUN && (nextc == ',' || nextc == END)){ 1259075Srrh sent[i].cc=ADJ; 1269075Srrh continue; 1279075Srrh } 1289081Srrh if(notnoun(nextc)){ 1299075Srrh sent[i].cc=ADV; 1309075Srrh continue; 1319075Srrh } 1329075Srrh sent[i].cc=ADJ; 1339075Srrh continue; 1349075Srrh case WHO: 1359075Srrh i=who(i,ce); 1369075Srrh continue; 1379075Srrh case PRONP: 1389075Srrh subty=PLURAL; 1399075Srrh continue; 1409075Srrh case NOUN: 1419075Srrh if(nextc==NOUN){ 1429075Srrh sent[i].cc=ADJ; 1439075Srrh continue; 1449075Srrh } 1459075Srrh case PRONS: 1469075Srrh subty=SING; 1479075Srrh continue; 1489081Srrh case PNOUN: 1499081Srrh sent[i].cc = NOUN; 1509081Srrh if(subty == 0)subty=PLURAL; 1519081Srrh continue; 1529075Srrh case CONJ: 1539075Srrh if(nextc==UNK || nextc == NOUN_VERB || nextc == NV_PL){ 1549075Srrh if(lastc == ADJ)sent[++i].cc = ADJ; 1559075Srrh else sent[++i].cc = VERB; 1569075Srrh } 1579075Srrh if(nextc == ED){ 1589075Srrh sent[++i].cc = VERB; 1599075Srrh } 1609075Srrh continue; 1619075Srrh case AUXP: 1629075Srrh case AUXS: 1639075Srrh case BES: 1649075Srrh case BEP: 1659075Srrh case AUXV: 1669075Srrh case AUX: 1679075Srrh case HAS: 1689075Srrh case HAVE: 1699075Srrh case HAD: 1709075Srrh verb=getv(i,ce); 1719075Srrh continue; 1729075Srrh case ADV: 1739075Srrh case AUXX: 1749075Srrh case VERB: 1759075Srrh case BE: 1769075Srrh case INTER: 1779075Srrh continue; 1789075Srrh case THAT: 1799075Srrh if(nextc==SUBCONJ){ 1809075Srrh sent[i].cc=PRONP; 1819075Srrh goto subc; 1829075Srrh } 1839075Srrh verb=getv(i+1,ce); 1849075Srrh j = i+1; 1859081Srrh while(isadv(sent[j].cc)) { 1869075Srrh j++; 1879075Srrh } 1889081Srrh nextc = sent[j].cc; 1899081Srrh if((verb==1 && iverb== j) || nextc==ED || nextc == VERB_ADJ){ 1909075Srrh sent[i].cc=PRONP; 1919075Srrh while(i+1 < j)sent[++i].cc = ADV; 1929075Srrh } 1939075Srrh else if(verb==0 && nextc==NV_PL && ((lastc==NOUN 1949081Srrh && issing(sent[i-1].ic)) || lastc == ',')) { 1959075Srrh sent[i].cc=PRONP; 1969075Srrh subty=SING; 1979081Srrh while(i+1 < j)sent[++i].cc = ADV; 1989075Srrh } 1999075Srrh else if(verb==0 && (nextc==UNK || nextc==NOUN_VERB) && (lastc==NOUN 2009075Srrh && sent[i-1].ic==NV_PL)){ 2019075Srrh subty=PLURAL; 2029075Srrh sent[i].cc=PRONP; 2039081Srrh while(i+1 < j)sent[++i].cc = ADV; 2049075Srrh } 2059075Srrh else { 2069075Srrh if(i == 0)sent[i].cc=ADJ; 2079075Srrh else sent[i].cc=SUBCONJ; 2089075Srrh j=i; 2099075Srrh subty=0; 2109075Srrh i=getnoun(i+1,ce); 2119075Srrh if(done)sent[j].cc=ADJ; 2129075Srrh } 2139075Srrh continue; 2149075Srrh case ',': 2159075Srrh if(nextc != CONJ){ /*parenthetical*/ 2169075Srrh continue; 2179075Srrh } 2189075Srrh i++; 2199075Srrh comma--; 2209081Srrh if(sent[i+1].cc == ED || sent[i+1].cc == MVERB){ 2219075Srrh sent[++i].cc = VERB; 2229075Srrh continue; 2239075Srrh } 2249075Srrh if(command == 1){ 2259075Srrh verb = getv(++i,ce); 2269075Srrh continue; 2279075Srrh } 2289075Srrh case SUBCONJ: 2299075Srrh subc: 2309081Srrh savi = i; 2319075Srrh if(nextc==END||(lastc==',' && nextc==',')){ 2329075Srrh sent[i].cc=ADV; 2339075Srrh continue; 2349075Srrh } 2359075Srrh subty=0; 2369075Srrh ce=','; 2379075Srrh verb=getv(++i,ce); 2389081Srrh if(sent[savi+1].cc == VERB || sent[savi+1].cc == AUXX) 2399081Srrh if(sent[savi].cc == SUBCONJ)sent[savi].cc = ADV; 2409075Srrh i=getnoun(i,ce); 2419075Srrh continue; 2429075Srrh case PREP_ADV: 2439075Srrh if(sent[i+2].cc==PREP_ADV &&(sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB 2449081Srrh && sent[i+1].cc != NV_PL && sent[i+1].cc != PNOUN)){ 2459075Srrh sent[i].cc=ADV; 2469075Srrh sent[i+2].cc=CONJ; 2479075Srrh continue; 2489075Srrh } 2499075Srrh sav=i++; 2509075Srrh savsub = subty; 2519075Srrh pverb=getv(i,ce); 2529075Srrh if((pverb==1 && iverb == i) || sent[i].cc== ED){ 2539075Srrh sent[sav].cc=PRONP; 2549075Srrh sent[i].cc=VERB; 2559075Srrh continue; 2569075Srrh } 2579075Srrh i=getnoun(i,ce); 2589075Srrh if(done==1){ 2599075Srrh sent[sav].cc=ADV; 2609075Srrh goto sdone; 2619075Srrh } 2629075Srrh if(pverb==1 && iverb == i+1){ 2639075Srrh sent[sav].cc=SUBCONJ; 2649075Srrh ce=','; 2659075Srrh continue; 2669075Srrh } 2679075Srrh switch(sent[i+1].cc){ 2689075Srrh case UNK: 2699075Srrh case NV_PL: 2709075Srrh case NOUN_VERB: 2719075Srrh case ED: 2729075Srrh sent[sav].cc=SUBCONJ; 2739075Srrh verb=0; 2749075Srrh ce=','; 2759075Srrh continue; 2769075Srrh default: 2779075Srrh sent[sav].cc=PREP; 2789075Srrh subty = savsub; 2799075Srrh continue; 2809075Srrh } 2819075Srrh case TO: 2829081Srrh savi = i; 2839075Srrh sent[i++].cc=VERB; 2849081Srrh sw: 2859075Srrh switch(nextc){ 2869075Srrh case UNK: 2879075Srrh case AUXS: 2889075Srrh case VERB_ADJ: 2899075Srrh case NOUN_VERB: 2909075Srrh case VERB: 2919081Srrh case MVERB: 2929075Srrh sent[i].cc=VERB; 2939075Srrh continue; 2949075Srrh case HAVE: 2959075Srrh sent[i].cc = VERB; 2969075Srrh if(sent[i+1].cc == ED){ 2979075Srrh sent[++i].cc = VERB; 2989075Srrh continue; 2999075Srrh } 3009081Srrh if(sent[i+1].cc == ADV)i++; 3019075Srrh if(sent[i+1].cc != BE)continue; 3029075Srrh i++; 3039075Srrh case BE: 3049075Srrh sent[i].cc=VERB; 3059081Srrh if(sent[i+1].cc == ADV)i++; 3069075Srrh if(sent[i+1].cc == ED || sent[i+1].cc == ING){ 3079075Srrh sent[++i].cc = VERB; 3089075Srrh } 3099075Srrh else if(sent[i+1].cc == UNK){ 3109075Srrh sent[++i].cc = ADJ; 3119075Srrh } 3129075Srrh continue; 3139081Srrh case ADV: 3149081Srrh nextc = sent[++i].cc; 3159081Srrh goto sw; 3169081Srrh default: 3179081Srrh sent[savi].cc = PREP; 3189075Srrh prep=1; 3199075Srrh i=getnoun(i,ce); 3209075Srrh prep=0; 3219075Srrh continue; 3229075Srrh } 3239075Srrh case NV_PL: 3249075Srrh if(subty==0){ 3259075Srrh i=getnoun(i,ce); 3269075Srrh subty=PLURAL; 3279075Srrh } 3289075Srrh else if(verb== 0){ /*need verb*/ 3299075Srrh sent[i].cc=VERB; 3309075Srrh verb=1; 3319075Srrh } 3329075Srrh else{ 3339075Srrh i=getnoun(i,ce); 3349075Srrh } 3359075Srrh continue; 3369075Srrh case UNK: 3379075Srrh case NOUN_VERB: 3389075Srrh if(verb==1){ 3399075Srrh if(be==1 && nextc != WHO){ 3409075Srrh sent[i].cc=ADJ; 3419075Srrh continue; 3429075Srrh } 3439075Srrh i=getnoun(i,ce); 3449075Srrh } 3459081Srrh else if(nextc==NV_PL && isnoun(sent[i+2].cc)) { 3469075Srrh sent[i].cc=NOUN; 3479075Srrh if(sent[i-1].cc == NOUN){ 3489075Srrh sent[i-1].cc = ADJ; 3499075Srrh } 3509075Srrh subty=SING; 3519075Srrh continue; 3529075Srrh } 3539075Srrh else if(subty==0){ 3549075Srrh i=getnoun(i,ce); 3559075Srrh continue; 3569075Srrh } 3579075Srrh else { /* desparation */ 3589075Srrh sent[i].cc=VERB; 3599075Srrh verb=1; 3609075Srrh } 3619075Srrh continue; 3629075Srrh case ED: 3639075Srrh if(verb == 0){ 3649075Srrh sent[i].cc=VERB; 3659075Srrh verb=1; 3669075Srrh } 3679075Srrh else if(sent[i-1].cc == BE){ 3689075Srrh sent[i].cc = VERB; 3699075Srrh } 3709075Srrh else{ 3719075Srrh i=getnoun(i,ce); 3729075Srrh } 3739075Srrh continue; 3749081Srrh default: printf("got a %c %o on %sat %d\n",sent[i].cc,sent[i].cc,sent[i].sp,i); 3759075Srrh } 3769075Srrh } 3779075Srrh sdone: 3789075Srrh if(sent[i].cc==END && sent[i].ic != ';')return(-1); 3799075Srrh else { 3809075Srrh if(sent[i].ic == ';')sent[i].cc=';'; 3819075Srrh else comma--; 3829075Srrh return(i); 3839075Srrh } 3849075Srrh } 3859075Srrh getv(si,ce) 3869075Srrh int si; 3879075Srrh char ce; 3889075Srrh { 3899075Srrh int conj; 3909075Srrh char c; 3919075Srrh int ik; 3929075Srrh must=0; 3939075Srrh bflg=0; 3949075Srrh hflg=0; 3959075Srrh verbty=0; 3969075Srrh for(j=si;((c=sent[j].cc) != ce) && (c != END); j++){ 3979075Srrh iverb=j; 3989075Srrh switch(c){ 3999075Srrh case ED: 4009075Srrh continue; 4019075Srrh case HAS: 4029075Srrh hflg=1; 4039075Srrh verbty=SING; 4049075Srrh sent[j].cc=AUXX; 4059075Srrh goto next; 4069075Srrh case HAVE: 4079075Srrh if(sent[j-1].cc==TO){ 4089075Srrh continue; 4099075Srrh } 4109075Srrh case HAD: 4119075Srrh hflg=1; 4129075Srrh verbty=PLURAL; 4139075Srrh sent[j].cc=AUXX; 4149075Srrh goto next; 4159075Srrh case BE: 4169075Srrh if(sent[j].ic != BE){ 4179075Srrh return(1); 4189075Srrh } 4199075Srrh continue; 4209075Srrh case VERB: 4219075Srrh if(sent[j-1].cc==TO){ 4229075Srrh continue; 4239075Srrh } 4249075Srrh return(1); 4259075Srrh case AUXX: 4269075Srrh return(1); 4279075Srrh case AUXP: 4289075Srrh must=1; 4299075Srrh verbty=PLURAL; 4309075Srrh sent[j].cc=AUXX; 4319075Srrh goto next; 4329075Srrh case AUXS: 4339075Srrh if(sent[j-1].cc==TO){ 4349075Srrh continue; 4359075Srrh } 4369075Srrh verbty=SING; 4379075Srrh sent[j].cc=AUXX; 4389075Srrh goto next; 4399075Srrh case AUX: 4409075Srrh case AUXV: 4419075Srrh must=1; 4429075Srrh sent[j].cc=AUXX; 4439075Srrh next: 4449075Srrh if(sent[j-1].cc == CONJ && verb == 0)conj = 0; 4459075Srrh else conj = 1; 4469075Srrh if(question==1){ 4479075Srrh j=getnoun(j+1,ce); 4489075Srrh question=0; 4499075Srrh } 4509075Srrh getv2(ce); 4519075Srrh if(sent[j].cc == AUXX){ 4529075Srrh sent[j].cc = VERB; 4539075Srrh } 4549075Srrh if((sent[j].cc!=VERB && sent[j].cc!=BE) && sent[iverb].cc==AUXX){ 4559075Srrh sent[iverb].cc=VERB; 4569081Srrh for(ik=iverb+1;ik<=j;ik++){ 4579081Srrh if(sent[ik].ic == NOM)sent[ik].cc=NOUN; 4589081Srrh else sent[ik].cc=sent[ik].ic; 4599081Srrh } 4609075Srrh } 4619075Srrh return(conj); 4629075Srrh case BES: 4639075Srrh verbty=SING; 4649075Srrh bflg=1; 4659075Srrh sent[j].cc=BE; 4669075Srrh goto next; 4679075Srrh case BEP: 4689075Srrh verbty=PLURAL; 4699075Srrh bflg=1; 4709075Srrh sent[j].cc=BE; 4719075Srrh goto next; 4729075Srrh case SUBCONJ: 4739075Srrh if(sent[j-1].cc== ',' && sent[j+1].cc == ','){ 4749075Srrh continue; 4759075Srrh } 4769075Srrh case THAT: 4779075Srrh case WHO: 4789075Srrh goto vdone; 4799075Srrh case ',': if(comma==1 && sent[j+1].cc==CONJ){ 4809075Srrh goto vdone; 4819075Srrh } 4829075Srrh } 4839075Srrh } 4849075Srrh vdone: 4859075Srrh return(0); 4869075Srrh } 4879075Srrh getv2(ce) 4889075Srrh char ce; 4899075Srrh { 4909075Srrh int vflg; 4919075Srrh char c; 4929075Srrh vflg=0; 4939075Srrh while(((c=sent[++j].cc) != ce) && (c != END)){ 4949075Srrh switch(c){ 4959075Srrh case NOUN_ADV: 4969075Srrh case ADJ_ADV: 4979075Srrh if(bflg == 0 || sent[j+1].cc == ED || sent[j+1].cc == ING){ 4989075Srrh sent[j].cc = ADV; 4999075Srrh } 5009075Srrh else{ 5019075Srrh j -= 1; 5029075Srrh return; 5039075Srrh } 5049075Srrh case ADV: 5059075Srrh continue; 5069075Srrh case SUBCONJ: 5079075Srrh if(sent[j+1].cc == ED || sent[j+1].cc == ING || sent[j+1].cc == ADV || 5089075Srrh sent[j+1].cc == ADJ_ADV)sent[j].cc = ADV; 5099075Srrh else return; 5109075Srrh continue; 5119075Srrh case VERB: 5129075Srrh return; 5139075Srrh case VERB_ADJ: 5149075Srrh case ED: 5159075Srrh sent[j].cc=VERB; 5169075Srrh return; 5179075Srrh case BE: 5189075Srrh must=0; 5199075Srrh bflg=1; 5209075Srrh continue; 5219075Srrh case ING: 5229075Srrh if(bflg == 1){ 5239075Srrh sent[j].cc = VERB; 5249075Srrh } 5259075Srrh else { 5269075Srrh j -= 1; 5279075Srrh } 5289075Srrh return; 5299075Srrh case NOUN_VERB: 5309075Srrh case UNK: 5319075Srrh if(bflg==1 || vflg==1 || hflg==1){ 5329075Srrh j -= 1; 5339075Srrh return; 5349075Srrh } 5359075Srrh sent[j].cc=VERB; 5369075Srrh return; 5379075Srrh case PRONP_ADJ: 5389075Srrh case PRONS_ADJ: 5399075Srrh c=sent[j+1].cc; 5409075Srrh if(c==ED||c==ING||c==BE||must==1){ 5419075Srrh sent[j].cc = ADV; 5429075Srrh } 5439075Srrh else{ 5449075Srrh j -= 1; 5459075Srrh return; 5469075Srrh } 5479075Srrh continue; 5489075Srrh case AUXV: 5499075Srrh case AUX: 5509075Srrh case AUXP: 5519075Srrh case AUXS: 5529075Srrh case HAD: 5539075Srrh case HAVE: 5549075Srrh case HAS: 5559075Srrh must=0; 5569075Srrh vflg=1; 5579075Srrh sent[j].cc=AUXX; 5589075Srrh continue; 5599075Srrh default: 5609075Srrh j -= 1; 5619075Srrh return; 5629075Srrh } 5639075Srrh } 5649075Srrh j -= 1; 5659075Srrh } 5669075Srrh getnoun(k,ce) 5679075Srrh int k,ce; 5689075Srrh { 5699075Srrh char c; 5709075Srrh int st,t,nextst; 5719075Srrh int rep; 5729075Srrh int t1,tt; 5739075Srrh st=k; 5749075Srrh rep=0; 5759075Srrh b: 5769075Srrh nextst=sent[st+1].cc; 5779075Srrh switch(sent[st].cc){ 5789075Srrh case END: 5799075Srrh done=1; 5809075Srrh break; 5819075Srrh case ',': 5829075Srrh if(ce==','){ 5839075Srrh done=1; 5849075Srrh break; 5859075Srrh } 5869075Srrh else { 5879075Srrh goto getdef; 5889075Srrh } 5899075Srrh case '"': 5909075Srrh if(aflg == 1){ 5919075Srrh st++; 5929075Srrh goto b; 5939075Srrh } 5949075Srrh break; 5959075Srrh case NOUN: 5969075Srrh switch(nextst){ 5979075Srrh case UNK: 5989075Srrh case NOUN_VERB: 5999075Srrh if(verb==1){ 6009075Srrh goto nn; 6019075Srrh } 6029075Srrh if(subty != PLURAL){ 6039075Srrh goto nn; 6049075Srrh } 6059075Srrh break; 6069075Srrh case NV_PL: 6079075Srrh if(verb==1){ 6089075Srrh goto nn; 6099075Srrh } 6109075Srrh if(subty == PLURAL){ 6119075Srrh goto nn; 6129075Srrh } 6139075Srrh break; 6149081Srrh case PNOUN: 6159075Srrh case NOUN_ADJ: 6169075Srrh case POS: 6179075Srrh case NOUN: 6189075Srrh nn: 6199075Srrh sent[st].cc=ADJ; 6209075Srrh goto b; 6219075Srrh } 6229075Srrh if(prep==0)subty=SING; 6239075Srrh break; 6249081Srrh case PNOUN: 6259081Srrh sent[st].cc = NOUN; 6269081Srrh if(prep == 0)subty=PLURAL; 6279081Srrh break; 6289075Srrh case ADV: 6299075Srrh st++; 6309075Srrh goto b; 6319075Srrh case WHO: 6329075Srrh st=who(st,ce); 6339075Srrh st++; 6349075Srrh goto b; 6359075Srrh case ADJ_ADV: 6369075Srrh case VERB_ADJ: 6379075Srrh case ED: 6389075Srrh sent[st++].cc=ADJ; 6399075Srrh goto b; 6409075Srrh case ING: 6419081Srrh if(isnoun(nextst)){ 6429075Srrh sent[st++].cc=ADJ; 6439075Srrh goto b; 6449075Srrh } 6459075Srrh sent[st].cc=NOUN; 6469075Srrh if(prep==0)subty=SING; 6479075Srrh break; 6489075Srrh case ART: 6499075Srrh case POS: 6509075Srrh if(st != k){ 6519075Srrh goto getdef; 6529075Srrh } 6539075Srrh case ADJ: 6549075Srrh st++; 6559075Srrh goto b; 6569075Srrh case PRONP: 6579075Srrh if(prep==0)subty=PLURAL; 6589075Srrh 6599075Srrh break; 6609075Srrh case PRONS: 6619075Srrh if(prep==0)subty=SING; 6629075Srrh break; 6639075Srrh case NOUN_VERB: 6649081Srrh if((nextst==NOUN|| nextst==PNOUN)||(verb==1 && (nextst== NV_PL|| nextst==NOUN_VERB) )){ 6659075Srrh sent[st].cc=ADJ; 6669075Srrh goto b; 6679075Srrh } 6689075Srrh case NV_PL: 6699075Srrh sent[st].cc=NOUN; 6709075Srrh if(prep==0){ 6719075Srrh if(sent[st].ic==NV_PL)subty=PLURAL; 6729075Srrh else subty=SING; 6739075Srrh } 6749081Srrh if(sent[st-1].cc == NOUN && nounnom(sent[st-1].ic)) { 6759075Srrh sent[st-1].cc = ADJ; 6769075Srrh } 6779075Srrh break; 6789075Srrh case PRONP_ADJ: 6799075Srrh switch(nextst){ 6809081Srrh case PNOUN: 6819075Srrh case NOUN_ADJ: 6829075Srrh case NV_PL: 6839075Srrh case ADJ_ADV: 6849075Srrh case PRONS_ADJ: 6859075Srrh case ADJ: 6869075Srrh case ING: 6879075Srrh sent[st++].cc=ADJ; 6889075Srrh goto b; 6899075Srrh case NOUN_VERB: 6909075Srrh case UNK: 6919075Srrh case ED: 6929075Srrh if(verb == 0){ 6939075Srrh goto def; 6949075Srrh } 6959075Srrh else{ 6969075Srrh sent[st++].cc=ADJ; 6979075Srrh goto b; 6989075Srrh } 6999075Srrh case NOUN: 7009075Srrh sent[st++].cc=ADJ; 7019075Srrh if(prep==0)subty=SING; 7029075Srrh break; 7039075Srrh case SUBCONJ: sent[st++].cc=PRONP; /* more than .. */ 7049075Srrh sent[st++].cc=CONJ; 7059075Srrh if(verb==0)verb=getv(st,ce); 7069075Srrh goto b; 7079075Srrh case '"': 7089075Srrh sent[st++].cc = ADJ; 7099075Srrh st++; 7109075Srrh goto b; 7119075Srrh default: 7129075Srrh def: 7139075Srrh sent[st].cc=PRONP; 7149075Srrh if(prep==0)subty=PLURAL; 7159075Srrh 7169075Srrh break; 7179075Srrh } 7189075Srrh break; 7199075Srrh case PRONS_ADJ: 7209075Srrh if(aflg == 1 && nextst != END && nextst != ART){ 7219075Srrh sent[st++].cc=ADJ; 7229075Srrh goto b; 7239075Srrh } 7249075Srrh switch(nextst){ 7259075Srrh case '"': 7269075Srrh sent[st++].cc = ADJ; 7279075Srrh st++; 7289075Srrh goto b; 7299081Srrh case PNOUN: 7309075Srrh case ING: 7319075Srrh case UNK: 7329075Srrh case NOUN_VERB: 7339075Srrh case NOUN_ADJ: 7349075Srrh case ADJ_ADV: 7359075Srrh case ADJ: 7369075Srrh sent[st++].cc=ADJ; 7379075Srrh goto b; 7389075Srrh case NOUN: 7399075Srrh sent[st++].cc=ADJ; 7409075Srrh if(prep==0)subty=SING; 7419075Srrh break; 7429075Srrh case PRONS_ADJ: 7439075Srrh sent[st++].cc=ADJ; 7449075Srrh sent[st].cc=PRONP; 7459075Srrh if(prep==0)subty=SING; 7469075Srrh break; 7479075Srrh case NV_PL: 7489075Srrh if(verb==1){ 7499075Srrh sent[st++].cc=ADJ; 7509075Srrh sent[st].cc=NOUN; 7519075Srrh if(prep==0)subty=PLURAL; 7529075Srrh 7539075Srrh break; 7549075Srrh } 7559075Srrh sent[st].cc=PRONP; 7569075Srrh if(prep==0)subty=SING; 7579075Srrh break; 7589075Srrh default: 7599075Srrh sent[st].cc=PRONP; 7609075Srrh if(prep==0)subty=SING; 7619075Srrh 7629075Srrh break; 7639075Srrh } 7649075Srrh break; 7659075Srrh case NOUN_ADJ: 7669081Srrh if(nextst==NOUN||nextst==ADJ||nextst == NOUN_ADJ||nextst==PRONS_ADJ||nextst==PRONP_ADJ||nextst==PNOUN){ 7679075Srrh sent[st++].cc=ADJ; 7689075Srrh goto b; 7699075Srrh } 7709075Srrh if(nextst!=UNK && nextst != NOUN_VERB && nextst != NV_PL){ 7719075Srrh sent[st].cc=NOUN; 7729075Srrh if(prep==0)subty=SING; 7739075Srrh break; 7749075Srrh } 7759075Srrh if(verb==1 || sent[st+2].cc==ED){ 7769075Srrh sent[st++].cc=ADJ; 7779075Srrh goto b; 7789075Srrh } 7799075Srrh sent[st].cc=NOUN; 7809075Srrh if(prep==0)subty=SING; 7819075Srrh break; 7829081Srrh case UNK: 7839075Srrh if(nextst != UNK){ 7849075Srrh if(nextst == ',' && rep==0){ 7859075Srrh c=sent[st+2].cc; 7869081Srrh if((c==UNK||c==ADJ||c==NOUN_ADJ||c==ING) && isnoun(sent[st+3].cc)){ 7879075Srrh comma--; 7889075Srrh sent[st].cc=ADJ; 7899075Srrh sent[st+2].cc=ADJ; 7909075Srrh sent[st+3].cc=NOUN; 7919075Srrh if(prep==0){ 7929075Srrh if(sent[st+3].ic==NV_PL)subty=PLURAL; 7939075Srrh else subty=SING; 7949075Srrh } 7959075Srrh return(st+3); 7969075Srrh } 7979075Srrh else { 7989075Srrh sent[st].cc=NOUN; 7999075Srrh if(prep==0)subty=SING; 8009075Srrh break; 8019075Srrh } 8029075Srrh } 8039075Srrh if(nextst==NOUN||nextst==ING ||nextst==NOUN_ADJ|| sent[st-1].cc==ADV 8049081Srrh || nextst==ADJ || nextst==PNOUN){ 8059075Srrh sent[st++].cc=ADJ; 8069075Srrh goto b; 8079075Srrh } 8089075Srrh if((nextst==NV_PL || nextst==NOUN_VERB) &&(verb==1 ||(verb==0 && (sent[st+2].cc==UNK 8099075Srrh || sent[st+2].cc==NOUN_VERB || sent[st+2].cc==ED||sent[st+2].cc==VERB_ADJ)))){ 8109075Srrh sent[st++].cc=ADJ; 8119075Srrh sent[st].cc=NOUN; 8129075Srrh if(prep == 0)subty=PLURAL; 8139075Srrh break; 8149075Srrh } 8159081Srrh if(nextst == CONJ && isadv(sent[st+2].cc)){ 8169075Srrh sent[st].cc=ADJ; 8179075Srrh goto b; 8189075Srrh } 8199075Srrh sent[st].cc=NOUN; 8209075Srrh if(prep==0)subty=SING; 8219075Srrh 8229075Srrh break; 8239075Srrh } 8249075Srrh for(t=st+1;sent[t].cc== UNK;t++); 8259075Srrh if(verb==0 && prep == 0){ /* UUU. */ 8269075Srrh if(prep==0)subty=SING; 8279081Srrh if(sent[t].cc==NV_PL|| sent[t].cc == PNOUN){ /* UUZ.*/ 8289075Srrh if(sent[t+1].cc==UNK || sent[t+1].cc==NOUN_VERB){ /* UUZU */ 8299075Srrh sent[t+1].cc=VERB; 8309075Srrh verb=1; 8319075Srrh sent[t].cc=NOUN; 8329075Srrh t1=t; 8339075Srrh } 8349081Srrh else if(sent[t].cc == NV_PL){ /* UUZ. */ 8359075Srrh sent[t].cc=VERB; 8369075Srrh verb=1; 8379075Srrh sent[t-1].cc=NOUN; 8389075Srrh t1=t-1; 8399075Srrh } 8409081Srrh else { 8419081Srrh sent[t].cc = NOUN; 8429081Srrh t1 = t; 8439081Srrh } 8449075Srrh } 8459075Srrh else{ /* UU. */ 8469075Srrh if(sent[t].cc!= ED){ 8479075Srrh sent[t-1].cc=VERB; 8489075Srrh verb=1; 8499075Srrh sent[t-2].cc=NOUN; 8509075Srrh t1=t-2; 8519075Srrh t--; 8529075Srrh } 8539075Srrh else { 8549075Srrh sent[--t].cc=NOUN; 8559075Srrh t1=t; 8569075Srrh } 8579075Srrh } 8589075Srrh } 8599075Srrh else{ 8609081Srrh if(sent[t].cc==NOUN_VERB|| sent[t].cc==NOUN|| sent[t].cc==NV_PL|| sent[t].cc==PNOUN){ 8619075Srrh sent[t].cc=NOUN; 8629075Srrh if(prep==0)subty=PLURAL; 8639075Srrh t1=t; 8649075Srrh } 8659075Srrh else{ 8669075Srrh sent[--t].cc=NOUN; 8679075Srrh if(prep==0)subty=SING; 8689075Srrh t1=t; 8699075Srrh } 8709075Srrh } 8719075Srrh for(tt=st;tt<t1;tt++)sent[tt].cc=ADJ; 8729075Srrh st=t; 8739075Srrh break; 8749075Srrh } 8759075Srrh getdef: 8769075Srrh if(sent[st].cc == CONJ && sent[st-1].cc == ADJ){ 8779075Srrh st++; 8789075Srrh goto b; 8799075Srrh } 8809075Srrh if(sent[st-1].cc==PREP && ( sent[st].cc == THAT || sent[st].cc == SUBCONJ)){ 8819075Srrh prep=0; 8829075Srrh return(--st); 8839075Srrh } 8849075Srrh if(sent[st].cc != NOUN && sent[st].cc != PRONP && sent[st].cc != PRONS){ 8859075Srrh st--; 8869075Srrh if(sent[st].cc==ADJ && sent[st].ic==ING){ 8879075Srrh sent[st].cc=NOUN; 8889075Srrh if(prep==0)subty=SING; 8899075Srrh } 8909075Srrh else if(sent[st].cc == PREP){ 8919075Srrh sent[st].cc = ADV; 8929075Srrh } 8939075Srrh prep=0; 8949075Srrh return(st); 8959075Srrh } 8969075Srrh if(done==1){ 8979075Srrh prep=0; 8989075Srrh return(st); 8999075Srrh } 9009075Srrh if(sent[st+1].cc== ','){ 9019075Srrh if(sent[st+2].cc==CONJ){ 9029075Srrh if(rep==0){ 9039075Srrh prep=0; 9049075Srrh return(st); 9059075Srrh } 9069075Srrh else{ 9079075Srrh st+=3; 9089075Srrh comma--; 9099075Srrh if(prep==0)subty=PLURAL; 9109075Srrh prep=1; 9119075Srrh goto b; 9129075Srrh } 9139075Srrh } 9149075Srrh if(comma==1){ 9159075Srrh prep=0; 9169075Srrh return(st); 9179075Srrh } 9189075Srrh 9199075Srrh switch(sent[st+2].cc){ 9209075Srrh case PREP: 9219075Srrh case SUBCONJ: 9229081Srrh case PRONS: 9239081Srrh case PRONP: 9249075Srrh prep=0; 9259075Srrh return(st); 9269075Srrh default: rep++; 9279075Srrh comma--; 9289075Srrh st+=2; 9299075Srrh if(prep==0)subty=PLURAL; 9309075Srrh prep=1; 9319075Srrh goto b; 9329075Srrh } 9339075Srrh } 9349075Srrh if(sent[st+1].cc==CONJ && sent[st+2].cc != ED){ 9359075Srrh st+=2; 9369075Srrh if(prep==0)subty=PLURAL; 9379075Srrh prep=1; 9389075Srrh goto b; 9399075Srrh } 9409075Srrh prep=0; 9419075Srrh return(st); 9429075Srrh } 9439075Srrh who(kk,ce) 9449075Srrh int kk,ce; 9459075Srrh { 9469075Srrh char c; 9479075Srrh sent[kk].cc=PRONP; 9489075Srrh c=sent[kk+1].cc; 9499081Srrh while(isadv(c)){ 9509075Srrh sent[++kk].cc = ADV; 9519075Srrh c = sent[kk+1].cc; 9529075Srrh } 9539081Srrh if(c==UNK||c==NOUN_VERB||c==VERB_ADJ||c==ED|| c==NV_PL||c==MVERB){ 9549075Srrh sent[++kk].cc=VERB; 9559075Srrh if(verb == 0)verb = getv(kk+1,ce); 9569075Srrh return(kk); 9579075Srrh } 9589075Srrh w: switch(sent[++kk].cc){ 9599075Srrh case AUXX: 9609075Srrh case ADV: 9619075Srrh case BE: 9629075Srrh case VERB: 9639075Srrh goto w; 9649075Srrh default: 9659075Srrh verb=getv(kk,ce); 9669075Srrh return(--kk); 9679075Srrh } 9689075Srrh } 969