2 5cedca1b 2004-05-15 devnull #include <stdio.h>
3 5cedca1b 2004-05-15 devnull #include <math.h>
4 5cedca1b 2004-05-15 devnull #include <stdlib.h>
5 5cedca1b 2004-05-15 devnull #include <string.h>
6 5cedca1b 2004-05-15 devnull #include "grap.h"
8 cbeb0b26 2006-04-01 devnull /*#define RAND_MAX 32767 /* if your rand() returns bigger, change this too */
10 5cedca1b 2004-05-15 devnull extern int yylex(void);
11 5cedca1b 2004-05-15 devnull extern int yyparse(void);
15 5cedca1b 2004-05-15 devnull %token <i> FRAME TICKS GRID LABEL COORD
16 5cedca1b 2004-05-15 devnull %token <i> LINE ARROW CIRCLE DRAW NEW PLOT NEXT
17 5cedca1b 2004-05-15 devnull %token <p> PIC
18 5cedca1b 2004-05-15 devnull %token <i> COPY THRU UNTIL
19 5cedca1b 2004-05-15 devnull %token <i> FOR FROM TO BY AT WITH
20 5cedca1b 2004-05-15 devnull %token <i> IF
21 5cedca1b 2004-05-15 devnull %token <p> GRAPH THEN ELSE DOSTR
22 5cedca1b 2004-05-15 devnull %token <i> DOT DASH INVIS SOLID
23 5cedca1b 2004-05-15 devnull %token <i> TEXT JUST SIZE
24 5cedca1b 2004-05-15 devnull %token <i> LOG EXP SIN COS ATAN2 SQRT RAND MAX MIN INT PRINT SPRINTF
25 5cedca1b 2004-05-15 devnull %token <i> X Y SIDE IN OUT OFF UP DOWN ACROSS
26 5cedca1b 2004-05-15 devnull %token <i> HEIGHT WIDTH RADIUS
27 5cedca1b 2004-05-15 devnull %token <f> NUMBER
28 5cedca1b 2004-05-15 devnull %token <op> NAME VARNAME DEFNAME
29 5cedca1b 2004-05-15 devnull %token <p> STRING
30 5cedca1b 2004-05-15 devnull %token <i> ST '(' ')' ','
32 5cedca1b 2004-05-15 devnull %right <f> '='
33 5cedca1b 2004-05-15 devnull %left <f> OR
34 5cedca1b 2004-05-15 devnull %left <f> AND
35 5cedca1b 2004-05-15 devnull %nonassoc <f> GT LT LE GE EQ NE
36 5cedca1b 2004-05-15 devnull %left <f> '+' '-'
37 5cedca1b 2004-05-15 devnull %left <f> '*' '/' '%'
38 5cedca1b 2004-05-15 devnull %right <f> UMINUS NOT
39 5cedca1b 2004-05-15 devnull %right <f> '^'
41 5cedca1b 2004-05-15 devnull %type <f> expr optexpr if_expr number assign
42 5cedca1b 2004-05-15 devnull %type <i> optop
43 5cedca1b 2004-05-15 devnull %type <p> optstring if
44 5cedca1b 2004-05-15 devnull %type <op> optname iterator name
45 5cedca1b 2004-05-15 devnull %type <pt> point
46 5cedca1b 2004-05-15 devnull %type <i> side optside numlist comma linetype drawtype
47 5cedca1b 2004-05-15 devnull %type <ap> linedesc optdesc stringlist string stringattr sattrlist exprlist
48 5cedca1b 2004-05-15 devnull %type <i> frameitem framelist coordlog
49 5cedca1b 2004-05-15 devnull %type <f> string_expr
54 5cedca1b 2004-05-15 devnull graphseq { if (codegen && !synerr) graph((char *) 0); }
55 5cedca1b 2004-05-15 devnull | /* empty */ { codegen = 0; }
56 5cedca1b 2004-05-15 devnull | error { codegen = 0; ERROR "syntax error" WARNING; }
59 5cedca1b 2004-05-15 devnull graphseq:
61 5cedca1b 2004-05-15 devnull | graph statlist
62 5cedca1b 2004-05-15 devnull | graphseq graph statlist
65 5cedca1b 2004-05-15 devnull GRAPH { graph($1); endstat(); }
68 5cedca1b 2004-05-15 devnull statlist:
70 5cedca1b 2004-05-15 devnull | stat ST { endstat(); }
71 5cedca1b 2004-05-15 devnull | statlist stat ST { endstat(); }
75 5cedca1b 2004-05-15 devnull FRAME framelist { codegen = 1; }
76 5cedca1b 2004-05-15 devnull | ticks { codegen = 1; }
77 5cedca1b 2004-05-15 devnull | grid { codegen = 1; }
78 5cedca1b 2004-05-15 devnull | label { codegen = 1; }
80 5cedca1b 2004-05-15 devnull | plot { codegen = 1; }
81 5cedca1b 2004-05-15 devnull | line { codegen = 1; }
82 5cedca1b 2004-05-15 devnull | circle { codegen = 1; }
84 5cedca1b 2004-05-15 devnull | next { codegen = 1; }
85 5cedca1b 2004-05-15 devnull | PIC { codegen = 1; pic($1); }
89 5cedca1b 2004-05-15 devnull | numlist { codegen = 1; numlist(); }
91 5cedca1b 2004-05-15 devnull | PRINT expr { fprintf(stderr, "\t%g\n", $2); }
92 5cedca1b 2004-05-15 devnull | PRINT string { fprintf(stderr, "\t%s\n", $2->sval); freeattr($2); }
93 5cedca1b 2004-05-15 devnull | /* empty */
97 5cedca1b 2004-05-15 devnull number { savenum(0, $1); $$ = 1; }
98 5cedca1b 2004-05-15 devnull | numlist number { savenum($1, $2); $$ = $1+1; }
99 5cedca1b 2004-05-15 devnull | numlist comma number { savenum($1, $3); $$ = $1+1; }
103 5cedca1b 2004-05-15 devnull | '-' NUMBER %prec UMINUS { $$ = -$2; }
104 5cedca1b 2004-05-15 devnull | '+' NUMBER %prec UMINUS { $$ = $2; }
108 5cedca1b 2004-05-15 devnull LABEL optside stringlist lablist { label($2, $3); }
110 5cedca1b 2004-05-15 devnull lablist:
112 5cedca1b 2004-05-15 devnull | lablist labattr
113 5cedca1b 2004-05-15 devnull | /* empty */
115 5cedca1b 2004-05-15 devnull labattr:
116 5cedca1b 2004-05-15 devnull UP expr { labelmove($1, $2); }
117 5cedca1b 2004-05-15 devnull | DOWN expr { labelmove($1, $2); }
118 5cedca1b 2004-05-15 devnull | SIDE expr { labelmove($1, $2); /* LEFT or RIGHT only */ }
119 5cedca1b 2004-05-15 devnull | WIDTH expr { labelwid($2); }
122 5cedca1b 2004-05-15 devnull framelist:
123 5cedca1b 2004-05-15 devnull framelist frameitem
124 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = 0; }
126 5cedca1b 2004-05-15 devnull frameitem:
127 5cedca1b 2004-05-15 devnull HEIGHT expr { frameht($2); }
128 5cedca1b 2004-05-15 devnull | WIDTH expr { framewid($2); }
129 5cedca1b 2004-05-15 devnull | side linedesc { frameside($1, $2); }
130 5cedca1b 2004-05-15 devnull | linedesc { frameside(0, $1); }
135 5cedca1b 2004-05-15 devnull optside:
137 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = 0; }
140 5cedca1b 2004-05-15 devnull linedesc:
141 5cedca1b 2004-05-15 devnull linetype optexpr { $$ = makeattr($1, $2, (char *) 0, 0, 0); }
143 5cedca1b 2004-05-15 devnull linetype:
144 5cedca1b 2004-05-15 devnull DOT | DASH | SOLID | INVIS
146 5cedca1b 2004-05-15 devnull optdesc:
147 5cedca1b 2004-05-15 devnull linedesc
148 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = makeattr(0, 0.0, (char *) 0, 0, 0); }
152 5cedca1b 2004-05-15 devnull TICKS tickdesc { ticks(); }
154 5cedca1b 2004-05-15 devnull tickdesc:
155 5cedca1b 2004-05-15 devnull tickattr
156 5cedca1b 2004-05-15 devnull | tickdesc tickattr
158 5cedca1b 2004-05-15 devnull tickattr:
159 5cedca1b 2004-05-15 devnull side { tickside($1); }
160 5cedca1b 2004-05-15 devnull | IN expr { tickdir(IN, $2, 1); }
161 5cedca1b 2004-05-15 devnull | OUT expr { tickdir(OUT, $2, 1); }
162 5cedca1b 2004-05-15 devnull | IN { tickdir(IN, 0.0, 0); }
163 5cedca1b 2004-05-15 devnull | OUT { tickdir(OUT, 0.0, 0); }
164 5cedca1b 2004-05-15 devnull | AT optname ticklist { setlist(); ticklist($2, AT); }
165 5cedca1b 2004-05-15 devnull | iterator { setlist(); ticklist($1, AT); }
166 5cedca1b 2004-05-15 devnull | side OFF { tickoff($1); }
167 5cedca1b 2004-05-15 devnull | OFF { tickoff(LEFT|RIGHT|TOP|BOT); }
168 5cedca1b 2004-05-15 devnull | labattr
170 5cedca1b 2004-05-15 devnull ticklist:
171 5cedca1b 2004-05-15 devnull tickpoint
172 5cedca1b 2004-05-15 devnull | ticklist comma tickpoint
174 5cedca1b 2004-05-15 devnull tickpoint:
175 5cedca1b 2004-05-15 devnull expr { savetick($1, (char *) 0); }
176 5cedca1b 2004-05-15 devnull | expr string { savetick($1, $2->sval); }
178 5cedca1b 2004-05-15 devnull iterator:
179 5cedca1b 2004-05-15 devnull FROM optname expr TO optname expr BY optop expr optstring
180 5cedca1b 2004-05-15 devnull { iterator($3, $6, $8, $9, $10); $$ = $2; }
181 5cedca1b 2004-05-15 devnull | FROM optname expr TO optname expr optstring
182 5cedca1b 2004-05-15 devnull { iterator($3, $6, '+', 1.0, $7); $$ = $2; }
185 5cedca1b 2004-05-15 devnull '+' { $$ = '+'; }
186 5cedca1b 2004-05-15 devnull | '-' { $$ = '-'; }
187 5cedca1b 2004-05-15 devnull | '*' { $$ = '*'; }
188 5cedca1b 2004-05-15 devnull | '/' { $$ = '/'; }
189 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = ' '; }
191 5cedca1b 2004-05-15 devnull optstring:
192 5cedca1b 2004-05-15 devnull string { $$ = $1->sval; }
193 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = (char *) 0; }
197 5cedca1b 2004-05-15 devnull GRID griddesc { ticks(); }
199 5cedca1b 2004-05-15 devnull griddesc:
200 5cedca1b 2004-05-15 devnull gridattr
201 5cedca1b 2004-05-15 devnull | griddesc gridattr
203 5cedca1b 2004-05-15 devnull gridattr:
204 5cedca1b 2004-05-15 devnull side { tickside($1); }
205 5cedca1b 2004-05-15 devnull | X { tickside(BOT); }
206 5cedca1b 2004-05-15 devnull | Y { tickside(LEFT); }
207 5cedca1b 2004-05-15 devnull | linedesc { griddesc($1); }
208 5cedca1b 2004-05-15 devnull | AT optname ticklist { setlist(); gridlist($2); }
209 5cedca1b 2004-05-15 devnull | iterator { setlist(); gridlist($1); }
210 5cedca1b 2004-05-15 devnull | TICKS OFF { gridtickoff(); }
211 5cedca1b 2004-05-15 devnull | OFF { gridtickoff(); }
212 5cedca1b 2004-05-15 devnull | labattr
216 5cedca1b 2004-05-15 devnull LINE FROM point TO point optdesc { line($1, $3, $5, $6); }
217 5cedca1b 2004-05-15 devnull | LINE optdesc FROM point TO point { line($1, $4, $6, $2); }
220 5cedca1b 2004-05-15 devnull CIRCLE RADIUS expr AT point { circle($3, $5); }
221 5cedca1b 2004-05-15 devnull | CIRCLE AT point RADIUS expr { circle($5, $3); }
222 5cedca1b 2004-05-15 devnull | CIRCLE AT point { circle(0.0, $3); }
225 5cedca1b 2004-05-15 devnull stringlist:
227 5cedca1b 2004-05-15 devnull | stringlist string { $$ = addattr($1, $2); }
230 5cedca1b 2004-05-15 devnull STRING sattrlist { $$ = makesattr($1); }
231 5cedca1b 2004-05-15 devnull | SPRINTF '(' STRING ')' sattrlist
232 5cedca1b 2004-05-15 devnull { $$ = makesattr(sprntf($3, (Attr*) 0)); }
233 5cedca1b 2004-05-15 devnull | SPRINTF '(' STRING ',' exprlist ')' sattrlist
234 5cedca1b 2004-05-15 devnull { $$ = makesattr(sprntf($3, $5)); }
236 5cedca1b 2004-05-15 devnull exprlist:
237 5cedca1b 2004-05-15 devnull expr { $$ = makefattr(NUMBER, $1); }
238 5cedca1b 2004-05-15 devnull | exprlist ',' expr { $$ = addattr($1, makefattr(NUMBER, $3)); }
240 5cedca1b 2004-05-15 devnull sattrlist:
241 5cedca1b 2004-05-15 devnull stringattr
242 5cedca1b 2004-05-15 devnull | sattrlist stringattr
243 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = (Attr *) 0; }
245 5cedca1b 2004-05-15 devnull stringattr:
246 5cedca1b 2004-05-15 devnull JUST { setjust($1); }
247 5cedca1b 2004-05-15 devnull | SIZE optop expr { setsize($2, $3); }
251 5cedca1b 2004-05-15 devnull COORD optname coordlist { coord($2); }
252 5cedca1b 2004-05-15 devnull | COORD optname { resetcoord($2); }
254 5cedca1b 2004-05-15 devnull coordlist:
255 5cedca1b 2004-05-15 devnull coorditem
256 5cedca1b 2004-05-15 devnull | coordlist coorditem
258 5cedca1b 2004-05-15 devnull coorditem:
259 5cedca1b 2004-05-15 devnull coordlog { coordlog($1); }
260 5cedca1b 2004-05-15 devnull | X point { coord_x($2); }
261 5cedca1b 2004-05-15 devnull | Y point { coord_y($2); }
262 5cedca1b 2004-05-15 devnull | X optname expr TO expr { coord_x(makepoint($2, $3, $5)); }
263 5cedca1b 2004-05-15 devnull | Y optname expr TO expr { coord_y(makepoint($2, $3, $5)); }
264 5cedca1b 2004-05-15 devnull | X FROM optname expr TO expr { coord_x(makepoint($3, $4, $6)); }
265 5cedca1b 2004-05-15 devnull | Y FROM optname expr TO expr { coord_y(makepoint($3, $4, $6)); }
267 5cedca1b 2004-05-15 devnull coordlog:
268 5cedca1b 2004-05-15 devnull LOG X { $$ = XFLAG; }
269 5cedca1b 2004-05-15 devnull | LOG Y { $$ = YFLAG; }
270 5cedca1b 2004-05-15 devnull | LOG X LOG Y { $$ = XFLAG|YFLAG; }
271 5cedca1b 2004-05-15 devnull | LOG Y LOG X { $$ = XFLAG|YFLAG; }
272 5cedca1b 2004-05-15 devnull | LOG LOG { $$ = XFLAG|YFLAG; }
276 5cedca1b 2004-05-15 devnull stringlist AT point { plot($1, $3); }
277 5cedca1b 2004-05-15 devnull | PLOT stringlist AT point { plot($2, $4); }
278 5cedca1b 2004-05-15 devnull | PLOT expr optstring AT point { plotnum($2, $3, $5); }
282 5cedca1b 2004-05-15 devnull drawtype optname linedesc { drawdesc($1, $2, $3, (char *) 0); }
283 5cedca1b 2004-05-15 devnull | drawtype optname optdesc string { drawdesc($1, $2, $3, $4->sval); }
284 5cedca1b 2004-05-15 devnull | drawtype optname string optdesc { drawdesc($1, $2, $4, $3->sval); }
286 5cedca1b 2004-05-15 devnull drawtype:
292 5cedca1b 2004-05-15 devnull NEXT optname AT point optdesc { next($2, $4, $5); }
295 5cedca1b 2004-05-15 devnull COPY copylist { copy(); }
297 5cedca1b 2004-05-15 devnull copylist:
298 5cedca1b 2004-05-15 devnull copyattr
299 5cedca1b 2004-05-15 devnull | copylist copyattr
301 5cedca1b 2004-05-15 devnull copyattr:
302 5cedca1b 2004-05-15 devnull string { copyfile($1->sval); }
303 5cedca1b 2004-05-15 devnull | THRU DEFNAME { copydef($2); }
304 5cedca1b 2004-05-15 devnull | UNTIL string { copyuntil($2->sval); }
308 5cedca1b 2004-05-15 devnull FOR name FROM expr TO expr BY optop expr DOSTR
309 5cedca1b 2004-05-15 devnull { forloop($2, $4, $6, $8, $9, $10); }
310 5cedca1b 2004-05-15 devnull | FOR name FROM expr TO expr DOSTR
311 5cedca1b 2004-05-15 devnull { forloop($2, $4, $6, '+', 1.0, $7); }
312 5cedca1b 2004-05-15 devnull | FOR name '=' expr TO expr BY optop expr DOSTR
313 5cedca1b 2004-05-15 devnull { forloop($2, $4, $6, $8, $9, $10); }
314 5cedca1b 2004-05-15 devnull | FOR name '=' expr TO expr DOSTR
315 5cedca1b 2004-05-15 devnull { forloop($2, $4, $6, '+', 1.0, $7); }
319 5cedca1b 2004-05-15 devnull IF if_expr THEN ELSE { $$ = ifstat($2, $3, $4); }
320 5cedca1b 2004-05-15 devnull | IF if_expr THEN { $$ = ifstat($2, $3, (char *) 0); }
322 5cedca1b 2004-05-15 devnull if_expr:
324 5cedca1b 2004-05-15 devnull | string_expr
325 5cedca1b 2004-05-15 devnull | if_expr AND string_expr { $$ = $1 && $3; }
326 5cedca1b 2004-05-15 devnull | if_expr OR string_expr { $$ = $1 || $3; }
328 5cedca1b 2004-05-15 devnull string_expr:
329 5cedca1b 2004-05-15 devnull STRING EQ STRING { $$ = strcmp($1,$3) == 0; free($1); free($3); }
330 5cedca1b 2004-05-15 devnull | STRING NE STRING { $$ = strcmp($1,$3) != 0; free($1); free($3); }
334 5cedca1b 2004-05-15 devnull optname expr comma expr { $$ = makepoint($1, $2, $4); }
335 5cedca1b 2004-05-15 devnull | optname '(' expr comma expr ')' { $$ = makepoint($1, $3, $5); }
338 5cedca1b 2004-05-15 devnull ',' { $$ = ','; }
341 5cedca1b 2004-05-15 devnull optname:
342 5cedca1b 2004-05-15 devnull NAME { $$ = $1; }
343 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = lookup(curr_coord, 1); }
348 5cedca1b 2004-05-15 devnull | assign
349 5cedca1b 2004-05-15 devnull | '(' string_expr ')' { $$ = $2; }
350 5cedca1b 2004-05-15 devnull | VARNAME { $$ = getvar($1); }
351 5cedca1b 2004-05-15 devnull | expr '+' expr { $$ = $1 + $3; }
352 5cedca1b 2004-05-15 devnull | expr '-' expr { $$ = $1 - $3; }
353 5cedca1b 2004-05-15 devnull | expr '*' expr { $$ = $1 * $3; }
354 5cedca1b 2004-05-15 devnull | expr '/' expr { if ($3 == 0.0) {
355 5cedca1b 2004-05-15 devnull ERROR "division by 0" WARNING; $3 = 1; }
356 5cedca1b 2004-05-15 devnull $$ = $1 / $3; }
357 5cedca1b 2004-05-15 devnull | expr '%' expr { if ((long)$3 == 0) {
358 5cedca1b 2004-05-15 devnull ERROR "mod division by 0" WARNING; $3 = 1; }
359 5cedca1b 2004-05-15 devnull $$ = (long)$1 % (long)$3; }
360 5cedca1b 2004-05-15 devnull | '-' expr %prec UMINUS { $$ = -$2; }
361 5cedca1b 2004-05-15 devnull | '+' expr %prec UMINUS { $$ = $2; }
362 5cedca1b 2004-05-15 devnull | '(' expr ')' { $$ = $2; }
363 5cedca1b 2004-05-15 devnull | LOG '(' expr ')' { $$ = Log10($3); }
364 5cedca1b 2004-05-15 devnull | EXP '(' expr ')' { $$ = Exp($3 * log(10.0)); }
365 5cedca1b 2004-05-15 devnull | expr '^' expr { $$ = pow($1, $3); }
366 5cedca1b 2004-05-15 devnull | SIN '(' expr ')' { $$ = sin($3); }
367 5cedca1b 2004-05-15 devnull | COS '(' expr ')' { $$ = cos($3); }
368 5cedca1b 2004-05-15 devnull | ATAN2 '(' expr ',' expr ')' { $$ = atan2($3, $5); }
369 5cedca1b 2004-05-15 devnull | SQRT '(' expr ')' { $$ = Sqrt($3); }
370 5cedca1b 2004-05-15 devnull | RAND '(' ')' { $$ = (double)rand() / (double)RAND_MAX; }
371 5cedca1b 2004-05-15 devnull | MAX '(' expr ',' expr ')' { $$ = $3 >= $5 ? $3 : $5; }
372 5cedca1b 2004-05-15 devnull | MIN '(' expr ',' expr ')' { $$ = $3 <= $5 ? $3 : $5; }
373 5cedca1b 2004-05-15 devnull | INT '(' expr ')' { $$ = (long) $3; }
374 5cedca1b 2004-05-15 devnull | expr GT expr { $$ = $1 > $3; }
375 5cedca1b 2004-05-15 devnull | expr LT expr { $$ = $1 < $3; }
376 5cedca1b 2004-05-15 devnull | expr LE expr { $$ = $1 <= $3; }
377 5cedca1b 2004-05-15 devnull | expr GE expr { $$ = $1 >= $3; }
378 5cedca1b 2004-05-15 devnull | expr EQ expr { $$ = $1 == $3; }
379 5cedca1b 2004-05-15 devnull | expr NE expr { $$ = $1 != $3; }
380 5cedca1b 2004-05-15 devnull | expr AND expr { $$ = $1 && $3; }
381 5cedca1b 2004-05-15 devnull | expr OR expr { $$ = $1 || $3; }
382 5cedca1b 2004-05-15 devnull | NOT expr { $$ = !($2); }
385 5cedca1b 2004-05-15 devnull name '=' expr { $$ = setvar($1, $3); }
390 5cedca1b 2004-05-15 devnull | VARNAME
393 5cedca1b 2004-05-15 devnull optexpr:
395 5cedca1b 2004-05-15 devnull | /* empty */ { $$ = 0.0; }