URI:
       tpicl.lx - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tpicl.lx (7549B)
       ---
            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" 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 <A>"{"{WS}*(#.*)?\n+        { return(yylval.i = yytext[0]); }
           64 
           65 <A>^".PS".*        { if (curfile == infile) ERROR ".PS found inside .PS/.PE" WARNING; }
           66 <A>^".PE".*        { if (curfile == infile) {
           67                         yylval.p = PEstring = tostring(yytext);
           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((unsigned char)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 %%