Annotation of researchv9/cmd/grap/grapl.l, revision 1.1

1.1     ! root        1: %Start A str def thru sh
        !             2: 
        !             3: %{
        !             4: #undef input
        !             5: #undef unput
        !             6: #include <stdio.h>
        !             7: #include <ctype.h>
        !             8: #include "grap.h"
        !             9: #include "y.tab.h"
        !            10: 
        !            11: extern struct  symtab  symtab[];
        !            12: 
        !            13: #define        CADD    cbuf[clen++]=yytext[0]; if(clen>=CBUFLEN-1) {yyerror("string too long", cbuf); BEGIN A;}
        !            14: #define        CBUFLEN 1500
        !            15: char   cbuf[CBUFLEN];
        !            16: int    clen, cflag;
        !            17: int    c, delim, shcnt;
        !            18: %}
        !            19: 
        !            20: A      [a-zA-Z_]
        !            21: B      [a-zA-Z0-9_]
        !            22: D      [0-9]
        !            23: WS     [ \t]
        !            24: 
        !            25: %%
        !            26:        if (yybgin-yysvec-1 == 0) {     /* witchcraft */
        !            27:                BEGIN A;
        !            28:        }
        !            29: 
        !            30: <A>{WS}                ;
        !            31: <A>"\\"\n      ;
        !            32: <A>\n          return(ST);
        !            33: <A>";"         return(ST);
        !            34: 
        !            35: <A>line                return(yylval.i = LINE);
        !            36: <A>arrow       { yylval.i = ARROW; return(LINE); }
        !            37: <A>circle      return(yylval.i = CIRCLE);
        !            38: <A>frame       return(FRAME);
        !            39: <A>tick(s)?    return(TICKS);
        !            40: <A>grid(line)?(s)?     return(GRID);
        !            41: <A>coord(s)?   return(COORD);
        !            42: <A>log         return(LOG);
        !            43: <A>exp         return(EXP);
        !            44: <A>sin         return(SIN);
        !            45: <A>cos         return(COS);
        !            46: <A>atan2       return(ATAN2);
        !            47: <A>sqrt                return(SQRT);
        !            48: <A>rand                return(RAND);
        !            49: <A>max         return(MAX);
        !            50: <A>min         return(MIN);
        !            51: <A>int         return(INT);
        !            52: <A>print       return(PRINT);
        !            53: <A>sprintf     return(SPRINTF);
        !            54: <A>pic{WS}.*   { yylval.p = tostring(yytext+3); return(PIC); }
        !            55: <A>graph{WS}.* { yylval.p = tostring(yytext+5); return(GRAPH); }
        !            56: 
        !            57: <A>for         return(FOR);
        !            58: <A>^Endfor\n   { endfor(); }
        !            59: <A>do          { yylval.p = delimstr("loop body"); BEGIN A; return(DOSTR); }
        !            60: 
        !            61: <A>copy|include        { return(COPY); }
        !            62: <A>thru|through        { BEGIN thru; return(THRU); }
        !            63: <thru>{WS}+    ;
        !            64: <thru>{A}{B}*|.        { yylval.op = copythru(yytext); BEGIN A; return(DEFNAME); }
        !            65: <A>until       return(UNTIL);
        !            66: 
        !            67: <A>if          return(IF);
        !            68: <A>then                { yylval.p = delimstr("then part"); BEGIN A; return(THEN); }
        !            69: <A>else                { yylval.p = delimstr("else part"); BEGIN A; return(ELSE); }
        !            70: 
        !            71: <A>next                return(NEXT);
        !            72: <A>draw                return(yylval.i = DRAW);
        !            73: <A>new         return(yylval.i = NEW);
        !            74: <A>plot                return(yylval.i = PLOT);
        !            75: <A>label(s)?   return(LABEL);
        !            76: <A>x           return(X);
        !            77: <A>y           return(Y);
        !            78: 
        !            79: <A>top         { yylval.i = TOP; return SIDE; }
        !            80: <A>bot(tom)?   { yylval.i = BOT; return SIDE; }
        !            81: <A>left                { yylval.i = LEFT; return SIDE; }
        !            82: <A>right       { yylval.i = RIGHT; return SIDE; }
        !            83: <A>up          return(yylval.i = UP);
        !            84: <A>down                return(yylval.i = DOWN);
        !            85: <A>across      return(yylval.i = ACROSS);
        !            86: <A>height|ht   return(yylval.i = HEIGHT);
        !            87: <A>wid(th)?    return(yylval.i = WIDTH);
        !            88: <A>rad(ius)?   return(yylval.i = RADIUS);
        !            89: <A>invis       return(yylval.i = INVIS);
        !            90: <A>dot(ted)    return(yylval.i = DOT);
        !            91: <A>dash(ed)    return(yylval.i = DASH);
        !            92: <A>solid       return(yylval.i = SOLID);
        !            93: 
        !            94: <A>ljust       { yylval.i = LJUST; return JUST; }
        !            95: <A>rjust       { yylval.i = RJUST; return JUST; }
        !            96: <A>above       { yylval.i = ABOVE; return JUST; }
        !            97: <A>below       { yylval.i = BELOW; return JUST; }
        !            98: <A>size                return(yylval.i = SIZE);
        !            99: 
        !           100: <A>from                return(yylval.i = FROM);
        !           101: <A>to          return(yylval.i = TO);
        !           102: <A>by|step     return(yylval.i = BY);
        !           103: <A>at          return(yylval.i = AT);
        !           104: <A>with                return(yylval.i = WITH);
        !           105: <A>in          return(yylval.i = IN);
        !           106: <A>out         return(yylval.i = OUT);
        !           107: <A>off         return(yylval.i = OFF);
        !           108: 
        !           109: <A>sh{WS}+ {   BEGIN sh;
        !           110:                if ((delim = input()) == '{') {
        !           111:                        shcnt = 1;
        !           112:                        delim = '}';
        !           113:                }
        !           114:                shell_init();
        !           115:        }
        !           116: <sh>{A}{B}* {
        !           117:                int c;
        !           118:                Obj *p;
        !           119:                if (yytext[0] == delim) {
        !           120:                        shell_exec();
        !           121:                        BEGIN A;
        !           122:                } else {
        !           123:                        p = lookup(yytext, 0);
        !           124:                        if (p != NULL && p->type == DEFNAME) {
        !           125:                                c = input();
        !           126:                                unput(c);
        !           127:                                if (c == '(')
        !           128:                                        dodef(p);
        !           129:                                else
        !           130:                                        pbstr(p->val);
        !           131:                        } else
        !           132:                                shell_text(yytext);
        !           133:                }
        !           134:        }
        !           135: <sh>"{"                { shcnt++; shell_text(yytext); }
        !           136: <sh>"}"                { if (delim != '}' || --shcnt > 0)
        !           137:                        shell_text(yytext);
        !           138:                  else {
        !           139:                        shell_exec();
        !           140:                        BEGIN A;
        !           141:                  }
        !           142:                }
        !           143: <sh>.|\n       { if (yytext[0] == delim) {
        !           144:                        shell_exec();
        !           145:                        BEGIN A;
        !           146:                  } else
        !           147:                        shell_text(yytext);
        !           148:                }
        !           149: 
        !           150: <A>define{WS}+ { BEGIN def; }
        !           151: <def>{A}{B}*   { definition(yytext); BEGIN A; }
        !           152: 
        !           153: <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?i? {
        !           154:                  yylval.f = atof(yytext); return(NUMBER); }
        !           155: 
        !           156: <A>^"."[^0-9].*        { if (yytext[1] == 'G' && yytext[2] == '2') {
        !           157:                        yylval.i = yytext[2];
        !           158:                        return(EOF);
        !           159:                  } else {
        !           160:                        yylval.p = tostring(yytext);
        !           161:                        return(PIC);
        !           162:                  }
        !           163:                }
        !           164: 
        !           165: <A>{A}{B}* {
        !           166:                int c;
        !           167:                Obj *p;
        !           168:                p = lookup(yytext, 1);
        !           169:                if (p->type == DEFNAME) {
        !           170:                        c = input();
        !           171:                        unput(c);
        !           172:                        if (c == '(')   /* it's name(...) */
        !           173:                                dodef(p);
        !           174:                        else    /* no argument list */
        !           175:                                pbstr(p->val);
        !           176:                } else {
        !           177:                        yylval.op = p;
        !           178:                        return p->type; /* NAME or VARNAME */
        !           179:                }
        !           180:        }
        !           181: 
        !           182: <A>"=="                return(EQ);
        !           183: <A>">="                return(GE);
        !           184: <A>"<="                return(LE);
        !           185: <A>"!="                return(NE);
        !           186: <A>">"         return(GT);
        !           187: <A>"<"         return(LT);
        !           188: <A>"&&"                return(AND);
        !           189: <A>"||"                return(OR);
        !           190: <A>"!"         return(NOT);    
        !           191: 
        !           192: <A>\"          { BEGIN str; clen = 0; }
        !           193: 
        !           194: <A>#.*         ;
        !           195: 
        !           196: <A>.           { yylval.i = yytext[0]; return(yytext[0]); }
        !           197: 
        !           198: <str>\"                { BEGIN A; cbuf[clen] = 0;
        !           199:                  yylval.p = tostring(cbuf); return(STRING); }
        !           200: <str>\n                { yyerror("newline in string"); BEGIN A; return(ST); }
        !           201: <str>"\\\""    { cbuf[clen++] = '\\'; cbuf[clen++] = '"'; }
        !           202: <str>"\\\\"    { cbuf[clen++] = '\\'; cbuf[clen++] = '\\'; }
        !           203: <str>.         { CADD; }
        !           204: 
        !           205: %%

unix.superglobalmegacorp.com

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