Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
%{
2
#include <stdio.h>
3
#include <math.h>
4
#include <stdlib.h>
5
#include <string.h>
6
#include "grap.h"
7
 
8
#define	RAND_MAX 32767	/* if your rand() returns bigger, change this too */
9
 
10
extern int yylex(void);
11
extern int yyparse(void);
12
 
13
%}
14
 
15
%token	<i>	FRAME TICKS GRID LABEL COORD
16
%token	<i>	LINE ARROW CIRCLE DRAW NEW PLOT NEXT
17
%token	<p>	PIC
18
%token	<i>	COPY THRU UNTIL
19
%token	<i>	FOR FROM TO BY AT WITH
20
%token	<i>	IF
21
%token	<p>	GRAPH THEN ELSE DOSTR
22
%token	<i>	DOT DASH INVIS SOLID
23
%token	<i>	TEXT JUST SIZE
24
%token	<i>	LOG EXP SIN COS ATAN2 SQRT RAND MAX MIN INT PRINT SPRINTF
25
%token	<i>	X Y SIDE IN OUT OFF UP DOWN ACROSS
26
%token	<i>	HEIGHT WIDTH RADIUS
27
%token	<f>	NUMBER
28
%token	<op>	NAME VARNAME DEFNAME
29
%token	<p>	STRING
30
%token	<i>	ST '(' ')' ','
31
 
32
%right	<f>	'='
33
%left	<f>	OR
34
%left	<f>	AND
35
%nonassoc <f>	GT LT LE GE EQ NE
36
%left	<f>	'+' '-'
37
%left	<f>	'*' '/' '%'
38
%right	<f>	UMINUS NOT
39
%right	<f>	'^'
40
 
41
%type	<f>	expr optexpr if_expr number assign
42
%type	<i>	optop
43
%type	<p>	optstring if
44
%type	<op>	optname iterator name
45
%type	<pt>	point
46
%type	<i>	side optside numlist comma linetype drawtype
47
%type	<ap>	linedesc optdesc stringlist string stringattr sattrlist exprlist
48
%type	<i>	frameitem framelist coordlog
49
%type	<f>	string_expr
50
 
51
%%
52
 
53
top:
54
	  graphseq		{ if (codegen && !synerr) graph((char *) 0); }
55
	| /* empty */		{ codegen = 0; }
56
	| error			{ codegen = 0; ERROR "syntax error" WARNING; }
57
	;
58
 
59
graphseq:
60
	  statlist
61
	| graph statlist
62
	| graphseq graph statlist
63
	;
64
graph:
65
	  GRAPH			{ graph($1); endstat(); }
66
	;
67
 
68
statlist:
69
	  ST
70
	| stat ST		{ endstat(); }
71
	| statlist stat ST	{ endstat(); }
72
	;
73
 
74
stat:
75
	  FRAME framelist	{ codegen = 1; }
76
	| ticks			{ codegen = 1; }
77
	| grid			{ codegen = 1; }
78
	| label			{ codegen = 1; }
79
	| coord
80
	| plot			{ codegen = 1; }
81
	| line			{ codegen = 1; }
82
	| circle		{ codegen = 1; }
83
	| draw
84
	| next			{ codegen = 1; }
85
	| PIC			{ codegen = 1; pic($1); }
86
	| for
87
	| if
88
	| copy
89
	| numlist		{ codegen = 1; numlist(); }
90
	| assign
91
	| PRINT expr		{ fprintf(stderr, "\t%g\n", $2); }
92
	| PRINT string		{ fprintf(stderr, "\t%s\n", $2->sval); freeattr($2); }
93
	| /* empty */
94
	;
95
 
96
numlist:
97
	  number		{ savenum(0, $1); $$ = 1; }
98
	| numlist number	{ savenum($1, $2); $$ = $1+1; }
99
	| numlist comma number	{ savenum($1, $3); $$ = $1+1; }
100
	;
101
number:
102
	  NUMBER
103
	| '-' NUMBER %prec UMINUS	{ $$ = -$2; }
104
	| '+' NUMBER %prec UMINUS	{ $$ = $2; }
105
	;
106
 
