Annotation of researchv10no/cmd/ideal/idlex.l, revision 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.