Blame


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