107
label:
108
	  LABEL optside stringlist lablist	{ label($2, $3); }
109
	;
110
lablist:
111
	  labattr
112
	| lablist labattr
113
	| /* empty */
114
	;
115
labattr:
116
	  UP expr		{ labelmove($1, $2); }
117
	| DOWN expr		{ labelmove($1, $2); }
118
	| SIDE expr		{ labelmove($1, $2); /* LEFT or RIGHT only */ }
119
	| WIDTH expr		{ labelwid($2); }
120
	;
121
 
122
framelist:
123
	  framelist frameitem
124
	| /* empty */		{ $$ = 0; }
125
	;
126
frameitem:
127
	  HEIGHT expr		{ frameht($2); }
128
	| WIDTH expr		{ framewid($2); }
129
	| side linedesc		{ frameside($1, $2); }
130
	| linedesc		{ frameside(0, $1); }
131
	;
132
side:
133
	  SIDE
134
	;
135
optside:
136
	  side
137
	| /* empty */		{ $$ = 0; }
138
	;
139
 
140
linedesc:
141
	  linetype optexpr	{ $$ = makeattr($1, $2, (char *) 0, 0, 0); }
142
	;
143
linetype:
144
	  DOT | DASH | SOLID | INVIS
145
	;
146
optdesc:
147
	  linedesc
148
	| /* empty */		{ $$ = makeattr(0, 0.0, (char *) 0, 0, 0); }
149
	;
150
 
151
ticks:
152
	  TICKS tickdesc	{ ticks(); }
153
	;
154
tickdesc:
155
	  tickattr
156
	| tickdesc tickattr
157
	;
158
tickattr:
159
	  side			{ tickside($1); }
160
	| IN expr		{ tickdir(IN, $2, 1); }
161
	| OUT expr		{ tickdir(OUT, $2, 1); }
162
	| IN			{ tickdir(IN, 0.0, 0); }
163
	| OUT			{ tickdir(OUT, 0.0, 0); }
164
	| AT optname ticklist	{ setlist(); ticklist($2, AT); }
165
	| iterator		{ setlist(); ticklist($1, AT); }
166
	| side OFF		{ tickoff($1); }
167
	| OFF			{ tickoff(LEFT|RIGHT|TOP|BOT); }
168
	| labattr
169
	;
170
ticklist:
171
	  tickpoint
172
	| ticklist comma tickpoint
173
	;
174
tickpoint:
175
	  expr			{ savetick($1, (char *) 0); }
176
	| expr string		{ savetick($1, $2->sval); }
177
	;
178
iterator:
179
	  FROM optname expr TO optname expr BY optop expr optstring
180
			{ iterator($3, $6, $8, $9, $10); $$ = $2; }
181
	| FROM optname expr TO optname expr optstring
182
			{ iterator($3, $6, '+', 1.0, $7); $$ = $2; }
183
	;
184
optop:
185
	  '+'		{ $$ = '+'; }
186
	| '-'		{ $$ = '-'; }
187
	| '*'		{ $$ = '*'; }
188
	| '/'		{ $$ = '/'; }
189
	| /* empty */	{ $$ = ' '; }
190
	;
191
optstring:
192
	  string	{ $$ = $1->sval; }
193
	| /* empty */	{ $$ = (char *) 0; }
194
	;
195
 
196
grid:
197
	  GRID griddesc		{ ticks(); }
198
	;
199
griddesc:
200
	  gridattr
201
	| griddesc gridattr
202
	;
203
gridattr:
204
	  side			{ tickside($1); }
205
	| X			{ tickside(BOT); }
206
	| Y			{ tickside(LEFT); }
207
	| linedesc		{ griddesc($1); }
208
	| AT optname ticklist	{ setlist(); gridlist($2); }
209
	| iterator		{ setlist(); gridlist($1); }
210
	| TICKS OFF		{ gridtickoff(); }
211
	| OFF			{ gridtickoff(); }
212
	| labattr
213
	;
214
 
215
line:
216
	  LINE FROM point TO point optdesc	{ line($1, $3, $5, $6); }
217
	| LINE optdesc FROM point TO point	{ line($1, $4, $6, $2); }
