|
|
1.1 ! root 1: %{ ! 2: #include "picasso.h" ! 3: YYSTYPE y; ! 4: %} ! 5: ! 6: %token <i> BOX 1 /* DON'T CHANGE THESE! */ ! 7: %token <i> LINE 2 /* (or at least use care; some */ ! 8: %token <i> ARROW 3 /* code requires real primitves */ ! 9: %token <i> CIRCLE 4 /* to have token value <= TEXT */ ! 10: %token <i> ELLIPSE 5 /* (these have bounding boxes & */ ! 11: %token <i> ARC 6 /* line & color attributes.) */ ! 12: %token <i> SECTOR 7 ! 13: %token <i> SPLINE 8 ! 14: %token <i> BLOCK 9 ! 15: %token <i> PSFILE 10 ! 16: %token <p> TEXT 11 ! 17: %token <i> TROFF 12 ! 18: %token <i> MOVE 13 ! 19: %token <i> BLOCKEND 14 ! 20: %token <i> PLACE 15 ! 21: %token <i> OBJECT 16 ! 22: %token <i> TEXTOBJ 17 ! 23: %token <i> PRINT RESET SHOW THRU UNTIL ! 24: %token <o> FOR IF COPY ! 25: %token <o> DUP DELETE ! 26: %token <p> THENSTR ELSESTR DOSTR DEFNAME PLACENAME VARNAME SPRINTF ! 27: %token <i> ATTR TEXTATTR LAYER COLOR LCOLOR PCOLOR TCOLOR LWEIGHT NOEDGE ! 28: %token <i> LEFT RIGHT UP DOWN FONT SIZE SPACE ! 29: %token <p> TEXTVAR ! 30: %token <i> FROM TO AT BY WITH HEAD CW CCW THEN ! 31: %token <i> HEIGHT WIDTH RADIUS DIAMETER LENGTH LOCUS XLIST YLIST ! 32: %token <i> CORNER HERE LAST NTH DOTNTH SAME BETWEEN AND ! 33: %token <i> EAST WEST NORTH SOUTH NE NW SE SW START END ! 34: %token <i> TRANSFORM TRANSLATE ROTATE SCALE REFLECT ! 35: %token <i> DOTX DOTY DOTHT DOTWID DOTRAD ! 36: %token <f> NUMBER ! 37: %token <f> ABS LOG LOG10 EXP POW SIN COS ATAN2 SQRT ! 38: %token <f> RAND MIN MAX INT RGB SETFONT ! 39: %token <i> DIR ! 40: %token <i> DOT DASH DASHPAT CHOP ! 41: %token <o> ST /* statement terminator */ ! 42: ! 43: %right <f> '=' ! 44: %left <f> OROR ! 45: %left <f> ANDAND ! 46: %nonassoc <f> GT LT LE GE EQ NEQ ! 47: %left <f> '+' '-' ! 48: %left <f> '*' '/' '%' ! 49: %right <f> UMINUS NOT ! 50: ! 51: %type <f> expr if_expr asgn ! 52: %type <p> text ! 53: %type <i> atto optby optop exprlist ! 54: %type <o> if for copy ! 55: ! 56: %type <o> leftbrace picture piclist position lbracket ! 57: %type <o> prim place objname blockname show transform dup ! 58: %type <i> textlist textattr /* not a sensible value */ ! 59: %type <i> last type ! 60: ! 61: %% ! 62: ! 63: top: ! 64: piclist ! 65: | /* empty */ ! 66: | error { yyerror("syntax error"); } ! 67: ; ! 68: ! 69: piclist: ! 70: picture ! 71: | piclist picture ! 72: ; ! 73: ! 74: picture: ! 75: prim ST { codegen = 1; makeiattr(0, 0); } ! 76: | leftbrace piclist '}' { rightthing($1, '}'); $$ = $2; } ! 77: | PLACENAME ':' picture { $$=y.o=$3; makevar($1,PLACENAME,y); } ! 78: | PLACENAME ':' ST picture { $$=y.o=$4; makevar($1,PLACENAME,y); } ! 79: | PLACENAME ':' position ST { $$=y.o=$3; makevar($1,PLACENAME,y); } ! 80: | asgn ST { y.f = $1; /* ??? */ $$ = y.o; } ! 81: | dup ST ! 82: | transform ST ! 83: | DIR { setdir($1); } ! 84: | PRINT expr ST { printexpr($2); } ! 85: | PRINT position ST { printpos($2); } ! 86: | PRINT text ST { fprintf(stderr,"%s\n",$2);free($2); } ! 87: | RESET varlist ST { resetvar(); makeiattr(0, 0); } ! 88: | DELETE objname ST { freenode($2); } ! 89: | show ST ! 90: | copy ST ! 91: | for ! 92: | if ! 93: | ST ! 94: ; ! 95: ! 96: varlist: ! 97: /* empty */ ! 98: | VARNAME { makevattr($1); } ! 99: | varlist VARNAME { makevattr($2); } ! 100: | varlist ',' VARNAME { makevattr($3); } ! 101: ; ! 102: ! 103: dup: ! 104: DUP objname atto '(' VARNAME ',' VARNAME ')' { $$=copyobj($2,$5,$7); } ! 105: | DUP objname atto position { $$ = copypos($2,$4); } ! 106: | DUP objname { $$ = copypos($2,$2); } ! 107: ! 108: copy: ! 109: COPY copylist {/* lexical */ copy(); } ! 110: ; ! 111: ! 112: atto: ! 113: AT ! 114: | TO ! 115: ; ! 116: ! 117: copylist: ! 118: copyattr ! 119: | copylist copyattr ! 120: ; ! 121: copyattr: ! 122: text { copyfile($1); } ! 123: | THRU DEFNAME { copydef($2); } ! 124: | UNTIL text { copyuntil($2); } ! 125: ; ! 126: ! 127: show: ! 128: SHOW expr FROM position TO position ! 129: { if (batch) print_layer_bnd($2, $4, $6); } ! 130: | SHOW FROM position TO position ! 131: { if (batch) print_bnd($3, $5); } ! 132: | SHOW objname { if (batch) print_obj($2); } ! 133: | SHOW expr { if (batch) print_layer($2); } ! 134: | SHOW { if (batch) print(0); } ! 135: ! 136: for: ! 137: FOR VARNAME FROM expr TO expr BY optop expr DOSTR ! 138: { forloop($2, $4, $6, $8, $9, $10); } ! 139: | FOR VARNAME FROM expr TO expr DOSTR ! 140: { forloop($2, $4, $6, '+', 1.0, $7); } ! 141: | FOR VARNAME '=' expr TO expr BY optop expr DOSTR ! 142: { forloop($2, $4, $6, $8, $9, $10); } ! 143: | FOR VARNAME '=' expr TO expr DOSTR ! 144: { forloop($2, $4, $6, '+', 1.0, $7); } ! 145: ; ! 146: ! 147: if: ! 148: IF if_expr THENSTR ELSESTR { ifstat($2, $3, $4); } ! 149: | IF if_expr THENSTR { ifstat($2, $3, (char *) 0); } ! 150: ; ! 151: if_expr: ! 152: expr ! 153: | text EQ text { $$ = strcmp($1,$3) == 0; free($1); free($3); } ! 154: | text NEQ text { $$ = strcmp($1,$3) != 0; free($1); free($3); } ! 155: ; ! 156: ! 157: optop: ! 158: '+' { $$ = '+'; } ! 159: | '-' { $$ = '-'; } ! 160: | '*' { $$ = '*'; } ! 161: | '/' { $$ = '/'; } ! 162: | /* empty */ { $$ = ' '; } ! 163: ; ! 164: ! 165: ! 166: leftbrace: ! 167: '{' { $$ = leftthing('{'); } ! 168: ; ! 169: ! 170: prim: ! 171: BOX attrlist { $$ = boxgen(); } ! 172: | CIRCLE attrlist { $$ = circgen($1); } ! 173: | ELLIPSE attrlist { $$ = circgen($1); } ! 174: | ARC attrlist { $$ = arcgen($1); } ! 175: | SECTOR attrlist { $$ = arcgen($1); } ! 176: | LINE attrlist { $$ = linegen($1); } ! 177: | ARROW attrlist { $$ = linegen($1); } ! 178: | SPLINE attrlist { $$ = linegen($1); } ! 179: | MOVE attrlist { $$ = movegen(); } ! 180: | PSFILE attrlist { $$ = picgen(); } ! 181: | textlist attrlist { $$ = textgen(); } ! 182: | TROFF { $$ = troffgen($1); } ! 183: | lbracket piclist ']' { $<o>$=rightthing($1,']'); } attrlist ! 184: { $$ = blockgen($1); } ! 185: ; ! 186: ! 187: lbracket: ! 188: '[' { $$ = leftthing('['); } ! 189: ; ! 190: ! 191: attrlist: ! 192: attrlist attr ! 193: | /* empty */ ! 194: ; ! 195: ! 196: attr: ! 197: ATTR expr { makefattr($1, !DEFAULT, $2); } ! 198: | ATTR { makefattr($1, DEFAULT, 0.0); } ! 199: | COLOR expr { makefattr($1, !DEFAULT, checkcolor($2)); } ! 200: | COLOR { makefattr($1, DEFAULT, 0.0); } ! 201: | expr { makefattr(curdir(), !DEFAULT, $1); } ! 202: | DIR expr { makefattr($1, !DEFAULT, $2); } ! 203: | DIR { makefattr($1, DEFAULT, 0.0); } ! 204: | FROM position { makeoattr($1, $2); } ! 205: | LOCUS '(' VARNAME ',' VARNAME ')' { makelattr($3, $5); } ! 206: | TO position { makeoattr($1, $2); } ! 207: | AT position { makeoattr($1, $2); } ! 208: | BY position { makeoattr($1, $2); } ! 209: | WITH CORNER { makeiattr(WITH, $2); } ! 210: | WITH DOTNTH { makeiattr(WITH, $2); } ! 211: | WITH '.' PLACENAME ! 212: { makeoattr(PLACE,getblock(getlast(1,BLOCK),$3)); } ! 213: | WITH '.' PLACENAME CORNER ! 214: { makeoattr(PLACE,getpos(getblock(getlast(1,BLOCK),$3),$4)); } ! 215: | WITH position { makeoattr(PLACE, $2); /* ??? */ } ! 216: | SAME { makeiattr(SAME, $1); } ! 217: | FONT expr { makefattr($1, !DEFAULT, checkfont($2)); } ! 218: | FONT TEXT { makefattr($1, !DEFAULT, setfont($2)); } ! 219: | SIZE optop expr { makefattr($1, $2, $3); } ! 220: | SPACE optop expr { makefattr($1, $2, $3); } ! 221: | TEXTATTR { maketattr($1, (char *) 0); } ! 222: | HEAD { makeiattr(HEAD, $1); } ! 223: | CHOP { makefattr(CHOP, DEFAULT, -1.0); } ! 224: | CHOP expr { makefattr(CHOP, !DEFAULT, $2); } ! 225: | DOT { makefattr(DOT, DEFAULT, 0.0); } ! 226: | DOT expr { makefattr(DOT, !DEFAULT, $2); } ! 227: | DASH { makefattr(DASH, DEFAULT, 0.0); } ! 228: | DASH expr { makefattr(DASH, !DEFAULT, $2); } ! 229: | DASHPAT VARNAME { makedattr($2); } ! 230: | DASHPAT '(' exprlist ')' { makedattr((char *)0); } ! 231: | textlist ! 232: ; ! 233: ! 234: textlist: ! 235: textattr ! 236: | textlist textattr ! 237: ; ! 238: textattr: ! 239: text { maketattr(DEFAULT, $1); } ! 240: | text TEXTATTR { maketattr($2, $1); } ! 241: | textattr TEXTATTR { addtattr($2); } ! 242: ; ! 243: text: ! 244: TEXT ! 245: | SPRINTF '(' text ')' { $$ = sprintgen($3); } ! 246: | SPRINTF '(' text ',' exprlist ')' { $$ = sprintgen($3); } ! 247: ; ! 248: ! 249: exprlist: ! 250: '(' exprlist ')' { $$ = $2; } ! 251: | expr { $$ = exprsave($1); } ! 252: | exprlist expr { $$ = exprsave($2); } ! 253: | exprlist ',' expr { $$ = exprsave($3); } ! 254: ; ! 255: ! 256: position: /* absolute, not relative */ ! 257: place ! 258: | '(' position ')' { $$ = $2; } ! 259: | expr ',' expr { $$ = makepos($1, $3, ! 260: 0, (obj *)0); } ! 261: | position '+' expr ',' expr { $$ = fixpos($1, $3, $5); } ! 262: | position '-' expr ',' expr { $$ = fixpos($1, -$3, -$5); } ! 263: | position '+' '(' expr ',' expr ')' { $$ = fixpos($1, $4, $6); } ! 264: | position '-' '(' expr ',' expr ')' { $$ = fixpos($1, -$4, -$6); } ! 265: | position '+' place { $$ = addpos($1, $3); } ! 266: | position '-' place { $$ = subpos($1, $3); } ! 267: | '(' place ',' place ')' ! 268: { $$ = makepos(getcomp($2,DOTX), getcomp($4,DOTY), ! 269: 0, (obj *)0); } ! 270: | expr LT position ',' position GT { $$ = makebetween($1,$3,$5); } ! 271: | expr BETWEEN position AND position { $$ = makebetween($1,$3,$5); } ! 272: ; ! 273: ! 274: place: ! 275: objname { $$ = getpos($1, -1); } ! 276: | objname CORNER { $$ = getpos($1, $2); } ! 277: | CORNER objname { $$ = getpos($2, $1); } ! 278: | objname DOTNTH { $$ = getnth($1, $2); } ! 279: | HERE { $$ = gethere(); } ! 280: ; ! 281: ! 282: objname: ! 283: PLACENAME { y = getvar($1); $$ = y.o; } ! 284: | last type { $$ = getlast($1, $2); } ! 285: | NTH type { $$ = getfirst($1, $2); } ! 286: | blockname ! 287: ; ! 288: ! 289: blockname: ! 290: last BLOCK '.' PLACENAME { $$ = getblock(getlast($1,$2), $4); } ! 291: | NTH BLOCK '.' PLACENAME { $$ = getblock(getfirst($1,$2), $4); } ! 292: | PLACENAME '.' PLACENAME { y=getvar($1); $$=getblock(y.o, $3); } ! 293: ; ! 294: ! 295: last: ! 296: last LAST { $$ = $1 + 1; } ! 297: | NTH LAST { $$ = $1; } ! 298: | LAST { $$ = 1; } ! 299: ; ! 300: ! 301: type: ! 302: BOX ! 303: | CIRCLE ! 304: | ELLIPSE ! 305: | ARC ! 306: | SECTOR ! 307: | LINE ! 308: | ARROW ! 309: | SPLINE ! 310: | BLOCK ! 311: | OBJECT ! 312: | PSFILE ! 313: | TEXTOBJ ! 314: ; ! 315: ! 316: transform: ! 317: TRANSLATE place optby position ! 318: { $$=$2; xlate($2, $4); } ! 319: | MOVE place TO position ! 320: { $$=$2; xlate_to($2, $4); } ! 321: | TRANSLATE optby position ! 322: { y=getvar("O"); $$=y.o; xlate(y.o,$3); } ! 323: | SCALE '=' expr { rescale($3); } ! 324: | SCALE place optby exprlist ! 325: { $$=$2; scale($2, $4, $2); } ! 326: | SCALE optby exprlist ! 327: { y=getvar("O"); $$=y.o; scale(y.o,$3,NULL); } ! 328: | SCALE place optby exprlist AT position ! 329: { $$=$2; scale($2, $4, $6); } ! 330: | SCALE optby exprlist AT position ! 331: { y=getvar("O"); $$=y.o; scale(y.o,$3,$5); } ! 332: | ROTATE place optby expr ! 333: { $$=$2; rotate($2, $4, $2); } ! 334: | ROTATE optby expr ! 335: { y=getvar("O"); $$=y.o; rotate(y.o,$3,NULL); } ! 336: | ROTATE place optby expr AT position ! 337: { $$=$2; rotate($2, $4, $6); } ! 338: | ROTATE optby expr AT position ! 339: { y=getvar("O"); $$=y.o; rotate(y.o,$3,$5); } ! 340: | REFLECT place ! 341: { $$=$2; reflect($2,$2); } ! 342: | REFLECT place AT position ! 343: { $$=$2; reflect($2,$4); } ! 344: | REFLECT AT position ! 345: { y=getvar("O"); $$=y.o; reflect(y.o,$3); } ! 346: | TRANSFORM place optby exprlist ! 347: { $$=$2; xform($2,$4); } ! 348: | TRANSFORM optby exprlist ! 349: { y=getvar("O"); $$=y.o; xform(y.o,$3); } ! 350: ; ! 351: ! 352: optby: ! 353: BY { $$ = BY; } ! 354: | { $$ = ' '; } ! 355: ; ! 356: ! 357: asgn: ! 358: VARNAME '=' exprlist { $$ = setarray($1); } ! 359: | VARNAME DOTNTH '=' expr { $$ = setvar($1,$2,$4); } ! 360: | TEXTVAR '=' expr { $$ = setsize($1,$3); } ! 361: /* | ATTR '(' objname ')' '=' expr { $$ = setattr($3,$1,$6);} */ ! 362: /* | COLOR '(' objname ')' '=' expr { $$ = setattr($3,$1,$6);} */ ! 363: ; ! 364: ! 365: expr: ! 366: NUMBER ! 367: | VARNAME DOTNTH { $$ = getsub($1,$2); free($1); } ! 368: | VARNAME { $$ = getfval($1); free($1); } ! 369: | TEXTVAR { $$ = getfval($1); free($1); } ! 370: | asgn ! 371: | expr '+' expr { $$ = $1 + $3; } ! 372: | expr '-' expr { $$ = $1 - $3; } ! 373: | expr '*' expr { $$ = $1 * $3; } ! 374: | expr '/' expr { if ($3 == 0.0) { ! 375: yyerror("division by 0"); $3 = 1; } ! 376: $$ = $1 / $3; } ! 377: | expr '%' expr { if ((long)$3 == 0) { ! 378: yyerror("mod division by 0"); $3 = 1; } ! 379: $$ = (long)$1 % (long)$3; } ! 380: | '-' expr %prec UMINUS { $$ = -$2; } ! 381: | '(' expr ')' { $$ = $2; } ! 382: | place DOTX { $$ = getcomp($1, $2); } ! 383: | place DOTY { $$ = getcomp($1, $2); } ! 384: | place DOTHT { $$ = getcomp($1, $2); } ! 385: | place DOTWID { $$ = getcomp($1, $2); } ! 386: | place DOTRAD { $$ = getcomp($1, $2) / 2.0; } ! 387: | PLACENAME '.' VARNAME { y = getvar($1); $$ = getblkvar(y.o, $3); } ! 388: | last BLOCK '.' VARNAME { $$ = getblkvar(getlast($1,$2), $4); } ! 389: | NTH BLOCK '.' VARNAME { $$ = getblkvar(getfirst($1,$2), $4); } ! 390: | expr GT expr { $$ = $1 > $3; } ! 391: | expr LT expr { $$ = $1 < $3; } ! 392: | expr LE expr { $$ = $1 <= $3; } ! 393: | expr GE expr { $$ = $1 >= $3; } ! 394: | expr EQ expr { $$ = $1 == $3; } ! 395: | expr NEQ expr { $$ = $1 != $3; } ! 396: | expr ANDAND expr { $$ = $1 && $3; } ! 397: | expr OROR expr { $$ = $1 || $3; } ! 398: | NOT expr { $$ = !($2); } ! 399: | ABS '(' expr ')' { $$ = fabs($3); } ! 400: | LOG '(' expr ')' { $$ = Log($3); } ! 401: | LOG10 '(' expr ')' { $$ = Log10($3); } ! 402: | EXP '(' expr ')' { $$ = Exp($3); } ! 403: | SIN '(' expr ')' { $$ = Sin($3); } ! 404: | COS '(' expr ')' { $$ = Cos($3); } ! 405: | POW '(' expr ',' expr ')' { $$ = Pow($3, $5); } ! 406: | ATAN2 '(' expr ',' expr ')' { $$ = Atan2($3, $5); } ! 407: | SQRT '(' expr ')' { $$ = Sqrt($3); } ! 408: | RAND '(' ')' { $$ = (float)rand() / 32767.0; /* might be 2^31-1 */ } ! 409: | MAX '(' VARNAME ')' { $$ = Maxvar($3); } ! 410: | MAX '(' exprlist ')' { $$ = Maxlist(); } ! 411: | MIN '(' VARNAME ')' { $$ = Minvar($3); } ! 412: | MIN '(' exprlist ')' { $$ = Minlist(); } ! 413: | INT '(' expr ')' { $$ = (long) $3; } ! 414: | RGB '(' exprlist ')' { $$ = setrgbindex(); } ! 415: | SETFONT '(' TEXT ')' { $$ = setfont($3); } ! 416: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.