Annotation of 40BSD/cmd/diction/nwords.l, revision 1.1

1.1     ! root        1: %{
        !             2: /* break out words, output cap + word(inverted) */
        !             3: #include <stdio.h>
        !             4: #define OUT()  for(i=yyleng-1;i>=0; i--)putchar(yytext[i]); putchar('\n')
        !             5: #define OUT1(nam)      printf("%c:%s\n",nam,yytext)
        !             6: #define OUTN(string)   printf("%s\n",string)
        !             7: #include "names.h"
        !             8: #include "nhash.c"
        !             9: #include "dict.c"
        !            10: #include "ydict.c"
        !            11: char nt[]  = "D:n't";
        !            12: char qs[]  = "c:'s";
        !            13: char fin[]  = "E:.";
        !            14: int i,j;
        !            15: int dot = 0;
        !            16: int first  = 1;
        !            17: int qflg,nflg;
        !            18: int cap  = 0;
        !            19: %}
        !            20: %p 3000
        !            21: %a 2500
        !            22: 
        !            23: L      [a-z]
        !            24: N      [0-9]
        !            25: C      [A-Z]
        !            26: 
        !            27: %%
        !            28: (St|Dr|Drs|Mr|Mrs|Ms)"."       {
        !            29:                OUT1(NOUN);
        !            30:                }
        !            31: {C}{L}*'[s]    {
        !            32:                pos(1);
        !            33:                if(first==1)first=0;
        !            34:                }
        !            35: {C}+['][s]*    {
        !            36:                OUT1(POS);
        !            37:                }
        !            38: (({C}+{L}*)|({C}*{L}+))+([-](({C}*{L}+)|({C}+{L}*))+)+ {
        !            39:                OUT1(NOUN_ADJ);
        !            40:                }
        !            41: {C}{C}+        {
        !            42:                if((i=input()) == 's'){
        !            43:                        yytext[yyleng++] = 's';
        !            44:                        yytext[yyleng] = '\0';
        !            45:                        OUT1(NOUN);
        !            46:                }
        !            47:                else {
        !            48:                        unput(i);
        !            49:                        for(i=0;i<yyleng;i++)yytext[i]+= 'a' - 'A';
        !            50:                                goto wd;
        !            51:                }
        !            52:                }
        !            53: [LD][']{C}{L}* {
        !            54:                OUT1(NOUN_ADJ);
        !            55:                }
        !            56: {C}{L}*        {
        !            57:                if(first==1)
        !            58:                        first=0;
        !            59:                else cap = 1;
        !            60:                if(yyleng==1 && yytext[0] == 'I'){
        !            61:                        cap = 0;
        !            62:                        goto wd;
        !            63:                }
        !            64:                yytext[0]+= 'a' - 'A';
        !            65:                goto wd;
        !            66:        }
        !            67: ({N}+[-]{N}+[-]*)+     {
        !            68:                OUT1(NOUN_ADJ);
        !            69:                }
        !            70: ({N}+[-]*{L}+[-]*)+    {
        !            71:                OUT1(NOUN_ADJ);
        !            72:                }
        !            73: ({N}*[,])*({N}+".")+[ \t\n]+{C}        {
        !            74:                for(i=yyleng-1;i>0;i--)
        !            75:                        if(yytext[i] == '.')break;
        !            76:                unput(yytext[yyleng-1]);
        !            77:                yytext[i] = '\0';
        !            78:                OUT1(NOUN_ADJ);
        !            79:                OUTN(fin);
        !            80:                first = 1;
        !            81:        }
        !            82: [ \t`][a-zA-Z0-9.]*("\/"[a-zA-Z0-9]+"."*)+[']* {
        !            83:                if(yytext[yyleng-1] == '.')dot=1;
        !            84:                OUT1(NOUN_ADJ);
        !            85:                }
        !            86: {N}+([,]{N}+)*("."{N}+)*[']*[s]*       {
        !            87:        OUT1(NOUN_ADJ);
        !            88:        }
        !            89: {N}*([,]{N}+)*("."{N}+)+[']*[s]*       {
        !            90:        OUT1(NOUN_ADJ);
        !            91:        }
        !            92: {N}+([,]{N}+)*("."{N}*)*[']*[s]*       {
        !            93:        if(yytext[yyleng-1] == '.')dot=1;
        !            94:        OUT1(NOUN_ADJ);
        !            95:        }
        !            96: {L}+[-]*{N}+   {
        !            97:                OUT1(NOUN_ADJ);
        !            98:                }
        !            99: {C}+[-]*{N}+   {
        !           100:        OUT1(NOUN_ADJ);
        !           101:        }
        !           102: {N}+[-]+{C}+   {
        !           103:        OUT1(NOUN_ADJ);
        !           104:                }
        !           105: {N}+[%]                {
        !           106:                OUT1(NOUN_ADJ);
        !           107:                }
        !           108: "$"{N}+([,]{N}+)*("."{N}*)*    {
        !           109:                if(yytext[yyleng-1] == '.')dot=1;
        !           110:                OUT1(NOUN);
        !           111:                }
        !           112: [Aa]"."[ ]*[Mm]"."     {
        !           113:                OUT1(ADJ_ADV);
        !           114:                }
        !           115: [Pp]"."[ ]*[Mm]"."     {
        !           116:                OUT1(ADJ_ADV);
        !           117:                }
        !           118: "a."[ ]*"d."   {
        !           119:                OUT1(ADJ_ADV);
        !           120:                }
        !           121: "b."[ ]*"c."   {
        !           122:                OUT1(ADJ_ADV);
        !           123:                }
        !           124: "i."[ ]*"e."   {
        !           125:                OUT1(PREP);
        !           126:                }
        !           127: "e."[ ]*"g."   {
        !           128:                OUT1(PREP);
        !           129:                }
        !           130: "etc."[ \n]*[,)]*      {
        !           131:                i = yytext[4];
        !           132:                yytext[4] = '\0';
        !           133:                OUT1(NOUN);
        !           134:                yytext[4] = i;
        !           135:                yytext[0] = yytext[yyleng-1];
        !           136:                yytext[1] = '\0';
        !           137:                if(yytext[0] == ',' || yytext[0] == ')')
        !           138:                        OUT1(',');
        !           139:                else {
        !           140:                        OUTN(fin);
        !           141:                        first = 1;
        !           142:                }
        !           143:        }
        !           144: "et al."       {
        !           145:                OUT1(NOUN);
        !           146:                }
        !           147: [Nn][Oo][s]*"."        {
        !           148:                OUT1(NOUN_ADJ);
        !           149:                }
        !           150: [Ff]ig[s]*"."  {
        !           151:                OUT1(NOUN_ADJ);
        !           152:                }
        !           153: [Dd]ept[s]*"." {
        !           154:                OUT1(NOUN_ADJ);
        !           155:        }
        !           156: [Ee]q"."       {
        !           157:                OUT1(NOUN_ADJ);
        !           158:                }
        !           159: dB"."  {
        !           160:                OUT1(NOUN_ADJ);
        !           161:                }
        !           162: vs"."  {
        !           163:        OUT1(PREP);
        !           164:        }
        !           165: in"."[ \n]*{C} {
        !           166:                unput(yytext[yyleng-1]);
        !           167:                yytext[2] = '\0';
        !           168:                OUT1(PREP);
        !           169:                OUTN(fin);
        !           170:                first = 1;
        !           171:                }
        !           172: (in|ft|yr|ckts|mi)"."  {
        !           173:                OUT1(NOUN_ADJ);
        !           174:                }
        !           175: Ph"."[ ]*[Dd]"."       {
        !           176:                OUT1(ADJ);
        !           177:                }
        !           178: [Jj]r"."       {
        !           179:        OUT1(ADJ);
        !           180:        }
        !           181: [Cc]h"."       {
        !           182:                OUT1(NOUN_ADJ);
        !           183:        }
        !           184: [Rr]ef[s]*"."  {
        !           185:                OUT1(NOUN_ADJ);
        !           186:        }
        !           187: Inc"." {
        !           188:                OUT1(ADJ);
        !           189:        }
        !           190: [A-Z]"."       {
        !           191:                dot=1;
        !           192:                OUT1(NOUN);
        !           193:                }
        !           194: can't          {
        !           195:                yytext[3]='\0';
        !           196:                yyleng -= 2;
        !           197:                nflg=1;
        !           198:                goto wd;
        !           199:                }
        !           200: won't          {
        !           201:                OUT1('X');
        !           202:                }
        !           203: {L}+n't                {
        !           204:                nflg=1;
        !           205:                yytext[yyleng-3]='\0';
        !           206:                yyleng -= 3;
        !           207:                goto wd;
        !           208:                }
        !           209: [A-Z]{L}+n't   {
        !           210:                yytext[0]+= 'a' - 'A';
        !           211:                nflg=1;
        !           212:                yytext[yyleng-3]='\0';
        !           213:                yyleng -= 3;
        !           214:                goto wd;
        !           215:                }
        !           216: o'clock        {
        !           217:                OUT1(ADV);
        !           218:        }
        !           219: {L}+'[s]       {
        !           220:                pos(0);
        !           221:                }
        !           222: 'll    {
        !           223:                OUT1(lookup("will",1,0));
        !           224:        }
        !           225: 've    {
        !           226:                OUT1(lookup("have",1,0));
        !           227:        }
        !           228: 're    {
        !           229:                OUT1(lookup("are",1,0));
        !           230:        }
        !           231: 'd     {
        !           232:                OUT1(lookup("had",1,0));
        !           233:        }
        !           234: 'm     {
        !           235:                OUT1(lookup("am",1,0));
        !           236:        }
        !           237: 'ld    {
        !           238:                OUT1(lookup("would",1,0));
        !           239:        }
        !           240: {L}+   {
        !           241: wd:
        !           242:        if((j = lookup(yytext,1,0)) != 0){
        !           243:                first=0;
        !           244:                if(cap){
        !           245:                        yytext[0] += 'A' - 'a';
        !           246:                        cap = 0;
        !           247:                        if(dot)OUTN(fin);
        !           248:                }
        !           249:                dot=0;
        !           250:                OUT1(j);
        !           251:                if(nflg==1){
        !           252:                        nflg=0;
        !           253:                        OUTN(nt);
        !           254:                }
        !           255:        }
        !           256:        else{
        !           257:                first = dot=0;
        !           258:                if(yytext[yyleng-1] == 'y' && cap == 0){
        !           259:                        switch(yytext[yyleng-2]){
        !           260:                        case 'c': look(cy,yyleng-2,NOUN);
        !           261:                                        break;
        !           262:                        case 'f': look(fy,yyleng-2,VERB);
        !           263:                                        break;
        !           264:                        case 'l': look(ly,yyleng-2,ADV);
        !           265:                                        break;
        !           266:                        case 'g': if(yytext[yyleng-3] == 'o'){
        !           267:                                        OUT1(NOUN);
        !           268:                                        break;
        !           269:                                }
        !           270:                                 look(gy,yyleng-2,ADJ);
        !           271:                                break;
        !           272:                        case 'r':       switch(yytext[yyleng-3]){
        !           273:                                case 'a': look(ary,yyleng-3,ADJ);
        !           274:                                                break;
        !           275:                                case 'o': look(ory,yyleng-3,ADJ);
        !           276:                                                break;
        !           277:                                case 'e': look(ery,yyleng-3,NOUN);
        !           278:                                                break;
        !           279:                                default: look(ry,yyleng-2,NOUN);
        !           280:                                }
        !           281:                                break;
        !           282:                        case 't': if(yytext[yyleng-3] == 'i')look(ity,yyleng-3,NOUN);
        !           283:                                else look(ty,yyleng-2,ADJ);
        !           284:                                break;
        !           285:                        default: OUT();
        !           286:                        }
        !           287:                }
        !           288:                else {
        !           289:                        if(cap){
        !           290:                                yytext[0] += 'A' - 'a';
        !           291:                                cap = 0;
        !           292:                                OUT1(NOUN_ADJ);
        !           293:                        }
        !           294:                        else {
        !           295:                                OUT();
        !           296:                        }
        !           297:                }
        !           298:        }
        !           299:        }
        !           300: [\n]   ;
        !           301: [ ]+   ;
        !           302: [\t]+  ;
        !           303: ";"    {
        !           304:        OUT1(';');
        !           305:        first=1;
        !           306:        }
        !           307: (\"|`|')+      {
        !           308:        if(dot){
        !           309:                OUTN(fin);
        !           310:                dot=0;
        !           311:        }
        !           312:        if(qflg==1){
        !           313:                qflg=0;
        !           314:                OUT1('"');
        !           315:        }
        !           316:        else {
        !           317:                qflg=1;
        !           318:                first=1;
        !           319:                OUT1('"');
        !           320:        }
        !           321:        }
        !           322: ".\""  {
        !           323:        qflg=0;
        !           324:        first=1;
        !           325:        OUT1(END);
        !           326:        }
        !           327: "..."  {
        !           328:        OUT1(',');
        !           329:        }
        !           330: "/."   {
        !           331:        first = 1;
        !           332:        OUT1(END);
        !           333:        }
        !           334: "."    {
        !           335:        first=1;
        !           336:        OUT1(END);
        !           337:        }
        !           338: "!\""  {
        !           339:        qflg=0;
        !           340:        first=1;
        !           341:        OUT1(END);
        !           342:        }
        !           343: "!"    {
        !           344:        first=1;
        !           345:        OUT1(END);
        !           346:        }
        !           347: "?\""  {
        !           348:        qflg=0;
        !           349:        first=1;
        !           350:        OUT1(END);
        !           351:        }
        !           352: "?"    {
        !           353:        first=1;
        !           354:        OUT1(END);
        !           355:        }
        !           356: ":"    {
        !           357:        OUT1(',');
        !           358:        first=1;
        !           359:        }
        !           360: [-]+   {
        !           361:        OUT1(',');
        !           362:        first=1;
        !           363:        }
        !           364: ","    {
        !           365:        OUT1(',');
        !           366:        }
        !           367: (\[|\(|\{|\]|\)|\})    {
        !           368:        OUT1(',');
        !           369:        }
        !           370: .      {
        !           371: /*     fprintf(stderr,"nwords funny char: %c\n",yytext[0])*/ ;
        !           372:        }
        !           373: %%
        !           374: look(f,n,cc)
        !           375: char (*f)();
        !           376: int n;
        !           377: char cc;
        !           378: {
        !           379:        int nn;
        !           380:        char  save;
        !           381:        save=yytext[n];
        !           382:        yytext[n] = '\0';
        !           383:        nn=(*f)(yytext,1,0);
        !           384:        yytext[n] = save;
        !           385:        if(nn != 0){
        !           386:                OUT1(nn);
        !           387:        }
        !           388:        else {
        !           389:                OUT1(cc);
        !           390:        }
        !           391: }
        !           392: pos(flg){
        !           393:        int ii,j;
        !           394:        if(flg==1)yytext[0] += 'a' - 'A';
        !           395:        for(ii=yyleng-1;yytext[ii] != '\''; ii--);
        !           396:        yytext[ii] = '\0';
        !           397:        if((j=lookup(yytext,1,0)) != 0){
        !           398:                yyleng = ii;
        !           399:                OUT1(j);
        !           400:                OUTN(qs);
        !           401:        }
        !           402:        else{
        !           403:                if(flg==1)yytext[0] += 'A' - 'a';
        !           404:                yytext[ii] = '\'';
        !           405:                OUT1(POS);
        !           406:        }
        !           407: }
        !           408: char   *filename="-";
        !           409: 
        !           410: main(argc,argv)
        !           411: int    argc;
        !           412: char   *argv[];
        !           413: {
        !           414:        register int rc=0;
        !           415:        putchar(':'); putchar('\n');
        !           416:        getd();
        !           417:        ygetd();
        !           418:        if(argc<=1) {
        !           419:                yylex();
        !           420:        }else{
        !           421:                while(argc>1) {
        !           422:                        if(freopen(argv[1],"r",stdin)==NULL) {
        !           423:                                fprintf(stderr,"%s: cannot open\n", argv[1]);
        !           424:                                rc++;
        !           425:                        }else{
        !           426:                                filename=argv[1];
        !           427:                                yylex();
        !           428:                        }
        !           429:                        argc--; argv++;
        !           430:                }
        !           431:        }
        !           432:        return(rc);
        !           433: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.