218
	;
219
circle:
220
	  CIRCLE RADIUS expr AT point		{ circle($3, $5); }
221
	| CIRCLE AT point RADIUS expr		{ circle($5, $3); }
222
	| CIRCLE AT point			{ circle(0.0, $3); }
223
	;
224
 
225
stringlist:
226
	  string
227
	| stringlist string	{ $$ = addattr($1, $2); }
228
	;
229
string:
230
	  STRING sattrlist	{ $$ = makesattr($1); }
231
	| SPRINTF '(' STRING ')' sattrlist
232
				{ $$ = makesattr(sprntf($3, (Attr*) 0)); }
233
	| SPRINTF '(' STRING ',' exprlist ')' sattrlist
234
				{ $$ = makesattr(sprntf($3, $5)); }
235
	;
236
exprlist:
237
	  expr			{ $$ = makefattr(NUMBER, $1); }
238
	| exprlist ',' expr	{ $$ = addattr($1, makefattr(NUMBER, $3)); }
239
	;
240
sattrlist:
241
	  stringattr
242
	| sattrlist stringattr
243
	| /* empty */		{ $$ = (Attr *) 0; }
244
	;
245
stringattr:
246
	  JUST			{ setjust($1); }
247
	| SIZE optop expr	{ setsize($2, $3); }
248
	;
249
 
250
coord:
251
	  COORD optname coordlist	{ coord($2); }
252
	| COORD optname			{ resetcoord($2); }
253
	;
254
coordlist:
255
	  coorditem
256
	| coordlist coorditem
257
	;
258
coorditem:
259
	  coordlog	{ coordlog($1); }
260
	| X point	{ coord_x($2); }
261
	| Y point	{ coord_y($2); }
262
	| X optname expr TO expr		{ coord_x(makepoint($2, $3, $5)); }
263
	| Y optname expr TO expr		{ coord_y(makepoint($2, $3, $5)); }
264
	| X FROM optname expr TO expr		{ coord_x(makepoint($3, $4, $6)); }
265
	| Y FROM optname expr TO expr		{ coord_y(makepoint($3, $4, $6)); }
266
	;
267
coordlog:
268
	  LOG X		{ $$ = XFLAG; }
269
	| LOG Y		{ $$ = YFLAG; }
270
	| LOG X LOG Y	{ $$ = XFLAG|YFLAG; }
271
	| LOG Y LOG X	{ $$ = XFLAG|YFLAG; }
272
	| LOG LOG	{ $$ = XFLAG|YFLAG; }
273
	;
274
 
275
plot:
276
	  stringlist AT point		{ plot($1, $3); }
277
	| PLOT stringlist AT point	{ plot($2, $4); }
278
	| PLOT expr optstring AT point	{ plotnum($2, $3, $5); }
279
	;
280
 
281
draw:
282
	  drawtype optname linedesc		{ drawdesc($1, $2, $3, (char *) 0); }
283
	| drawtype optname optdesc string	{ drawdesc($1, $2, $3, $4->sval); }
284
	| drawtype optname string optdesc	{ drawdesc($1, $2, $4, $3->sval); }
285
	;
286
drawtype:
287
	  DRAW
288
	| NEW
289
	;
290
 
291
next:
292
	  NEXT optname AT point optdesc		{ next($2, $4, $5); }
293
 
294
copy:
295
	  COPY copylist		{ copy(); }
296
	;
297
copylist:
298
	  copyattr
299
	| copylist copyattr
300
	;
301
copyattr:
302
	  string		{ copyfile($1->sval); }
303
	| THRU DEFNAME		{ copydef($2); }
304
	| UNTIL string		{ copyuntil($2->sval); }
305
	;
306
 
307
for:
308
	  FOR name FROM expr TO expr BY optop expr DOSTR
309
		{ forloop($2, $4, $6, $8, $9, $10); }
310
	| FOR name FROM expr TO expr DOSTR
311
		{ forloop($2, $4, $6, '+', 1.0, $7); }
312
	| FOR name '=' expr TO expr BY optop expr DOSTR
313
		{ forloop($2, $4, $6, $8, $9, $10); }
314
	| FOR name '=' expr TO expr DOSTR
