Annotation of 43BSD/usr.bin/diction/nwords.l, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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