1 /* picy.y	(Berkeley)	1.2	83/12/29	*/
2 %{
3 #include	<stdio.h>
4 #include	"pic.h"
5 YYSTYPE	y;
6 %}
7 
8 %token	<i>	BOX	1
9 %token	<i>	ARROW	2
10 %token	<i>	CIRCLE	3
11 %token	<i>	ARC	4
12 %token	<i>	ELLIPSE	5
13 %token	<i>	LINE	6
14 %token	<i>	MOVE	7
15 %token	<i>	TEXT	8
16 %token	<i>	TROFF	9
17 %token	<i>	SPLINE	10
18 %token	<i>	BLOCK	11
19 %token	<i>	BLOCKEND 12
20 %token	<i>	PRINT
21 %token	<i>	PLACE
22 %token	<i>	ATTR
23 %token	<i>	SPREAD FILL LJUST RJUST ABOVE BELOW
24 %token	<i>	LEFT RIGHT UP DOWN FROM TO AT BY WITH HEAD CW CCW THEN
25 %token	<i>	HEIGHT WIDTH RADIUS DIAMETER LENGTH SIZE
26 %token	<i>	PLACENAME VARNAME DEFNAME CORNER HERE LAST NTH SAME BETWEEN AND
27 %token	<i>	EAST WEST NORTH SOUTH NE NW SE SW CENTER START END
28 %token	<i>	DOTX DOTY DOTHT DOTWID DOTRAD
29 %token	<f>	NUMBER
30 %token	<i>	DIR
31 %token	<i>	DOT DASH CHOP
32 %token	<o>	ST	/* statement terminator */
33 
34 %left	<f>	'+' '-'
35 %left	<f>	'*' '/' '%'
36 %right	<f>	UMINUS
37 
38 %type	<f>	expr opt_expr
39 %type	<o>	leftbrace picture piclist position lbracket
40 %type	<o>	prim place blockname
41 %type	<i>	textattr last type
42 
43 
44 %%
45 
46 top:
47 	  piclist
48 	| /* empty */
49 	| error		{ yyerror("syntax error"); }
50 	;
51 
52 piclist:
53 	  picture
54 	| piclist picture
55 	;
56 
57 picture:
58 	  prim ST			{ codegen = 1; }
59 	| leftbrace piclist '}'		{ rightthing($1, '}'); $$ = $2; }
60 	| PLACENAME ':' picture		{ makevar($1, PLACENAME, $3); $$ = $3; }
61 	| PLACENAME ':' ST picture	{ makevar($1, PLACENAME, $4); $$ = $4; }
62 	| PLACENAME ':' position ST	{ makevar($1, PLACENAME, $3); $$ = $3; }
63         | VARNAME '=' expr ST	{ makevar($1, VARNAME, $<i>3); checkscale($1); }
64 	| DIR				{ setdir($1); }
65 	| PRINT expr ST			{ printexpr($2); }
66 	| PRINT position ST		{ printpos($2); }
67 	| ST
68 	;
69 
70 leftbrace:
71 	  '{'			{ $$ = leftthing('{'); }
72 	;
73 
74 prim:
75 	  BOX attrlist		{ $$ = boxgen($1); }
76 	| CIRCLE attrlist	{ $$ = circgen($1); }
77 	| ELLIPSE attrlist	{ $$ = circgen($1); }
78 	| ARC attrlist		{ $$ = arcgen($1); }
79 	| LINE attrlist		{ $$ = linegen($1); }
80 	| ARROW attrlist	{ $$ = linegen($1); }
81 	| SPLINE attrlist	{ $$ = splinegen($1); }
82 	| MOVE attrlist		{ $$ = movegen($1); }
83 	| TEXT attrlist		{ $$ = textgen($1); }
84 	| TROFF			{ $$ = troffgen($1); }
85 	| lbracket piclist ']' { $<o>$=rightthing($1,']'); } attrlist
86 				{ $$ = blockgen($1, $2, $<o>4); }
87 	;
88 
89 lbracket:
90 	  '['			{ $$ = leftthing('['); }
91 	;
92 
93 attrlist:
94 	  attrlist attr
95 	| /* empty */		{ makeattr(0, 0); }
96 	;
97 
98 attr:
99 	  ATTR opt_expr		{ makeattr($1, $<i>2); }
100 	| DIR opt_expr		{ makeattr($1, $<i>2); }
101 	| FROM position		{ makeattr($1, $2); }
102 	| TO position		{ makeattr($1, $2); }
103 	| AT position		{ makeattr($1, $2); }
104 	| BY position		{ makeattr($1, $2); }
105 	| WITH CORNER		{ makeattr(WITH, $2); }
106 	| WITH '.' PLACENAME	{ makeattr(PLACE, getblock(getlast(1,BLOCK), $3)); }
107 	| WITH position		{ makeattr(PLACE, $2); }
108 	| SAME			{ makeattr(SAME, $1); }
109 	| textattr		{ makeattr($1, 0); }
110 	| HEAD			{ makeattr(HEAD, $1); }
111 	| DOT opt_expr		{ makeattr(DOT, $<i>2); }
112 	| DASH opt_expr		{ makeattr(DASH, $<i>2); }
113 	| CHOP opt_expr		{ makeattr(CHOP, $<i>2); }
114 	| textlist
115 	;
116 
117 opt_expr:
118 	  expr
119 	| /* empty */		{ $$ = 0; }
120 	;
121 
122 textlist:
123 	  TEXT			{ makeattr(CENTER, $1); }
124 	| TEXT textattr		{ makeattr($2, $1); }
125 	| textlist TEXT		{ makeattr(CENTER, $2); }
126 	| textlist TEXT textattr { makeattr($3, $2); }
127 	;
128 
129 textattr:
130 	  LJUST
131 	| RJUST
132 	| SPREAD
133 	| FILL
134 	| CENTER
135 	| ABOVE
136 	| BELOW
137 	;
138 
139 position:		/* absolute, not relative */
140 	  place
141 	| expr ',' expr			{ $$ = makepos($1, $3); }
142 	| position '+' expr ',' expr	{ $$ = fixpos($1, $3, $5); }
143 	| position '-' expr ',' expr	{ $$ = fixpos($1, -$3, -$5); }
144 	| '(' expr ',' expr ')'			{ $$ = makepos($2, $4); }
145 	| position '+' '(' expr ',' expr ')'	{ $$ = fixpos($1, $4, $6); }
146 	| position '-' '(' expr ',' expr ')'	{ $$ = fixpos($1, -$4, -$6); }
147 	| '(' place ',' place ')'	{ $$ = makepos(getcomp($2,DOTX), getcomp($4,DOTY)); }
148 	| expr '<' position ',' position '>'	{ $$ = makebetween($1, $3, $5); }
149 	| expr BETWEEN position AND position	{ $$ = makebetween($1, $3, $5); }
150 	;
151 
152 place:
153 	  PLACENAME		{ y = getvar($1); $$ = y.o; }
154 	| PLACENAME CORNER	{ y = getvar($1); $$ = getpos(y.o, $2); }
155 	| CORNER PLACENAME	{ y = getvar($2); $$ = getpos(y.o, $1); }
156 	| HERE			{ $$ = gethere($1); }
157 	| last type		{ $$ = getlast($1, $2); }
158 	| last type CORNER	{ $$ = getpos(getlast($1, $2), $3); }
159 	| CORNER last type	{ $$ = getpos(getlast($2, $3), $1); }
160 	| NTH type		{ $$ = getfirst($1, $2); }
161 	| NTH type CORNER	{ $$ = getpos(getfirst($1, $2), $3); }
162 	| CORNER NTH type	{ $$ = getpos(getfirst($2, $3), $1); }
163 	| blockname
164 	| blockname CORNER	{ $$ = getpos($1, $2); }
165 	| CORNER blockname	{ $$ = getpos($2, $1); }
166 	;
167 
168 blockname:
169 	  last BLOCK '.' PLACENAME	{ $$ = getblock(getlast($1,$2), $4); }
170 	| NTH BLOCK '.' PLACENAME	{ $$ = getblock(getfirst($1,$2), $4); }
171 	| PLACENAME '.' PLACENAME	{ y = getvar($1); $$ = getblock(y.o, $3); }
172 	;
173 
174 last:
175 	  last LAST		{ $$ = $1 + 1; }
176 	| NTH LAST		{ $$ = $1; }
177 	| LAST			{ $$ = 1; }
178 	;
179 
180 type:
181 	  BOX
182 	| CIRCLE
183 	| ELLIPSE
184 	| ARC
185 	| LINE
186 	| ARROW
187 	| SPLINE
188 	| BLOCK
189 	;
190 
191 expr:
192 	  expr '+' expr		{ $$ = $1 + $3; }
193 	| expr '-' expr		{ $$ = $1 - $3; }
194 	| expr '*' expr		{ $$ = $1 * $3; }
195 	| expr '/' expr		{ $$ = $1 / $3; }
196 	| expr '%' expr		{ $$ = (long)$1 % (long)$3; }
197 	| '-' expr %prec UMINUS	{ $$ = -$2; }
198 	| '(' expr ')'		{ $$ = $2; }
199 	| VARNAME		{ $$ = getfval($1); }
200 	| NUMBER
201 	| place DOTX		{ $$ = getcomp($1, $2); }
202 	| place DOTY		{ $$ = getcomp($1, $2); }
203 	| place DOTHT		{ $$ = getcomp($1, $2); }
204 	| place DOTWID		{ $$ = getcomp($1, $2); }
205 	| place DOTRAD		{ $$ = getcomp($1, $2); }
206 	;
207