pscan.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 965 行 · 第 1/2 页
C
965 行
#ifndef lintstatic char sccsid[] = "@(#)pscan.c 4.2 (Berkeley) 82/11/06";#endif not lint#include "names.h"#include "conp.h"#define isadv(c) (c == ADV || c == ADJ_ADV)#define isadj(c) (c == ADJ || c == NOUN_ADJ || c == ADJ_ADV || c == UNK)#define notnoun(c) (c != NOUN && c != UNK && c != NOUN_VERB && c != NV_PL && c != PNOUN)#define issing(c) (c == UNK || c == NOUN_VERB || c == NOUN || c == NOM || c == NOUN_ADJ)#define isnoun(c) (c == NOUN || c == NOUN_VERB || c == NV_PL || c == UNK || c == PNOUN)#define nounnom(c) (c == NOUN || c == NOM)char lastc,nextc;int savsub;scan(si,ce,command) /*scan a phrase */int si; char ce;{ int savi; char c; i=si; if(command == 1)subty = PLURAL; else subty = 0; if(sent[i].cc==ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK && sent[i+1].cc != ADJ) sent[i++].cc = ADV; done=0; verb = 0; verb=getv(i,ce); /*get verb if obvious*/ if(command == 0)j=getnoun(i,ce); /*get subject*/ else j = si; if(i != j || ((i==j) && sent[i].cc == NOUN)){ i = j+1; } for(;((c=sent[i].cc) != ce) && (c != END) && (c != '\0');i++){ nextc=sent[i+1].cc; if(i>0){ lastc=sent[i-1].cc; if(lastc==BE)be=1; else{ if(lastc != ADV)be=0; } } else lastc=0; if(verb==1)question=0; switch(c){ case '"': if(nextc==ED || nextc == MVERB){ verb=1; sent[++i].cc=VERB; subty=SING; continue; } subty=0; verb=getv(++i,ce); i=getnoun(i,ce); continue; case MVERB: sent[i].cc = VERB; if(i < nsleng*.5){ verb = getv(++i,ce); i = getnoun(i,ce); continue; } continue; case ART: case ADJ: case POS: case ING: aflg=1; i=getnoun(i,ce); aflg=0; continue; case PREP: if(nextc == ce){ sent[i].cc=ADV; goto sdone; } prep=1; i=getnoun(++i,ce); prep=0; continue; case VERB_ADJ: if(verb==0){ sent[i].cc=VERB; verb=1; continue; } case NOUN_ADJ: if(be==1){ sent[i].cc=ADJ; continue; } case PRONP_ADJ: case PRONS_ADJ: i=getnoun(i,ce); continue; case NOUN_ADV: if(verb == 1 && iverb == i+1){ sent[i].cc = NOUN; } else { sent[i].cc = ADV; } continue; case ADJ_ADV: if(be == 1){ if (isadj(nextc)) { sent[i].cc = ADV; continue; } if(nextc == ',' && isadv(sent[i+2].cc)) { sent[i++].cc = ADV; sent[++i].cc = ADV; comma--; continue; } sent[i].cc = ADJ; continue; } if(lastc == NOUN && (nextc == ',' || nextc == END)){ sent[i].cc=ADJ; continue; } if(notnoun(nextc)){ sent[i].cc=ADV; continue; } sent[i].cc=ADJ; continue; case WHO: i=who(i,ce); continue; case PRONP: subty=PLURAL; continue; case NOUN: if(nextc==NOUN){ sent[i].cc=ADJ; continue; } case PRONS: subty=SING; continue; case PNOUN: sent[i].cc = NOUN; if(subty == 0)subty=PLURAL; continue; case CONJ: if(nextc==UNK || nextc == NOUN_VERB || nextc == NV_PL){ if(lastc == ADJ)sent[++i].cc = ADJ; else sent[++i].cc = VERB; } if(nextc == ED){ sent[++i].cc = VERB; } continue; case AUXP: case AUXS: case BES: case BEP: case AUXV: case AUX: case HAS: case HAVE: case HAD: verb=getv(i,ce); continue; case ADV: case AUXX: case VERB: case BE: case INTER: continue; case THAT: if(nextc==SUBCONJ){ sent[i].cc=PRONP; goto subc; } verb=getv(i+1,ce); j = i+1; while(isadv(sent[j].cc)) { j++; } nextc = sent[j].cc; if((verb==1 && iverb== j) || nextc==ED || nextc == VERB_ADJ){ sent[i].cc=PRONP; while(i+1 < j)sent[++i].cc = ADV; } else if(verb==0 && nextc==NV_PL && ((lastc==NOUN && issing(sent[i-1].ic)) || lastc == ',')) { sent[i].cc=PRONP; subty=SING; while(i+1 < j)sent[++i].cc = ADV; } else if(verb==0 && (nextc==UNK || nextc==NOUN_VERB) && (lastc==NOUN && sent[i-1].ic==NV_PL)){ subty=PLURAL; sent[i].cc=PRONP; while(i+1 < j)sent[++i].cc = ADV; } else { if(i == 0)sent[i].cc=ADJ; else sent[i].cc=SUBCONJ; j=i; subty=0; i=getnoun(i+1,ce); if(done)sent[j].cc=ADJ; } continue; case ',': if(nextc != CONJ){ /*parenthetical*/ continue; } i++; comma--; if(sent[i+1].cc == ED || sent[i+1].cc == MVERB){ sent[++i].cc = VERB; continue; } if(command == 1){ verb = getv(++i,ce); continue; } case SUBCONJ: subc: savi = i; if(nextc==END||(lastc==',' && nextc==',')){ sent[i].cc=ADV; continue; } subty=0; ce=','; verb=getv(++i,ce); if(sent[savi+1].cc == VERB || sent[savi+1].cc == AUXX) if(sent[savi].cc == SUBCONJ)sent[savi].cc = ADV; i=getnoun(i,ce); continue; case PREP_ADV: if(sent[i+2].cc==PREP_ADV &&(sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB && sent[i+1].cc != NV_PL && sent[i+1].cc != PNOUN)){ sent[i].cc=ADV; sent[i+2].cc=CONJ; continue; } sav=i++; savsub = subty; pverb=getv(i,ce); if((pverb==1 && iverb == i) || sent[i].cc== ED){ sent[sav].cc=PRONP; sent[i].cc=VERB; continue; } i=getnoun(i,ce); if(done==1){ sent[sav].cc=ADV; goto sdone; } if(pverb==1 && iverb == i+1){ sent[sav].cc=SUBCONJ; ce=','; continue; } switch(sent[i+1].cc){ case UNK: case NV_PL: case NOUN_VERB: case ED: sent[sav].cc=SUBCONJ; verb=0; ce=','; continue; default: sent[sav].cc=PREP; subty = savsub; continue; } case TO: savi = i; sent[i++].cc=VERB;sw: switch(nextc){ case UNK: case AUXS: case VERB_ADJ: case NOUN_VERB: case VERB: case MVERB: sent[i].cc=VERB; continue; case HAVE: sent[i].cc = VERB; if(sent[i+1].cc == ED){ sent[++i].cc = VERB; continue; } if(sent[i+1].cc == ADV)i++; if(sent[i+1].cc != BE)continue; i++; case BE: sent[i].cc=VERB; if(sent[i+1].cc == ADV)i++; if(sent[i+1].cc == ED || sent[i+1].cc == ING){ sent[++i].cc = VERB; } else if(sent[i+1].cc == UNK){ sent[++i].cc = ADJ; } continue; case ADV: nextc = sent[++i].cc; goto sw; default: sent[savi].cc = PREP; prep=1; i=getnoun(i,ce); prep=0; continue; } case NV_PL: if(subty==0){ i=getnoun(i,ce); subty=PLURAL; } else if(verb== 0){ /*need verb*/ sent[i].cc=VERB; verb=1; } else{ i=getnoun(i,ce); } continue; case UNK: case NOUN_VERB: if(verb==1){ if(be==1 && nextc != WHO){ sent[i].cc=ADJ; continue; } i=getnoun(i,ce); } else if(nextc==NV_PL && isnoun(sent[i+2].cc)) { sent[i].cc=NOUN; if(sent[i-1].cc == NOUN){ sent[i-1].cc = ADJ; } subty=SING; continue; } else if(subty==0){ i=getnoun(i,ce); continue; } else { /* desparation */ sent[i].cc=VERB; verb=1; } continue; case ED: if(verb == 0){ sent[i].cc=VERB; verb=1; } else if(sent[i-1].cc == BE){ sent[i].cc = VERB; } else{ i=getnoun(i,ce); } continue; default: printf("got a %c %o on %sat %d\n",sent[i].cc,sent[i].cc,sent[i].sp,i); } }sdone: if(sent[i].cc==END && sent[i].ic != ';')return(-1); else { if(sent[i].ic == ';')sent[i].cc=';'; else comma--; return(i); }}getv(si,ce)int si; char ce;{ int conj; char c; int ik; must=0; bflg=0; hflg=0; verbty=0; for(j=si;((c=sent[j].cc) != ce) && (c != END); j++){ iverb=j; switch(c){ case ED: continue; case HAS: hflg=1; verbty=SING; sent[j].cc=AUXX; goto next; case HAVE: if(sent[j-1].cc==TO){ continue; } case HAD: hflg=1; verbty=PLURAL; sent[j].cc=AUXX; goto next; case BE: if(sent[j].ic != BE){ return(1); } continue; case VERB: if(sent[j-1].cc==TO){ continue; } return(1); case AUXX: return(1); case AUXP: must=1; verbty=PLURAL; sent[j].cc=AUXX; goto next; case AUXS: if(sent[j-1].cc==TO){ continue; } verbty=SING; sent[j].cc=AUXX; goto next; case AUX: case AUXV: must=1; sent[j].cc=AUXX;next: if(sent[j-1].cc == CONJ && verb == 0)conj = 0; else conj = 1; if(question==1){ j=getnoun(j+1,ce); question=0; } getv2(ce); if(sent[j].cc == AUXX){ sent[j].cc = VERB; } if((sent[j].cc!=VERB && sent[j].cc!=BE) && sent[iverb].cc==AUXX){ sent[iverb].cc=VERB; for(ik=iverb+1;ik<=j;ik++){ if(sent[ik].ic == NOM)sent[ik].cc=NOUN; else sent[ik].cc=sent[ik].ic; } } return(conj); case BES: verbty=SING; bflg=1; sent[j].cc=BE; goto next; case BEP: verbty=PLURAL; bflg=1; sent[j].cc=BE; goto next; case SUBCONJ: if(sent[j-1].cc== ',' && sent[j+1].cc == ','){ continue; } case THAT: case WHO: goto vdone; case ',': if(comma==1 && sent[j+1].cc==CONJ){ goto vdone; } } }vdone: return(0);}getv2(ce)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?