315
		{ forloop($2, $4, $6, '+', 1.0, $7); }
316
	;
317
 
318
if:
319
	  IF if_expr THEN ELSE		{ $$ = ifstat($2, $3, $4); }
320
	| IF if_expr THEN		{ $$ = ifstat($2, $3, (char *) 0); }
321
	;
322
if_expr:
323
	  expr
324
	| string_expr
325
	| if_expr AND string_expr	{ $$ = $1 && $3; }
326
	| if_expr OR string_expr	{ $$ = $1 || $3; }
327
	;
328
string_expr:
329
	  STRING EQ STRING	{ $$ = strcmp($1,$3) == 0; free($1); free($3); }
330
	| STRING NE STRING	{ $$ = strcmp($1,$3) != 0; free($1); free($3); }
331
	;
332
 
333
point:
334
	  optname expr comma expr		{ $$ = makepoint($1, $2, $4); }
335
	| optname '(' expr comma expr ')'	{ $$ = makepoint($1, $3, $5); }
336
	;
337
comma:
338
	  ','		{ $$ = ','; }
339
	;
340
 
341
optname:
342
	  NAME		{ $$ = $1; }
343
	| /* empty */	{ $$ = lookup(curr_coord, 1); }
344
	;
345
 
346
expr:
347
	  NUMBER
348
	| assign
349
	| '(' string_expr ')'	{ $$ = $2; }
350
	| VARNAME		{ $$ = getvar($1); }
351
	| expr '+' expr		{ $$ = $1 + $3; }
352
	| expr '-' expr		{ $$ = $1 - $3; }
353
	| expr '*' expr		{ $$ = $1 * $3; }
354
	| expr '/' expr		{ if ($3 == 0.0) {
355
					ERROR "division by 0" WARNING; $3 = 1; }
356
				  $$ = $1 / $3; }
357
	| expr '%' expr		{ if ((long)$3 == 0) {
358
					ERROR "mod division by 0" WARNING; $3 = 1; }
359
				  $$ = (long)$1 % (long)$3; }
360
	| '-' expr %prec UMINUS	{ $$ = -$2; }
361
	| '+' expr %prec UMINUS	{ $$ = $2; }
362
	| '(' expr ')'		{ $$ = $2; }
363
	| LOG '(' expr ')'		{ $$ = Log10($3); }
364
	| EXP '(' expr ')'		{ $$ = Exp($3 * log(10.0)); }
365
	| expr '^' expr			{ $$ = pow($1, $3); }
366
	| SIN '(' expr ')'		{ $$ = sin($3); }
367
	| COS '(' expr ')'		{ $$ = cos($3); }
368
	| ATAN2 '(' expr ',' expr ')'	{ $$ = atan2($3, $5); }
369
	| SQRT '(' expr ')'		{ $$ = Sqrt($3); }
370
	| RAND '(' ')'			{ $$ = (double)rand() / (double)RAND_MAX; }
371
	| MAX '(' expr ',' expr ')'	{ $$ = $3 >= $5 ? $3 : $5; }
372
	| MIN '(' expr ',' expr ')'	{ $$ = $3 <= $5 ? $3 : $5; }
373
	| INT '(' expr ')'	{ $$ = (long) $3; }
374
	| expr GT expr		{ $$ = $1 > $3; }
375
	| expr LT expr		{ $$ = $1 < $3; }
376
	| expr LE expr		{ $$ = $1 <= $3; }
377
	| expr GE expr		{ $$ = $1 >= $3; }
378
	| expr EQ expr		{ $$ = $1 == $3; }
379
	| expr NE expr		{ $$ = $1 != $3; }
380
	| expr AND expr		{ $$ = $1 && $3; }
381
	| expr OR expr		{ $$ = $1 || $3; }
382
	| NOT expr		{ $$ = !($2); }
383
	;
384
assign:
385
	  name '=' expr		{ $$ = setvar($1, $3); }
386
	;
387
 
388
name:
389
	  NAME
390
	| VARNAME
391
	;
392
 
393
optexpr:
394
	  expr
395
	| /* empty */		{ $$ = 0.0; }
396
	;