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