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