Blame


1 b6d98463 2006-04-14 devnull %{
2 b6d98463 2006-04-14 devnull #include <stdio.h>
3 b6d98463 2006-04-14 devnull #include <math.h>
4 473cc012 2006-04-20 devnull #include "pic.h"
5 b6d98463 2006-04-14 devnull YYSTYPE y;
6 b6d98463 2006-04-14 devnull int yylex(void);
7 b6d98463 2006-04-14 devnull %}
8 b6d98463 2006-04-14 devnull
9 b6d98463 2006-04-14 devnull %token <i> BOX 1 /* DON'T CHANGE THESE! */
10 b6d98463 2006-04-14 devnull %token <i> LINE 2
11 b6d98463 2006-04-14 devnull %token <i> ARROW 3
12 b6d98463 2006-04-14 devnull %token <i> CIRCLE 4
13 b6d98463 2006-04-14 devnull %token <i> ELLIPSE 5
14 b6d98463 2006-04-14 devnull %token <i> ARC 6
15 b6d98463 2006-04-14 devnull %token <i> SPLINE 7
16 b6d98463 2006-04-14 devnull %token <i> BLOCK 8
17 b6d98463 2006-04-14 devnull %token <p> TEXT 9
18 b6d98463 2006-04-14 devnull %token <p> TROFF 10
19 b6d98463 2006-04-14 devnull %token <i> MOVE 11
20 b6d98463 2006-04-14 devnull %token <i> BLOCKEND 12
21 b6d98463 2006-04-14 devnull %token <i> PLACE 13
22 b6d98463 2006-04-14 devnull %token <i> PRINT RESET THRU UNTIL
23 b6d98463 2006-04-14 devnull %token <o> FOR IF COPY
24 b6d98463 2006-04-14 devnull %token <p> THENSTR ELSESTR DOSTR PLACENAME VARNAME SPRINTF
25 b6d98463 2006-04-14 devnull %token <st> DEFNAME
26 b6d98463 2006-04-14 devnull %token <i> ATTR TEXTATTR
27 b6d98463 2006-04-14 devnull %token <i> LEFT RIGHT UP DOWN FROM TO AT BY WITH HEAD CW CCW THEN
28 b6d98463 2006-04-14 devnull %token <i> HEIGHT WIDTH RADIUS DIAMETER LENGTH SIZE
29 b6d98463 2006-04-14 devnull %token <i> CORNER HERE LAST NTH SAME BETWEEN AND
30 b6d98463 2006-04-14 devnull %token <i> EAST WEST NORTH SOUTH NE NW SE SW START END
31 b6d98463 2006-04-14 devnull %token <i> DOTX DOTY DOTHT DOTWID DOTRAD
32 b6d98463 2006-04-14 devnull %token <f> NUMBER
33 b6d98463 2006-04-14 devnull %token <f> LOG EXP SIN COS ATAN2 SQRT RAND MIN MAX INT
34 b6d98463 2006-04-14 devnull %token <i> DIR
35 b6d98463 2006-04-14 devnull %token <i> DOT DASH CHOP FILL
36 b6d98463 2006-04-14 devnull %token <o> ST /* statement terminator */
37 b6d98463 2006-04-14 devnull
38 b6d98463 2006-04-14 devnull %right <f> '='
39 b6d98463 2006-04-14 devnull %left <f> OROR
40 b6d98463 2006-04-14 devnull %left <f> ANDAND
41 b6d98463 2006-04-14 devnull %nonassoc <f> GT LT LE GE EQ NEQ
42 b6d98463 2006-04-14 devnull %left <f> '+' '-'
43 b6d98463 2006-04-14 devnull %left <f> '*' '/' '%'
44 b6d98463 2006-04-14 devnull %right <f> UMINUS NOT
45 b6d98463 2006-04-14 devnull %right <f> '^'
46 b6d98463 2006-04-14 devnull
47 b6d98463 2006-04-14 devnull %type <f> expr if_expr asgn
48 b6d98463 2006-04-14 devnull %type <p> name text
49 b6d98463 2006-04-14 devnull %type <i> optop exprlist
50 b6d98463 2006-04-14 devnull %type <o> if for copy
51 b6d98463 2006-04-14 devnull
52 b6d98463 2006-04-14 devnull /* this is a lie: picture and position are really the whole union */
53 b6d98463 2006-04-14 devnull %type <o> leftbrace picture piclist position lbracket
54 b6d98463 2006-04-14 devnull %type <o> prim place blockname
55 b6d98463 2006-04-14 devnull %type <i> textlist textattr /* not a sensible value */
56 b6d98463 2006-04-14 devnull %type <i> last type
57 b6d98463 2006-04-14 devnull
58 b6d98463 2006-04-14 devnull %%
59 b6d98463 2006-04-14 devnull
60 b6d98463 2006-04-14 devnull top:
61 b6d98463 2006-04-14 devnull piclist
62 b6d98463 2006-04-14 devnull | /* empty */
63 b6d98463 2006-04-14 devnull | error { ERROR "syntax error" WARNING; }
64 b6d98463 2006-04-14 devnull ;
65 b6d98463 2006-04-14 devnull
66 b6d98463 2006-04-14 devnull piclist:
67 b6d98463 2006-04-14 devnull picture
68 b6d98463 2006-04-14 devnull | piclist picture
69 b6d98463 2006-04-14 devnull ;
70 b6d98463 2006-04-14 devnull
71 b6d98463 2006-04-14 devnull picture:
72 b6d98463 2006-04-14 devnull prim ST { codegen = 1; makeiattr(0, 0); }
73 b6d98463 2006-04-14 devnull | leftbrace piclist '}' { rightthing($1, '}'); $$ = $2; }
74 b6d98463 2006-04-14 devnull | PLACENAME ':' picture { y.o=$3; makevar($1,PLACENAME,y); $$ = $3; }
75 b6d98463 2006-04-14 devnull | PLACENAME ':' ST picture { y.o=$4; makevar($1,PLACENAME,y); $$ = $4; }
76 b6d98463 2006-04-14 devnull | PLACENAME ':' position ST { y.o=$3; makevar($1,PLACENAME,y); $$ = $3; }
77 b6d98463 2006-04-14 devnull | asgn ST { y.f = $1; $$ = y.o; $$ = makenode(PLACE, 0); }
78 b6d98463 2006-04-14 devnull | DIR { setdir($1); $$ = makenode(PLACE, 0); }
79 b6d98463 2006-04-14 devnull | PRINT expr ST { printexpr($2); $$ = makenode(PLACE, 0); }
80 b6d98463 2006-04-14 devnull | PRINT position ST { printpos($2); $$ = makenode(PLACE, 0); }
81 b6d98463 2006-04-14 devnull | PRINT text ST { printf("%s\n", $2); free($2); $$ = makenode(PLACE, 0); }
82 b6d98463 2006-04-14 devnull | RESET varlist ST { resetvar(); makeiattr(0, 0); $$ = makenode(PLACE, 0); }
83 b6d98463 2006-04-14 devnull | copy
84 b6d98463 2006-04-14 devnull | for
85 b6d98463 2006-04-14 devnull | if
86 b6d98463 2006-04-14 devnull | ST
87 b6d98463 2006-04-14 devnull ;
88 b6d98463 2006-04-14 devnull
89 b6d98463 2006-04-14 devnull varlist:
90 b6d98463 2006-04-14 devnull /* empty */
91 b6d98463 2006-04-14 devnull | VARNAME { makevattr($1); }
92 b6d98463 2006-04-14 devnull | varlist VARNAME { makevattr($2); }
93 b6d98463 2006-04-14 devnull | varlist ',' VARNAME { makevattr($3); }
94 b6d98463 2006-04-14 devnull ;
95 b6d98463 2006-04-14 devnull
96 b6d98463 2006-04-14 devnull asgn:
97 b6d98463 2006-04-14 devnull VARNAME '=' expr { $$=y.f=$3; makevar($1,VARNAME,y); checkscale($1); }
98 b6d98463 2006-04-14 devnull ;
99 b6d98463 2006-04-14 devnull
100 b6d98463 2006-04-14 devnull copy:
101 b6d98463 2006-04-14 devnull COPY copylist { copy(); }
102 b6d98463 2006-04-14 devnull ;
103 b6d98463 2006-04-14 devnull copylist:
104 b6d98463 2006-04-14 devnull copyattr
105 b6d98463 2006-04-14 devnull | copylist copyattr
106 b6d98463 2006-04-14 devnull ;
107 b6d98463 2006-04-14 devnull copyattr:
108 b6d98463 2006-04-14 devnull text { copyfile($1); }
109 b6d98463 2006-04-14 devnull | THRU DEFNAME { copydef($2); }
110 b6d98463 2006-04-14 devnull | UNTIL text { copyuntil($2); }
111 b6d98463 2006-04-14 devnull ;
112 b6d98463 2006-04-14 devnull
113 b6d98463 2006-04-14 devnull for:
114 b6d98463 2006-04-14 devnull FOR name FROM expr TO expr BY optop expr DOSTR
115 b6d98463 2006-04-14 devnull { forloop($2, $4, $6, $8, $9, $10); }
116 b6d98463 2006-04-14 devnull | FOR name FROM expr TO expr DOSTR
117 b6d98463 2006-04-14 devnull { forloop($2, $4, $6, '+', 1.0, $7); }
118 b6d98463 2006-04-14 devnull | FOR name '=' expr TO expr BY optop expr DOSTR
119 b6d98463 2006-04-14 devnull { forloop($2, $4, $6, $8, $9, $10); }
120 b6d98463 2006-04-14 devnull | FOR name '=' expr TO expr DOSTR
121 b6d98463 2006-04-14 devnull { forloop($2, $4, $6, '+', 1.0, $7); }
122 b6d98463 2006-04-14 devnull ;
123 b6d98463 2006-04-14 devnull
124 b6d98463 2006-04-14 devnull if:
125 b6d98463 2006-04-14 devnull IF if_expr THENSTR ELSESTR { ifstat($2, $3, $4); }
126 b6d98463 2006-04-14 devnull | IF if_expr THENSTR { ifstat($2, $3, (char *) 0); }
127 b6d98463 2006-04-14 devnull ;
128 b6d98463 2006-04-14 devnull if_expr:
129 b6d98463 2006-04-14 devnull expr
130 b6d98463 2006-04-14 devnull | text EQ text { $$ = strcmp($1,$3) == 0; free($1); free($3); }
131 b6d98463 2006-04-14 devnull | text NEQ text { $$ = strcmp($1,$3) != 0; free($1); free($3); }
132 b6d98463 2006-04-14 devnull ;
133 b6d98463 2006-04-14 devnull
134 b6d98463 2006-04-14 devnull name:
135 b6d98463 2006-04-14 devnull VARNAME { y.f = 0; makevar($1, VARNAME, y); }
136 b6d98463 2006-04-14 devnull ;
137 b6d98463 2006-04-14 devnull optop:
138 b6d98463 2006-04-14 devnull '+' { $$ = '+'; }
139 b6d98463 2006-04-14 devnull | '-' { $$ = '-'; }
140 b6d98463 2006-04-14 devnull | '*' { $$ = '*'; }
141 b6d98463 2006-04-14 devnull | '/' { $$ = '/'; }
142 b6d98463 2006-04-14 devnull | /* empty */ { $$ = ' '; }
143 b6d98463 2006-04-14 devnull ;
144 b6d98463 2006-04-14 devnull
145 b6d98463 2006-04-14 devnull
146 b6d98463 2006-04-14 devnull leftbrace:
147 b6d98463 2006-04-14 devnull '{' { $$ = leftthing('{'); }
148 b6d98463 2006-04-14 devnull ;
149 b6d98463 2006-04-14 devnull
150 b6d98463 2006-04-14 devnull prim:
151 b6d98463 2006-04-14 devnull BOX attrlist { $$ = boxgen(); }
152 b6d98463 2006-04-14 devnull | CIRCLE attrlist { $$ = circgen($1); }
153 b6d98463 2006-04-14 devnull | ELLIPSE attrlist { $$ = circgen($1); }
154 b6d98463 2006-04-14 devnull | ARC attrlist { $$ = arcgen($1); }
155 b6d98463 2006-04-14 devnull | LINE attrlist { $$ = linegen($1); }
156 b6d98463 2006-04-14 devnull | ARROW attrlist { $$ = linegen($1); }
157 b6d98463 2006-04-14 devnull | SPLINE attrlist { $$ = linegen($1); }
158 b6d98463 2006-04-14 devnull | MOVE attrlist { $$ = movegen(); }
159 b6d98463 2006-04-14 devnull | textlist attrlist { $$ = textgen(); }
160 b6d98463 2006-04-14 devnull | TROFF { $$ = troffgen($1); }
161 b6d98463 2006-04-14 devnull | lbracket piclist ']' { $<o>$=rightthing($1,']'); } attrlist
162 b6d98463 2006-04-14 devnull { $$ = blockgen($1, $<o>4); }
163 b6d98463 2006-04-14 devnull ;
164 b6d98463 2006-04-14 devnull
165 b6d98463 2006-04-14 devnull lbracket:
166 b6d98463 2006-04-14 devnull '[' { $$ = leftthing('['); }
167 b6d98463 2006-04-14 devnull ;
168 b6d98463 2006-04-14 devnull
169 b6d98463 2006-04-14 devnull attrlist:
170 b6d98463 2006-04-14 devnull attrlist attr
171 b6d98463 2006-04-14 devnull | /* empty */
172 b6d98463 2006-04-14 devnull ;
173 b6d98463 2006-04-14 devnull
174 b6d98463 2006-04-14 devnull attr:
175 b6d98463 2006-04-14 devnull ATTR expr { makefattr($1, !DEFAULT, $2); }
176 b6d98463 2006-04-14 devnull | ATTR { makefattr($1, DEFAULT, 0.0); }
177 b6d98463 2006-04-14 devnull | expr { makefattr(curdir(), !DEFAULT, $1); }
178 b6d98463 2006-04-14 devnull | DIR expr { makefattr($1, !DEFAULT, $2); }
179 b6d98463 2006-04-14 devnull | DIR { makefattr($1, DEFAULT, 0.0); }
180 b6d98463 2006-04-14 devnull | FROM position { makeoattr($1, $2); }
181 b6d98463 2006-04-14 devnull | TO position { makeoattr($1, $2); }
182 b6d98463 2006-04-14 devnull | AT position { makeoattr($1, $2); }
183 b6d98463 2006-04-14 devnull | BY position { makeoattr($1, $2); }
184 b6d98463 2006-04-14 devnull | WITH CORNER { makeiattr(WITH, $2); }
185 b6d98463 2006-04-14 devnull | WITH '.' PLACENAME { makeoattr(PLACE, getblock(getlast(1,BLOCK), $3)); }
186 b6d98463 2006-04-14 devnull | WITH '.' PLACENAME CORNER
187 b6d98463 2006-04-14 devnull { makeoattr(PLACE, getpos(getblock(getlast(1,BLOCK), $3), $4)); }
188 b6d98463 2006-04-14 devnull | WITH position { makeoattr(PLACE, $2); }
189 b6d98463 2006-04-14 devnull | SAME { makeiattr(SAME, $1); }
190 b6d98463 2006-04-14 devnull | TEXTATTR { maketattr($1, (char *) 0); }
191 b6d98463 2006-04-14 devnull | HEAD { makeiattr(HEAD, $1); }
192 b6d98463 2006-04-14 devnull | DOT expr { makefattr(DOT, !DEFAULT, $2); }
193 b6d98463 2006-04-14 devnull | DOT { makefattr(DOT, DEFAULT, 0.0); }
194 b6d98463 2006-04-14 devnull | DASH expr { makefattr(DASH, !DEFAULT, $2); }
195 b6d98463 2006-04-14 devnull | DASH { makefattr(DASH, DEFAULT, 0.0); }
196 b6d98463 2006-04-14 devnull | CHOP expr { makefattr(CHOP, !DEFAULT, $2); }
197 b6d98463 2006-04-14 devnull | CHOP { makefattr(CHOP, DEFAULT, 0.0); }
198 b6d98463 2006-04-14 devnull | FILL expr { makefattr(FILL, !DEFAULT, $2); }
199 b6d98463 2006-04-14 devnull | FILL { makefattr(FILL, DEFAULT, 0.0); }
200 b6d98463 2006-04-14 devnull | textlist
201 b6d98463 2006-04-14 devnull ;
202 b6d98463 2006-04-14 devnull
203 b6d98463 2006-04-14 devnull textlist:
204 b6d98463 2006-04-14 devnull textattr
205 b6d98463 2006-04-14 devnull | textlist textattr
206 b6d98463 2006-04-14 devnull ;
207 b6d98463 2006-04-14 devnull textattr:
208 b6d98463 2006-04-14 devnull text { maketattr(CENTER, $1); }
209 b6d98463 2006-04-14 devnull | text TEXTATTR { maketattr($2, $1); }
210 b6d98463 2006-04-14 devnull | textattr TEXTATTR { addtattr($2); }
211 b6d98463 2006-04-14 devnull ;
212 b6d98463 2006-04-14 devnull text:
213 b6d98463 2006-04-14 devnull TEXT
214 b6d98463 2006-04-14 devnull | SPRINTF '(' text ')' { $$ = sprintgen($3); }
215 b6d98463 2006-04-14 devnull | SPRINTF '(' text ',' exprlist ')' { $$ = sprintgen($3); }
216 b6d98463 2006-04-14 devnull ;
217 b6d98463 2006-04-14 devnull
218 b6d98463 2006-04-14 devnull exprlist:
219 b6d98463 2006-04-14 devnull expr { exprsave($1); $$ = 0; }
220 b6d98463 2006-04-14 devnull | exprlist ',' expr { exprsave($3); }
221 b6d98463 2006-04-14 devnull ;
222 b6d98463 2006-04-14 devnull
223 b6d98463 2006-04-14 devnull position: /* absolute, not relative */
224 b6d98463 2006-04-14 devnull place
225 b6d98463 2006-04-14 devnull | '(' position ')' { $$ = $2; }
226 b6d98463 2006-04-14 devnull | expr ',' expr { $$ = makepos($1, $3); }
227 b6d98463 2006-04-14 devnull | position '+' expr ',' expr { $$ = fixpos($1, $3, $5); }
228 b6d98463 2006-04-14 devnull | position '-' expr ',' expr { $$ = fixpos($1, -$3, -$5); }
229 b6d98463 2006-04-14 devnull | position '+' '(' expr ',' expr ')' { $$ = fixpos($1, $4, $6); }
230 b6d98463 2006-04-14 devnull | position '-' '(' expr ',' expr ')' { $$ = fixpos($1, -$4, -$6); }
231 b6d98463 2006-04-14 devnull | position '+' place { $$ = addpos($1, $3); }
232 b6d98463 2006-04-14 devnull | position '-' place { $$ = subpos($1, $3); }
233 b6d98463 2006-04-14 devnull | '(' place ',' place ')' { $$ = makepos(getcomp($2,DOTX), getcomp($4,DOTY)); }
234 b6d98463 2006-04-14 devnull | expr LT position ',' position GT { $$ = makebetween($1, $3, $5); }
235 b6d98463 2006-04-14 devnull | expr BETWEEN position AND position { $$ = makebetween($1, $3, $5); }
236 b6d98463 2006-04-14 devnull ;
237 b6d98463 2006-04-14 devnull
238 b6d98463 2006-04-14 devnull place:
239 b6d98463 2006-04-14 devnull PLACENAME { y = getvar($1); $$ = y.o; }
240 b6d98463 2006-04-14 devnull | PLACENAME CORNER { y = getvar($1); $$ = getpos(y.o, $2); }
241 b6d98463 2006-04-14 devnull | CORNER PLACENAME { y = getvar($2); $$ = getpos(y.o, $1); }
242 b6d98463 2006-04-14 devnull | HERE { $$ = gethere(); }
243 b6d98463 2006-04-14 devnull | last type { $$ = getlast($1, $2); }
244 b6d98463 2006-04-14 devnull | last type CORNER { $$ = getpos(getlast($1, $2), $3); }
245 b6d98463 2006-04-14 devnull | CORNER last type { $$ = getpos(getlast($2, $3), $1); }
246 b6d98463 2006-04-14 devnull | NTH type { $$ = getfirst($1, $2); }
247 b6d98463 2006-04-14 devnull | NTH type CORNER { $$ = getpos(getfirst($1, $2), $3); }
248 b6d98463 2006-04-14 devnull | CORNER NTH type { $$ = getpos(getfirst($2, $3), $1); }
249 b6d98463 2006-04-14 devnull | blockname
250 b6d98463 2006-04-14 devnull | blockname CORNER { $$ = getpos($1, $2); }
251 b6d98463 2006-04-14 devnull | CORNER blockname { $$ = getpos($2, $1); }
252 b6d98463 2006-04-14 devnull ;
253 b6d98463 2006-04-14 devnull
254 b6d98463 2006-04-14 devnull blockname:
255 b6d98463 2006-04-14 devnull last BLOCK '.' PLACENAME { $$ = getblock(getlast($1,$2), $4); }
256 b6d98463 2006-04-14 devnull | NTH BLOCK '.' PLACENAME { $$ = getblock(getfirst($1,$2), $4); }
257 b6d98463 2006-04-14 devnull | PLACENAME '.' PLACENAME { y = getvar($1); $$ = getblock(y.o, $3); }
258 b6d98463 2006-04-14 devnull ;
259 b6d98463 2006-04-14 devnull
260 b6d98463 2006-04-14 devnull last:
261 b6d98463 2006-04-14 devnull last LAST { $$ = $1 + 1; }
262 b6d98463 2006-04-14 devnull | NTH LAST { $$ = $1; }
263 b6d98463 2006-04-14 devnull | LAST { $$ = 1; }
264 b6d98463 2006-04-14 devnull ;
265 b6d98463 2006-04-14 devnull
266 b6d98463 2006-04-14 devnull type:
267 b6d98463 2006-04-14 devnull BOX
268 b6d98463 2006-04-14 devnull | CIRCLE
269 b6d98463 2006-04-14 devnull | ELLIPSE
270 b6d98463 2006-04-14 devnull | ARC
271 b6d98463 2006-04-14 devnull | LINE
272 b6d98463 2006-04-14 devnull | ARROW
273 b6d98463 2006-04-14 devnull | SPLINE
274 b6d98463 2006-04-14 devnull | BLOCK
275 b6d98463 2006-04-14 devnull ;
276 b6d98463 2006-04-14 devnull
277 b6d98463 2006-04-14 devnull expr:
278 b6d98463 2006-04-14 devnull NUMBER
279 b6d98463 2006-04-14 devnull | VARNAME { $$ = getfval($1); }
280 b6d98463 2006-04-14 devnull | asgn
281 b6d98463 2006-04-14 devnull | expr '+' expr { $$ = $1 + $3; }
282 b6d98463 2006-04-14 devnull | expr '-' expr { $$ = $1 - $3; }
283 b6d98463 2006-04-14 devnull | expr '*' expr { $$ = $1 * $3; }
284 b6d98463 2006-04-14 devnull | expr '/' expr { if ($3 == 0.0) {
285 b6d98463 2006-04-14 devnull ERROR "division by 0" WARNING; $3 = 1; }
286 b6d98463 2006-04-14 devnull $$ = $1 / $3; }
287 b6d98463 2006-04-14 devnull | expr '%' expr { if ((long)$3 == 0) {
288 b6d98463 2006-04-14 devnull ERROR "mod division by 0" WARNING; $3 = 1; }
289 b6d98463 2006-04-14 devnull $$ = (long)$1 % (long)$3; }
290 b6d98463 2006-04-14 devnull | '-' expr %prec UMINUS { $$ = -$2; }
291 b6d98463 2006-04-14 devnull | '(' expr ')' { $$ = $2; }
292 b6d98463 2006-04-14 devnull | place DOTX { $$ = getcomp($1, $2); }
293 b6d98463 2006-04-14 devnull | place DOTY { $$ = getcomp($1, $2); }
294 b6d98463 2006-04-14 devnull | place DOTHT { $$ = getcomp($1, $2); }
295 b6d98463 2006-04-14 devnull | place DOTWID { $$ = getcomp($1, $2); }
296 b6d98463 2006-04-14 devnull | place DOTRAD { $$ = getcomp($1, $2); }
297 b6d98463 2006-04-14 devnull | PLACENAME '.' VARNAME { y = getvar($1); $$ = getblkvar(y.o, $3); }
298 b6d98463 2006-04-14 devnull | last BLOCK '.' VARNAME { $$ = getblkvar(getlast($1,$2), $4); }
299 b6d98463 2006-04-14 devnull | NTH BLOCK '.' VARNAME { $$ = getblkvar(getfirst($1,$2), $4); }
300 b6d98463 2006-04-14 devnull | expr GT expr { $$ = $1 > $3; }
301 b6d98463 2006-04-14 devnull | expr LT expr { $$ = $1 < $3; }
302 b6d98463 2006-04-14 devnull | expr LE expr { $$ = $1 <= $3; }
303 b6d98463 2006-04-14 devnull | expr GE expr { $$ = $1 >= $3; }
304 b6d98463 2006-04-14 devnull | expr EQ expr { $$ = $1 == $3; }
305 b6d98463 2006-04-14 devnull | expr NEQ expr { $$ = $1 != $3; }
306 b6d98463 2006-04-14 devnull | expr ANDAND expr { $$ = $1 && $3; }
307 b6d98463 2006-04-14 devnull | expr OROR expr { $$ = $1 || $3; }
308 b6d98463 2006-04-14 devnull | NOT expr { $$ = !($2); }
309 b6d98463 2006-04-14 devnull | LOG '(' expr ')' { $$ = Log10($3); }
310 b6d98463 2006-04-14 devnull | EXP '(' expr ')' { $$ = Exp($3 * log(10.0)); }
311 b6d98463 2006-04-14 devnull | expr '^' expr { $$ = pow($1, $3); }
312 b6d98463 2006-04-14 devnull | SIN '(' expr ')' { $$ = sin($3); }
313 b6d98463 2006-04-14 devnull | COS '(' expr ')' { $$ = cos($3); }
314 b6d98463 2006-04-14 devnull | ATAN2 '(' expr ',' expr ')' { $$ = atan2($3, $5); }
315 b6d98463 2006-04-14 devnull | SQRT '(' expr ')' { $$ = Sqrt($3); }
316 b6d98463 2006-04-14 devnull | RAND '(' ')' { $$ = (float)rand() / 32767.0; /* might be 2^31-1 */ }
317 b6d98463 2006-04-14 devnull | MAX '(' expr ',' expr ')' { $$ = $3 >= $5 ? $3 : $5; }
318 b6d98463 2006-04-14 devnull | MIN '(' expr ',' expr ')' { $$ = $3 <= $5 ? $3 : $5; }
319 b6d98463 2006-04-14 devnull | INT '(' expr ')' { $$ = (long) $3; }
320 b6d98463 2006-04-14 devnull ;