Annotation of researchv10no/cmd/pic/picl.l, revision 1.1.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.