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