|
|
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.