Annotation of researchv10no/cmd/ideal/idlex.l, revision 1.1.1.1

1.1       root        1: %{
                      2: #include "ideal.h"
                      3: #include "y.tab.h"
                      4: extern int lineno, yylval;
                      5: extern boolean flyback;
                      6: 
                      7: #define        BUFLEN  100
                      8: 
                      9: struct filenode {
                     10:        struct filenode *next;
                     11:        FILE *file;
                     12:        int lineno;
                     13:        char *name;
                     14:        char buf[BUFLEN];
                     15:        int head;
                     16: };
                     17: 
                     18: struct filenode *filestack = NULL;
                     19: 
                     20: FILE *curfile;
                     21: #undef input
                     22: #undef unput
                     23: 
                     24: boolean file_start = TRUE;
                     25: boolean just_popped = FALSE;
                     26: 
                     27: void filepush ();
                     28: void filepop ();
                     29: char input ();
                     30: void unput ();
                     31: %}
                     32: %Start PROGRAM COMMENT OUTSIDE LIBRARY INCLUDE
                     33: %%
                     34: %{
                     35:        int numitems, i;
                     36:        char item[5][20];
                     37:        char cmd[20];
                     38:        static int ISnest, bracenest, commnest, omode;
                     39:        if (file_start) {
                     40:                BEGIN OUTSIDE;
                     41:                ISnest = 0;
                     42:        };
                     43:        file_start = FALSE;
                     44: %}
                     45: <OUTSIDE>^\.IS.*\n     {
                     46:                        BEGIN PROGRAM;
                     47:                        if (!ISnest)
                     48:                                printf ("%s", yytext);
                     49:                        ISnest ++;
                     50:                        bracenest = commnest = 0;
                     51:                        }
                     52: <OUTSIDE>[ \t]         {
                     53:                        if (just_popped) {
                     54:                                if (omode == LIBFIL)
                     55:                                        BEGIN LIBRARY;
                     56:                                else if (omode == CHATTY)
                     57:                                        BEGIN INCLUDE;
                     58:                                else impossible ("idlex");
                     59:                                just_popped = FALSE;
                     60:                        } else
                     61:                                printf ("%s", yytext);
                     62:                        }
                     63: <OUTSIDE>.             {
                     64:                        printf ("%s", yytext);
                     65:                        }
                     66: <OUTSIDE>\n            {
                     67:                        if (just_popped) {
                     68:                                BEGIN PROGRAM;
                     69:                                just_popped = FALSE;
                     70:                        } else {
                     71:                                printf ("\n");
                     72:                        }
                     73:                        }
                     74: <PROGRAM>box           return(yylval = BOX);
                     75: <PROGRAM>var           return(yylval = VAR);
                     76: <PROGRAM>bdlist                return(yylval = BDLIST);
                     77: <PROGRAM>boundary      return(yylval = BDLIST);
                     78: <PROGRAM>put           return(yylval = PUT);
                     79: <PROGRAM>conn          return(yylval = CONN);
                     80: <PROGRAM>to            return(yylval = TO);
                     81: <PROGRAM>using         return(yylval = USING);
                     82: <PROGRAM>construct     return(yylval = CONSTRUCT);
                     83: <PROGRAM>draw          return(yylval = DRAW);
                     84: <PROGRAM>opaque                return(yylval = OPAQUE);
                     85: <PROGRAM>left          return(yylval = LEFT);
                     86: <PROGRAM>text          return(yylval = CENTER);
                     87: <PROGRAM>right         return(yylval = RIGHT);
                     88: <PROGRAM>spline                return(yylval = SPLINE);
                     89: <PROGRAM>at            return(yylval = AT);
                     90: <PROGRAM>interior      return(yylval = INTERIOR);
                     91: <PROGRAM>exterior      return(yylval = EXTERIOR);
                     92: <PROGRAM>[a-zA-Z][a-zA-Z0-9]*  {
                     93:                        yylval = lookup(&yytext[0]);
                     94:                        return(NAME);
                     95:                        }
                     96: <PROGRAM>[0-9]+|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*|[0-9]+\.?[0-9]*[eE]\ *[+\-]?[0-9]+|[0-9]*\.[0-9]+[eE]\ *[+\-]?[0-9]+ {
                     97:                        float temp;
                     98:                        sscanf(yytext, "%f", &temp);
                     99:                        yylval = (int) fextlgen(temp);
                    100:                        return(CONST);
                    101:                        }
                    102: <PROGRAM>^\.\.\.forget.*       {
                    103:                        numitems = sscanf (yytext, "%s %s %s %s %s %s",
                    104:                                cmd,
                    105:                                &item[0][0],
                    106:                                &item[1][0],
                    107:                                &item[2][0],
                    108:                                &item[3][0],
                    109:                                &item[4][0]
                    110:                        );
                    111:                        numitems --;
                    112:                        for (i = 0; i < numitems; i ++)
                    113:                                forget (lookup (&item[i][0]));
                    114:                        }
                    115: <PROGRAM>^\.\.\.radians.*      radflag = TRUE;
                    116: <PROGRAM>^\.\.\.degrees.*      radflag = FALSE;
                    117: <PROGRAM>^\.\.\.libfile        {
                    118:                        omode = LIBFIL;
                    119:                        BEGIN LIBRARY;
                    120:                        }
                    121: <LIBRARY>[ \t]+                ;
                    122: <LIBRARY>[^ \t\n]+     {
                    123:                        idinclude (yytext, LIBFIL);
                    124:                        BEGIN OUTSIDE + 1;
                    125:                        }
                    126: <LIBRARY>\n            {
                    127:                        BEGIN PROGRAM + 1;
                    128:                        }
                    129: <PROGRAM>^\.\.\.include        {
                    130:                        omode = CHATTY;
                    131:                        BEGIN INCLUDE;
                    132:                        }
                    133: <INCLUDE>[ \t]+                ;
                    134: <INCLUDE>[^ \t\n]+     {
                    135:                        idinclude (yytext, CHATTY);
                    136:                        BEGIN OUTSIDE + 1;
                    137:                        }
                    138: <INCLUDE>\n            {
                    139:                        BEGIN PROGRAM + 1;
                    140:                        }
                    141: <PROGRAM>^\.I[EF].*\n  {
                    142:                        interpret ();
                    143:                        ISnest --;
                    144:                        if (!ISnest)
                    145:                                printf ("%s", yytext);
                    146:                        if (bracenest > 0)
                    147:                                fprintf (stderr, "ideal: excess {\n");
                    148:                        BEGIN OUTSIDE;
                    149:                        }
                    150: <PROGRAM>^\..*         {
                    151:                        sscanf (yytext, "%s", cmd);
                    152:                        if (strcmp (cmd, "...libfile") && strcmp (cmd, "...include"))
                    153:                                printf ("%s\n", yytext);
                    154:                        else
                    155:                                REJECT;
                    156:                        }
                    157: <PROGRAM>#.*           ;
                    158: <PROGRAM>"/*"          {
                    159:                        commnest = 1;
                    160:                        BEGIN COMMENT;
                    161:                        }
                    162: <COMMENT>"/*"          {
                    163:                        commnest ++;
                    164:                        }
                    165: <COMMENT>"*/"          {
                    166:                        commnest --;
                    167:                        if (!commnest)
                    168:                                BEGIN PROGRAM;
                    169:                        }
                    170: <COMMENT>.             ;
                    171: <COMMENT>\n            {
                    172:                        }
                    173: <PROGRAM>"'"[^']*      {
                    174:                        if (yytext[yyleng-1] == '\\') {
                    175:                                yytext[yyleng-1] = yytext[yyleng];
                    176:                                yyleng --;
                    177:                                yymore();
                    178:                        } else {
                    179:                                char *temp;
                    180:                                temp = malloc((unsigned) yyleng+1);
                    181:                                yytext[yyleng] = '\0';
                    182:                                strcpy(temp, &yytext[1]);
                    183:                                yylval = (int) temp;
                    184:                                input();
                    185:                                return(STRING);
                    186:                        }
                    187:                        }
                    188: <PROGRAM>\"[^\"]*      {
                    189:                        if (yytext[yyleng-1] == '\\') {
                    190:                                yytext[yyleng-1] = yytext[yyleng];
                    191:                                yyleng --;
                    192:                                yymore();
                    193:                        } else {
                    194:                                char *temp;
                    195:                                temp = malloc((unsigned) yyleng+1);
                    196:                                yytext[yyleng] = '\0';
                    197:                                strcpy(temp, &yytext[1]);
                    198:                                yylval = (int) temp;
                    199:                                input();
                    200:                                return(STRING);
                    201:                        }
                    202:                        }
                    203: <PROGRAM>[ \t]+                {
                    204:                        if (just_popped) {
                    205:                                if (omode == LIBFIL)
                    206:                                        BEGIN LIBRARY;
                    207:                                else if (omode == CHATTY)
                    208:                                        BEGIN INCLUDE;
                    209:                                else impossible ("idlex");
                    210:                                just_popped = FALSE;
                    211:                        }
                    212:                        }
                    213: <PROGRAM>\n            {
                    214:                        }
                    215: <PROGRAM>"{"           {
                    216:                        bracenest ++;
                    217:                        return (yylval = LBRACE);
                    218:                        }                               
                    219: <PROGRAM>"}"           {
                    220:                        bracenest --;
                    221:                        if (bracenest < 0)
                    222:                                fprintf (stderr, "ideal: excess }\n");
                    223:                        return (yylval = RBRACE);
                    224:                        }
                    225: <PROGRAM>[\<\>\(\)\[\]\+\-\*\/\=\,\;\:\.\^\~]  return(yytext[0]);
                    226: <PROGRAM>.             fprintf(stderr, "ideal: unknown input token %s flushed\n", &yytext[0]);
                    227: %%
                    228: void filepush (f)
                    229: FILE *f;
                    230: {
                    231:        struct filenode *newfile;
                    232:        newfile = (struct filenode *) calloc (1, sizeof (struct filenode));
                    233:        if (newfile) {
                    234:                newfile->next = filestack;
                    235:                newfile->file = curfile = f;
                    236:                newfile->head = -1;
                    237:                if (filestack)
                    238:                        filestack->lineno = lineno;
                    239:                newfile->name = malloc ((unsigned)strlen(filename)+1);
                    240:                strcpy (newfile->name, filename);
                    241:                filestack = newfile;
                    242:                lineno = 1;
                    243:        } else {
                    244:                fprintf (stderr, "ideal: no room for file descriptor\n");
                    245:                exit (1);
                    246:        }
                    247: }
                    248: 
                    249: void filepop ()
                    250: {
                    251:        struct filenode *oldfile;
                    252:        if (filestack) {
                    253:                if (filestack->head > -1)
                    254:                        fprintf (stderr, "ideal: characters ignored in file %s\n", filename);
                    255:                oldfile = filestack;
                    256:                filestack = filestack->next;
                    257:                fclose (oldfile->file);
                    258:                if (filestack) {
                    259:                        curfile = filestack->file;
                    260:                        lineno = filestack->lineno;
                    261:                        filename = filestack->name;
                    262:                } else
                    263:                        curfile = NULL;
                    264:                free ((char *)oldfile);
                    265:        } else {
                    266:                fprintf (stderr, "ideal: file stack botch\n");
                    267:                exit (1);
                    268:        }
                    269: }
                    270: 
                    271: int idgetc (f)
                    272: struct filenode *f;
                    273: {
                    274:        int c;
                    275:        if (!f)
                    276:                return (EOF);
                    277:        if (f->head > -1) {
                    278:                c = f->buf[f->head--];
                    279:        } else
                    280:                c = getc(f->file);
                    281:        return (c);
                    282: }
                    283: 
                    284: char input ()
                    285: {
                    286:        int c;
                    287:        c = 0;
                    288:        if (filestack)
                    289:                c = idgetc(filestack);
                    290:        while (c == EOF && filestack) {
                    291:                filepop();
                    292:                if (filestack) {
                    293:                        c = idgetc(filestack);
                    294:                        just_popped = TRUE;
                    295:                }
                    296:                else
                    297:                        c = EOF;
                    298:        }
                    299:        if (c == '\n')
                    300:                lineno++;
                    301:        return ((c == EOF)?0:c);
                    302: }
                    303: 
                    304: void unput (c)
                    305: char c;
                    306: {
                    307:        struct filenode *f;
                    308:        if (f = filestack) {
                    309:                if (f->head < BUFLEN) {
                    310:                        f->buf[++f->head] = c;
                    311:                        if (c == '\n')
                    312:                                -- lineno;
                    313:                } else {
                    314:                        fprintf (stderr, "ideal: out of pushback space\n");
                    315:                        exit (1);
                    316:                }
                    317:        }
                    318: }

unix.superglobalmegacorp.com

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