148247Sbostic /*-
248247Sbostic * %sccs.include.proprietary.c%
348247Sbostic */
448247Sbostic
59075Srrh #ifndef lint
6*61978Sbostic static char sccsid[] = "@(#)pscan.c 8.1 (Berkeley) 06/06/93";
748247Sbostic #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;
scan(si,ce,command)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 }
getv(si,ce)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 }
getv2(ce)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 }
getnoun(k,ce)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 }
who(kk,ce)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