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