eqn.y revision 75584
1/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. 2 Written by James Clark (jjc@jclark.com) 3 4This file is part of groff. 5 6groff is free software; you can redistribute it and/or modify it under 7the terms of the GNU General Public License as published by the Free 8Software Foundation; either version 2, or (at your option) any later 9version. 10 11groff is distributed in the hope that it will be useful, but WITHOUT ANY 12WARRANTY; without even the implied warranty of MERCHANTABILITY or 13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14for more details. 15 16You should have received a copy of the GNU General Public License along 17with groff; see the file COPYING. If not, write to the Free Software 18Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 19%{ 20#include <stdio.h> 21#include <string.h> 22#include <stdlib.h> 23 24#include "lib.h" 25#include "box.h" 26extern int non_empty_flag; 27char *strsave(const char *); 28int yylex(); 29void yyerror(const char *); 30%} 31 32%union { 33 char *str; 34 box *b; 35 pile_box *pb; 36 matrix_box *mb; 37 int n; 38 column *col; 39} 40 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 84 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 101 102/* The original eqn manual says that `left' is right associative. It's lying. 103Consider `left ( ~ left ( ~ right ) right )'. */ 104 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 114 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 121 122%% 123top: 124 /* empty */ 125 | equation 126 { $1->top_level(); non_empty_flag = 1; } 127 ; 128 129equation: 130 mark 131 { $$ = $1; } 132 | equation mark 133 { 134 list_box *lb = $1->to_list_box(); 135 if (!lb) 136 lb = new list_box($1); 137 lb->append($2); 138 $$ = lb; 139 } 140 ; 141 142mark: 143 from_to 144 { $$ = $1; } 145 | MARK mark 146 { $$ = make_mark_box($2); } 147 | LINEUP mark 148 { $$ = make_lineup_box($2); } 149 ; 150 151from_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); } 162 ; 163 164sqrt_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); } 173 ; 174 175script: 176 nonsup 177 { $$ = $1; } 178 | simple SUP script 179 { $$ = make_script_box($1, 0, $3); } 180 ; 181 182nonsup: 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); } 189 ; 190 191simple: 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); } 258 ; 259 260number: 261 text 262 { 263 int n; 264 if (sscanf($1, "%d", &n) == 1) 265 $$ = n; 266 a_delete $1; 267 } 268 ; 269 270pile_element_list: 271 equation 272 { $$ = new pile_box($1); } 273 | pile_element_list ABOVE equation 274 { $1->append($3); $$ = $1; } 275 ; 276 277pile_arg: 278 '{' pile_element_list '}' 279 { $$ = $2; } 280 | number '{' pile_element_list '}' 281 { $3->set_space($1); $$ = $3; } 282 ; 283 284column_list: 285 column 286 { $$ = new matrix_box($1); } 287 | column_list column 288 { $1->append($2); $$ = $1; } 289 ; 290 291column_element_list: 292 equation 293 { $$ = new column($1); } 294 | column_element_list ABOVE equation 295 { $1->append($3); $$ = $1; } 296 ; 297 298column_arg: 299 '{' column_element_list '}' 300 { $$ = $2; } 301 | number '{' column_element_list '}' 302 { $3->set_space($1); $$ = $3; } 303 ; 304 305column: 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; } 314 ; 315 316text: TEXT 317 { $$ = $1; } 318 | QUOTED_TEXT 319 { $$ = $1; } 320 ; 321 322delim: 323 text 324 { $$ = $1; } 325 | '{' 326 { $$ = strsave("{"); } 327 | '}' 328 { $$ = strsave("}"); } 329 ; 330 331%% 332