Annotation of researchv10no/cmd/pic/picl.l, revision 1.1

1.1     ! root        1: %Start A str def sc br thru sh
        !             2: %e 1700
        !             3: %k 120
        !             4: %a 1800
        !             5: %o 1500
        !             6: %p 5000
        !             7: %n 700
        !             8: 
        !             9: %{
        !            10: #undef input
        !            11: #undef unput
        !            12: /* #include <stdio.h> lex puts one out for us */
        !            13: #include <ctype.h>
        !            14: #include <stdlib.h>
        !            15: #include "pic.h"
        !            16: #include "y.tab.h"
        !            17: 
        !            18: extern char    *filename;
        !            19: extern struct  symtab  symtab[];
        !            20: 
        !            21: void   pbstr(char *);
        !            22: void   dodef(struct symtab *stp);
        !            23: void   undefine(char *s);
        !            24: void   shell_init(void), shell_exec(void), shell_text(char *);
        !            25: void   endfor(void);
        !            26: 
        !            27: int    yyback(int *, int);
        !            28: int    yylook(void);
        !            29: int    yywrap(void);
        !            30: 
        !            31: #define        CADD    cbuf[clen++]=yytext[0]; \
        !            32:                if (clen>=CBUFLEN-1) { ERROR "string too long", cbuf WARNING; BEGIN A; }
        !            33: #define        CBUFLEN 500
        !            34: char   cbuf[CBUFLEN];
        !            35: int    c, clen, cflag, delim;
        !            36: int    ifsw    = 0;    /* 1 if if statement in progress */
        !            37: %}
        !            38: 
        !            39: A      [a-zA-Z_]
        !            40: B      [a-zA-Z0-9_]
        !            41: D      [0-9]
        !            42: WS     [ \t]
        !            43: 
        !            44: %%
        !            45:        switch (yybgin-yysvec-1) {      /* witchcraft */
        !            46:        case 0:
        !            47:                BEGIN A;
        !            48:                break;
        !            49:        case sc:
        !            50:                BEGIN A;
        !            51:                return('}');
        !            52:        case br:
        !            53:                BEGIN A;
        !            54:                return(']');
        !            55:        }
        !            56: 
        !            57: <A>{WS}                ;
        !            58: <A>"\\"\n      ;
        !            59: <A>\n          { return(ST); }
        !            60: <A>";"         { return(ST); }
        !            61: <A>"}"         { BEGIN sc; return(ST); }
        !            62: <A>"]"         { BEGIN br; return(ST); }
        !            63: 
        !            64: <A>^".PS".*    { if (curfile == infile) ERROR ".PS found inside .PS/.PE" WARNING; }
        !            65: <A>^"."P[EF].* { if (curfile == infile) {
        !            66:                        yylval.i = yytext[2];
        !            67:                        PEseen = 1;
        !            68:                        return(EOF);
        !            69:                  }
        !            70:                }
        !            71: <A>^".".*      { yylval.p = tostring(yytext); return(TROFF); }
        !            72: 
        !            73: <A>print       return(yylval.i = PRINT);
        !            74: <A>box         return(yylval.i = BOX);
        !            75: <A>circle      return(yylval.i = CIRCLE);
        !            76: <A>arc         return(yylval.i = ARC);
        !            77: <A>ellipse     return(yylval.i = ELLIPSE);
        !            78: <A>arrow       return(yylval.i = ARROW);
        !            79: <A>spline      return(yylval.i = SPLINE);
        !            80: <A>line                return(yylval.i = LINE);
        !            81: <A>move                return(yylval.i = MOVE);
        !            82: <A>"[]"                return(yylval.i = BLOCK);
        !            83: <A>reset       return(RESET);
        !            84: <A>sprintf     return(SPRINTF);
        !            85: 
        !            86: <A>same                return(SAME);
        !            87: <A>between     return(BETWEEN);
        !            88: <A>and         return(AND);
        !            89: 
        !            90: <A>of          ;
        !            91: <A>the         ;
        !            92: <A>way         ;
        !            93: 
        !            94: <A>"."(e|east)         { yylval.i = EAST; return(CORNER); }
        !            95: <A>"."(r|right)                { yylval.i = EAST; return(CORNER); }
        !            96: <A>"."(w|west)         { yylval.i = WEST; return(CORNER); }
        !            97: <A>"."(l|left)         { yylval.i = WEST; return(CORNER); }
        !            98: <A>"."(n|north)                { yylval.i = NORTH; return(CORNER); }
        !            99: <A>"."(t|top)          { yylval.i = NORTH; return(CORNER); }
        !           100: <A>"."(s|south)                { yylval.i = SOUTH; return(CORNER); }
        !           101: <A>"."(b|bot|bottom)   { yylval.i = SOUTH; return(CORNER); }
        !           102: <A>"."(c|center)       { yylval.i = CENTER; return(CORNER); }
        !           103: <A>".start"            { yylval.i = START; return(CORNER); }
        !           104: <A>".end"              { yylval.i = END; return(CORNER); }
        !           105: <A>".ne"               { yylval.i = NE; return(CORNER); }
        !           106: <A>".se"               { yylval.i = SE; return(CORNER); }
        !           107: <A>".nw"               { yylval.i = NW; return(CORNER); }
        !           108: <A>".sw"               { yylval.i = SW; return(CORNER); }
        !           109: 
        !           110: <A>top" "+of           { yylval.i = NORTH; return(CORNER); }
        !           111: <A>north" "+of         { yylval.i = NORTH; return(CORNER); }
        !           112: <A>bottom" "+of                { yylval.i = SOUTH; return(CORNER); }
        !           113: <A>south" "+of         { yylval.i = SOUTH; return(CORNER); }
        !           114: <A>left" "+of          { yylval.i = WEST; return(CORNER); }
        !           115: <A>west" "+of          { yylval.i = WEST; return(CORNER); }
        !           116: <A>right" "+of         { yylval.i = EAST; return(CORNER); }
        !           117: <A>east" "+of          { yylval.i = EAST; return(CORNER); }
        !           118: <A>center" "+of                { yylval.i = CENTER; return(CORNER); }
        !           119: <A>start" "+of         { yylval.i = START; return(CORNER); }
        !           120: <A>end" "+of           { yylval.i = END; return(CORNER); }
        !           121: 
        !           122: <A>height|ht   { yylval.i = HEIGHT; return(ATTR); }
        !           123: <A>width|wid   { yylval.i = WIDTH; return(ATTR); }
        !           124: <A>radius|rad  { yylval.i = RADIUS; return(ATTR); }
        !           125: <A>diameter|diam { yylval.i = DIAMETER; return(ATTR); }
        !           126: <A>size                { yylval.i = SIZE; return(ATTR); }
        !           127: <A>left                { yylval.i = LEFT; return(DIR); }
        !           128: <A>right       { yylval.i = RIGHT; return(DIR); }
        !           129: <A>up          { yylval.i = UP; return(DIR); }
        !           130: <A>down                { yylval.i = DOWN; return(DIR); }
        !           131: <A>cw          { yylval.i = CW; return(ATTR); }
        !           132: <A>clockwise   { yylval.i = CW; return(ATTR); }
        !           133: <A>ccw         { yylval.i = CCW; return(ATTR); }
        !           134: <A>invis(ible)?        { yylval.i = INVIS; return(ATTR); }
        !           135: <A>noedge      { yylval.i = INVIS; return ATTR; }
        !           136: <A>fill                { yylval.i = FILL; return ATTR; }
        !           137: <A>solid       ;
        !           138: <A>dot(ted)?   return(yylval.i = DOT);
        !           139: <A>dash(ed)?   return(yylval.i = DASH);
        !           140: <A>chop                return(yylval.i = CHOP);
        !           141: 
        !           142: <A>spread      { yylval.i = SPREAD; return TEXTATTR; }
        !           143: <A>ljust       { yylval.i = LJUST; return TEXTATTR; }
        !           144: <A>rjust       { yylval.i = RJUST; return TEXTATTR; }
        !           145: <A>above       { yylval.i = ABOVE; return TEXTATTR; }
        !           146: <A>below       { yylval.i = BELOW; return TEXTATTR; }
        !           147: <A>center      { yylval.i = CENTER; return TEXTATTR; }
        !           148: 
        !           149: <A>"<-"                { yylval.i = HEAD1; return(HEAD); }
        !           150: <A>"->"                { yylval.i = HEAD2; return(HEAD); }
        !           151: <A>"<->"       { yylval.i = HEAD12; return(HEAD); }
        !           152: 
        !           153: <A>".x"                        return(yylval.i = DOTX);
        !           154: <A>".y"                        return(yylval.i = DOTY);
        !           155: <A>"."(ht|height)      return(yylval.i = DOTHT);
        !           156: <A>"."(wid|width)      return(yylval.i = DOTWID);
        !           157: <A>"."(rad|radius)     return(yylval.i = DOTRAD);
        !           158: 
        !           159: <A>from                return(yylval.i = FROM);
        !           160: <A>to          return(yylval.i = TO);
        !           161: <A>at          return(yylval.i = AT);
        !           162: <A>by          return(yylval.i = BY);
        !           163: <A>with                return(yylval.i = WITH);
        !           164: <A>last                return(yylval.i = LAST);
        !           165: 
        !           166: <A>log         return(LOG);
        !           167: <A>exp         return(EXP);
        !           168: <A>sin         return(SIN);
        !           169: <A>cos         return(COS);
        !           170: <A>atan2       return(ATAN2);
        !           171: <A>sqrt                return(SQRT);
        !           172: <A>rand                return(RAND);
        !           173: <A>max         return(MAX);
        !           174: <A>min         return(MIN);
        !           175: <A>int         return(INT);
        !           176: 
        !           177: <A>"=="                return(EQ);
        !           178: <A>">="                return(GE);
        !           179: <A>"<="                return(LE);
        !           180: <A>"!="                return(NEQ);
        !           181: <A>">"         return(GT);
        !           182: <A>"<"         return(LT);
        !           183: <A>"&&"                return(ANDAND);
        !           184: <A>"||"                return(OROR);
        !           185: <A>"!"         return(NOT);    
        !           186: 
        !           187: <A>Here                return(yylval.i = HERE);
        !           188: 
        !           189: <A>for         return(FOR);
        !           190: <A>^Endfor\n   { endfor(); }
        !           191: <A>do          { yylval.p = delimstr("loop body"); return(DOSTR); }
        !           192: 
        !           193: <A>copy|include                return(COPY);
        !           194: <A>(thru|through){WS}+ { BEGIN thru; return(THRU); }
        !           195: <thru>{A}{B}*|.                { yylval.st = copythru(yytext); BEGIN A; return(DEFNAME); }
        !           196: <A>until               return(UNTIL);
        !           197: 
        !           198: <A>if          { ifsw = 1; return(IF); }
        !           199: <A>then                { if (!ifsw) { yylval.i = THEN; return(ATTR); }
        !           200:                  yylval.p = delimstr("then part"); ifsw = 0;
        !           201:                  return(THENSTR); }
        !           202: <A>else                { yylval.p = delimstr("else part"); return(ELSESTR); }
        !           203: 
        !           204: <A>sh{WS}+     { BEGIN sh;
        !           205:                  if ((delim = input()) == '{') delim = '}';    /* no nested {} */
        !           206:                  shell_init(); }
        !           207: <sh>{A}{B}*    { struct symtab *p;
        !           208:                  if (yytext[0] == delim) {
        !           209:                        shell_exec();
        !           210:                        BEGIN A;
        !           211:                  } else {
        !           212:                        p = lookup(yytext);
        !           213:                        if (p != NULL && p->s_type == DEFNAME) {
        !           214:                                c = input();
        !           215:                                unput(c);
        !           216:                                if (c == '(')
        !           217:                                        dodef(p);
        !           218:                                else
        !           219:                                        pbstr(p->s_val.p);
        !           220:                        } else
        !           221:                                shell_text(yytext);
        !           222:                  }
        !           223:                }
        !           224: <sh>.|\n       { if (yytext[0] == delim) {
        !           225:                        shell_exec();
        !           226:                        BEGIN A;
        !           227:                  } else
        !           228:                        shell_text(yytext);
        !           229:                }
        !           230: 
        !           231: <A>define{WS}+         { BEGIN def; }
        !           232: <def>{A}{B}*           { definition(yytext); BEGIN A; }
        !           233: <A>undef(ine)?{WS}+{A}{B}*     { undefine(yytext); }
        !           234: 
        !           235: <A>first               { yylval.i = 1; return(NTH); }
        !           236: <A>{D}+(th|nd|rd|st)   { yylval.i = atoi(yytext); return(NTH); }
        !           237: <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?i? {
        !           238:                        yylval.f = atof(yytext); return(NUMBER); }
        !           239: 
        !           240: <A>{A}{B}* {   struct symtab *p;
        !           241:                p = lookup(yytext);
        !           242:                if (p != NULL && p->s_type == DEFNAME) {
        !           243:                        c = input();
        !           244:                        unput(c);
        !           245:                        if (c == '(')   /* it's name(...) */
        !           246:                                dodef(p);
        !           247:                        else {  /* no argument list */
        !           248:                                pbstr(p->s_val.p);
        !           249:                                dprintf("pushing back `%s'\n", p->s_val.p);
        !           250:                        }
        !           251:                } else if (islower(yytext[0])) {
        !           252:                        yylval.p = tostring(yytext);
        !           253:                        return(VARNAME);
        !           254:                } else {
        !           255:                        yylval.p = tostring(yytext);
        !           256:                        return(PLACENAME);
        !           257:                }
        !           258:        }
        !           259: 
        !           260: <A>\"          { BEGIN str; clen=0; }
        !           261: <str>\"                { cbuf[clen]=0; yylval.p = tostring(cbuf); BEGIN A; return(TEXT); }
        !           262: <str>\n                { cbuf[clen]=0; ERROR "missing quote in string \"%s\"", cbuf WARNING;
        !           263:                                BEGIN A; return(ST); }
        !           264: <str>"\\\""    { cbuf[clen++]='"'; }
        !           265: <str>"\\"t     { cbuf[clen++]='\t'; }
        !           266: <str>"\\\\"    { cbuf[clen++]='\\'; }
        !           267: <str>.         { CADD; }
        !           268: 
        !           269: <A>#.*         ;
        !           270: 
        !           271: <A>.           return(yylval.i = yytext[0]);
        !           272: 
        !           273: %%

unix.superglobalmegacorp.com

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