xref: /netbsd-src/external/gpl2/groff/dist/src/preproc/eqn/eqn.y (revision 89a07cf815a29524268025a1139fac4c5190f765)
1 /*	$NetBSD: eqn.y,v 1.1.1.1 2016/01/13 18:41:49 christos Exp $	*/
2 
3 /* Copyright (C) 1989, 1990, 1991, 1992, 2004 Free Software Foundation, Inc.
4      Written by James Clark (jjc@jclark.com)
5 
6 This file is part of groff.
7 
8 groff is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12 
13 groff is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17 
18 You should have received a copy of the GNU General Public License along
19 with groff; see the file COPYING.  If not, write to the Free Software
20 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
21 %{
22 #include <stdio.h>
23 #include <string.h>
24 #include <stdlib.h>
25 
26 #include "lib.h"
27 #include "box.h"
28 extern int non_empty_flag;
29 int yylex();
30 void yyerror(const char *);
31 %}
32 
33 %union {
34 	char *str;
35 	box *b;
36 	pile_box *pb;
37 	matrix_box *mb;
38 	int n;
39 	column *col;
40 }
41 
42 %token OVER
43 %token SMALLOVER
44 %token SQRT
45 %token SUB
46 %token SUP
47 %token LPILE
48 %token RPILE
49 %token CPILE
50 %token PILE
51 %token LEFT
52 %token RIGHT
53 %token TO
54 %token FROM
55 %token SIZE
56 %token FONT
57 %token ROMAN
58 %token BOLD
59 %token ITALIC
60 %token FAT
61 %token ACCENT
62 %token BAR
63 %token UNDER
64 %token ABOVE
65 %token <str> TEXT
66 %token <str> QUOTED_TEXT
67 %token FWD
68 %token BACK
69 %token DOWN
70 %token UP
71 %token MATRIX
72 %token COL
73 %token LCOL
74 %token RCOL
75 %token CCOL
76 %token MARK
77 %token LINEUP
78 %token TYPE
79 %token VCENTER
80 %token PRIME
81 %token SPLIT
82 %token NOSPLIT
83 %token UACCENT
84 %token SPECIAL
85 
86 /* these are handled in the lexer */
87 %token SPACE
88 %token GFONT
89 %token GSIZE
90 %token DEFINE
91 %token NDEFINE
92 %token TDEFINE
93 %token SDEFINE
94 %token UNDEF
95 %token IFDEF
96 %token INCLUDE
97 %token DELIM
98 %token CHARTYPE
99 %token SET
100 %token GRFONT
101 %token GBFONT
102 
103 /* The original eqn manual says that `left' is right associative. It's lying.
104 Consider `left ( ~ left ( ~ right ) right )'. */
105 
106 %right LEFT
107 %left RIGHT
108 %right LPILE RPILE CPILE PILE TEXT QUOTED_TEXT MATRIX MARK LINEUP '^' '~' '\t' '{' SPLIT NOSPLIT
109 %right FROM TO
110 %left SQRT OVER SMALLOVER
111 %right SUB SUP
112 %right ROMAN BOLD ITALIC FAT FONT SIZE FWD BACK DOWN UP TYPE VCENTER SPECIAL
113 %right BAR UNDER PRIME
114 %left ACCENT UACCENT
115 
116 %type <b> mark from_to sqrt_over script simple equation nonsup
117 %type <n> number
118 %type <str> text delim
119 %type <pb> pile_element_list pile_arg
120 %type <mb> column_list
121 %type <col> column column_arg column_element_list
122 
123 %%
124 top:
125 	/* empty */
126 	| equation
127 		{ $1->top_level(); non_empty_flag = 1; }
128 	;
129 
130 equation:
131 	mark
132 		{ $$ = $1; }
133 	| equation mark
134 		{
135 		  list_box *lb = $1->to_list_box();
136 		  if (!lb)
137 		    lb = new list_box($1);
138 		  lb->append($2);
139 		  $$ = lb;
140 		}
141 	;
142 
143 mark:
144 	from_to
145 		{ $$ = $1; }
146 	| MARK mark
147 		{ $$ = make_mark_box($2); }
148 	| LINEUP mark
149 		{ $$ = make_lineup_box($2); }
150 	;
151 
152 from_to:
153 	sqrt_over  %prec FROM
154 		{ $$ = $1; }
155 	| sqrt_over TO from_to
156 		{ $$ = make_limit_box($1, 0, $3); }
157 	| sqrt_over FROM sqrt_over
158 		{ $$ = make_limit_box($1, $3, 0); }
159 	| sqrt_over FROM sqrt_over TO from_to
160 		{ $$ = make_limit_box($1, $3, $5); }
161 	| sqrt_over FROM sqrt_over FROM from_to
162 		{ $$ = make_limit_box($1, make_limit_box($3, $5, 0), 0); }
163 	;
164 
165 sqrt_over:
166 	script
167 		{ $$ = $1; }
168 	| SQRT sqrt_over
169 		{ $$ = make_sqrt_box($2); }
170 	| sqrt_over OVER sqrt_over
171 		{ $$ = make_over_box($1, $3); }
172 	| sqrt_over SMALLOVER sqrt_over
173 		{ $$ = make_small_over_box($1, $3); }
174 	;
175 
176 script:
177 	nonsup
178 		{ $$ = $1; }
179 	| simple SUP script
180 		{ $$ = make_script_box($1, 0, $3); }
181 	;
182 
183 nonsup:
184 	simple  %prec SUP
185 		{ $$ = $1; }
186 	| simple SUB nonsup
187 		{ $$ = make_script_box($1, $3, 0); }
188 	| simple SUB simple SUP script
189 		{ $$ = make_script_box($1, $3, $5); }
190 	;
191 
192 simple:
193 	TEXT
194 		{ $$ = split_text($1); }
195 	| QUOTED_TEXT
196 		{ $$ = new quoted_text_box($1); }
197 	| SPLIT QUOTED_TEXT
198 		{ $$ = split_text($2); }
199 	| NOSPLIT TEXT
200 		{ $$ = new quoted_text_box($2); }
201 	| '^'
202 		{ $$ = new half_space_box; }
203 	| '~'
204 		{ $$ = new space_box; }
205 	| '\t'
206 		{ $$ = new tab_box; }
207 	| '{' equation '}'
208 		{ $$ = $2; }
209 	| PILE pile_arg
210 		{ $2->set_alignment(CENTER_ALIGN); $$ = $2; }
211 	| LPILE pile_arg
212 		{ $2->set_alignment(LEFT_ALIGN); $$ = $2; }
213 	| RPILE pile_arg
214 		{ $2->set_alignment(RIGHT_ALIGN); $$ = $2; }
215 	| CPILE pile_arg
216 		{ $2->set_alignment(CENTER_ALIGN); $$ = $2; }
217 	| MATRIX '{' column_list '}'
218 		{ $$ = $3; }
219 	| LEFT delim equation RIGHT delim
220 		{ $$ = make_delim_box($2, $3, $5); }
221 	| LEFT delim equation
222 		{ $$ = make_delim_box($2, $3, 0); }
223 	| simple BAR
224 		{ $$ = make_overline_box($1); }
225 	| simple UNDER
226 		{ $$ = make_underline_box($1); }
227 	| simple PRIME
228 		{ $$ = make_prime_box($1); }
229 	| simple ACCENT simple
230 		{ $$ = make_accent_box($1, $3); }
231 	| simple UACCENT simple
232 		{ $$ = make_uaccent_box($1, $3); }
233 	| ROMAN simple
234 		{ $$ = new font_box(strsave(get_grfont()), $2); }
235 	| BOLD simple
236 		{ $$ = new font_box(strsave(get_gbfont()), $2); }
237 	| ITALIC simple
238 		{ $$ = new font_box(strsave(get_gfont()), $2); }
239 	| FAT simple
240 		{ $$ = new fat_box($2); }
241 	| FONT text simple
242 		{ $$ = new font_box($2, $3); }
243 	| SIZE text simple
244 		{ $$ = new size_box($2, $3); }
245 	| FWD number simple
246 		{ $$ = new hmotion_box($2, $3); }
247 	| BACK number simple
248 		{ $$ = new hmotion_box(-$2, $3); }
249 	| UP number simple
250 		{ $$ = new vmotion_box($2, $3); }
251 	| DOWN number simple
252 		{ $$ = new vmotion_box(-$2, $3); }
253 	| TYPE text simple
254 		{ $3->set_spacing_type($2); $$ = $3; }
255 	| VCENTER simple
256 		{ $$ = new vcenter_box($2); }
257 	| SPECIAL text simple
258 		{ $$ = make_special_box($2, $3); }
259 	;
260 
261 number:
262 	text
263 		{
264 		  int n;
265 		  if (sscanf($1, "%d", &n) == 1)
266 		    $$ = n;
267 		  a_delete $1;
268 		}
269 	;
270 
271 pile_element_list:
272 	equation
273 		{ $$ = new pile_box($1); }
274 	| pile_element_list ABOVE equation
275 		{ $1->append($3); $$ = $1; }
276 	;
277 
278 pile_arg:
279   	'{' pile_element_list '}'
280 		{ $$ = $2; }
281 	| number '{' pile_element_list '}'
282 		{ $3->set_space($1); $$ = $3; }
283 	;
284 
285 column_list:
286 	column
287 		{ $$ = new matrix_box($1); }
288 	| column_list column
289 		{ $1->append($2); $$ = $1; }
290 	;
291 
292 column_element_list:
293 	equation
294 		{ $$ = new column($1); }
295 	| column_element_list ABOVE equation
296 		{ $1->append($3); $$ = $1; }
297 	;
298 
299 column_arg:
300   	'{' column_element_list '}'
301 		{ $$ = $2; }
302 	| number '{' column_element_list '}'
303 		{ $3->set_space($1); $$ = $3; }
304 	;
305 
306 column:
307 	COL column_arg
308 		{ $2->set_alignment(CENTER_ALIGN); $$ = $2; }
309 	| LCOL column_arg
310 		{ $2->set_alignment(LEFT_ALIGN); $$ = $2; }
311 	| RCOL column_arg
312 		{ $2->set_alignment(RIGHT_ALIGN); $$ = $2; }
313 	| CCOL column_arg
314 		{ $2->set_alignment(CENTER_ALIGN); $$ = $2; }
315 	;
316 
317 text:	TEXT
318 		{ $$ = $1; }
319 	| QUOTED_TEXT
320 		{ $$ = $1; }
321 	;
322 
323 delim:
324 	text
325 		{ $$ = $1; }
326 	| '{'
327 		{ $$ = strsave("{"); }
328 	| '}'
329 		{ $$ = strsave("}"); }
330 	;
331 
332 %%
333