eqn.y revision 151497
1151497Sru/* Copyright (C) 1989, 1990, 1991, 1992, 2004 Free Software Foundation, Inc. 275584Sru Written by James Clark (jjc@jclark.com) 375584Sru 475584SruThis file is part of groff. 575584Sru 675584Srugroff is free software; you can redistribute it and/or modify it under 775584Sruthe terms of the GNU General Public License as published by the Free 875584SruSoftware Foundation; either version 2, or (at your option) any later 975584Sruversion. 1075584Sru 1175584Srugroff is distributed in the hope that it will be useful, but WITHOUT ANY 1275584SruWARRANTY; without even the implied warranty of MERCHANTABILITY or 1375584SruFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1475584Srufor more details. 1575584Sru 1675584SruYou should have received a copy of the GNU General Public License along 1775584Sruwith groff; see the file COPYING. If not, write to the Free Software 18151497SruFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 1975584Sru%{ 2075584Sru#include <stdio.h> 2175584Sru#include <string.h> 2275584Sru#include <stdlib.h> 2375584Sru 2475584Sru#include "lib.h" 2575584Sru#include "box.h" 2675584Sruextern int non_empty_flag; 2775584Sruint yylex(); 2875584Sruvoid yyerror(const char *); 2975584Sru%} 3075584Sru 3175584Sru%union { 3275584Sru char *str; 3375584Sru box *b; 3475584Sru pile_box *pb; 3575584Sru matrix_box *mb; 3675584Sru int n; 3775584Sru column *col; 3875584Sru} 3975584Sru 4075584Sru%token OVER 4175584Sru%token SMALLOVER 4275584Sru%token SQRT 4375584Sru%token SUB 4475584Sru%token SUP 4575584Sru%token LPILE 4675584Sru%token RPILE 4775584Sru%token CPILE 4875584Sru%token PILE 4975584Sru%token LEFT 5075584Sru%token RIGHT 5175584Sru%token TO 5275584Sru%token FROM 5375584Sru%token SIZE 5475584Sru%token FONT 5575584Sru%token ROMAN 5675584Sru%token BOLD 5775584Sru%token ITALIC 5875584Sru%token FAT 5975584Sru%token ACCENT 6075584Sru%token BAR 6175584Sru%token UNDER 6275584Sru%token ABOVE 6375584Sru%token <str> TEXT 6475584Sru%token <str> QUOTED_TEXT 6575584Sru%token FWD 6675584Sru%token BACK 6775584Sru%token DOWN 6875584Sru%token UP 6975584Sru%token MATRIX 7075584Sru%token COL 7175584Sru%token LCOL 7275584Sru%token RCOL 7375584Sru%token CCOL 7475584Sru%token MARK 7575584Sru%token LINEUP 7675584Sru%token TYPE 7775584Sru%token VCENTER 7875584Sru%token PRIME 7975584Sru%token SPLIT 8075584Sru%token NOSPLIT 8175584Sru%token UACCENT 8275584Sru%token SPECIAL 8375584Sru 8475584Sru/* these are handled in the lexer */ 8575584Sru%token SPACE 8675584Sru%token GFONT 8775584Sru%token GSIZE 8875584Sru%token DEFINE 8975584Sru%token NDEFINE 9075584Sru%token TDEFINE 9175584Sru%token SDEFINE 9275584Sru%token UNDEF 9375584Sru%token IFDEF 9475584Sru%token INCLUDE 9575584Sru%token DELIM 9675584Sru%token CHARTYPE 9775584Sru%token SET 9875584Sru%token GRFONT 9975584Sru%token GBFONT 10075584Sru 10175584Sru/* The original eqn manual says that `left' is right associative. It's lying. 10275584SruConsider `left ( ~ left ( ~ right ) right )'. */ 10375584Sru 10475584Sru%right LEFT 10575584Sru%left RIGHT 10675584Sru%right LPILE RPILE CPILE PILE TEXT QUOTED_TEXT MATRIX MARK LINEUP '^' '~' '\t' '{' SPLIT NOSPLIT 10775584Sru%right FROM TO 10875584Sru%left SQRT OVER SMALLOVER 10975584Sru%right SUB SUP 11075584Sru%right ROMAN BOLD ITALIC FAT FONT SIZE FWD BACK DOWN UP TYPE VCENTER SPECIAL 11175584Sru%right BAR UNDER PRIME 11275584Sru%left ACCENT UACCENT 11375584Sru 11475584Sru%type <b> mark from_to sqrt_over script simple equation nonsup 11575584Sru%type <n> number 11675584Sru%type <str> text delim 11775584Sru%type <pb> pile_element_list pile_arg 11875584Sru%type <mb> column_list 11975584Sru%type <col> column column_arg column_element_list 12075584Sru 12175584Sru%% 12275584Srutop: 12375584Sru /* empty */ 12475584Sru | equation 12575584Sru { $1->top_level(); non_empty_flag = 1; } 12675584Sru ; 12775584Sru 12875584Sruequation: 12975584Sru mark 13075584Sru { $$ = $1; } 13175584Sru | equation mark 13275584Sru { 13375584Sru list_box *lb = $1->to_list_box(); 13475584Sru if (!lb) 13575584Sru lb = new list_box($1); 13675584Sru lb->append($2); 13775584Sru $$ = lb; 13875584Sru } 13975584Sru ; 14075584Sru 14175584Srumark: 14275584Sru from_to 14375584Sru { $$ = $1; } 14475584Sru | MARK mark 14575584Sru { $$ = make_mark_box($2); } 14675584Sru | LINEUP mark 14775584Sru { $$ = make_lineup_box($2); } 14875584Sru ; 14975584Sru 15075584Srufrom_to: 15175584Sru sqrt_over %prec FROM 15275584Sru { $$ = $1; } 15375584Sru | sqrt_over TO from_to 15475584Sru { $$ = make_limit_box($1, 0, $3); } 15575584Sru | sqrt_over FROM sqrt_over 15675584Sru { $$ = make_limit_box($1, $3, 0); } 15775584Sru | sqrt_over FROM sqrt_over TO from_to 15875584Sru { $$ = make_limit_box($1, $3, $5); } 15975584Sru | sqrt_over FROM sqrt_over FROM from_to 16075584Sru { $$ = make_limit_box($1, make_limit_box($3, $5, 0), 0); } 16175584Sru ; 16275584Sru 16375584Srusqrt_over: 16475584Sru script 16575584Sru { $$ = $1; } 16675584Sru | SQRT sqrt_over 16775584Sru { $$ = make_sqrt_box($2); } 16875584Sru | sqrt_over OVER sqrt_over 16975584Sru { $$ = make_over_box($1, $3); } 17075584Sru | sqrt_over SMALLOVER sqrt_over 17175584Sru { $$ = make_small_over_box($1, $3); } 17275584Sru ; 17375584Sru 17475584Sruscript: 17575584Sru nonsup 17675584Sru { $$ = $1; } 17775584Sru | simple SUP script 17875584Sru { $$ = make_script_box($1, 0, $3); } 17975584Sru ; 18075584Sru 18175584Srunonsup: 18275584Sru simple %prec SUP 18375584Sru { $$ = $1; } 18475584Sru | simple SUB nonsup 18575584Sru { $$ = make_script_box($1, $3, 0); } 18675584Sru | simple SUB simple SUP script 18775584Sru { $$ = make_script_box($1, $3, $5); } 18875584Sru ; 18975584Sru 19075584Srusimple: 19175584Sru TEXT 19275584Sru { $$ = split_text($1); } 19375584Sru | QUOTED_TEXT 19475584Sru { $$ = new quoted_text_box($1); } 19575584Sru | SPLIT QUOTED_TEXT 19675584Sru { $$ = split_text($2); } 19775584Sru | NOSPLIT TEXT 19875584Sru { $$ = new quoted_text_box($2); } 19975584Sru | '^' 20075584Sru { $$ = new half_space_box; } 20175584Sru | '~' 20275584Sru { $$ = new space_box; } 20375584Sru | '\t' 20475584Sru { $$ = new tab_box; } 20575584Sru | '{' equation '}' 20675584Sru { $$ = $2; } 20775584Sru | PILE pile_arg 20875584Sru { $2->set_alignment(CENTER_ALIGN); $$ = $2; } 20975584Sru | LPILE pile_arg 21075584Sru { $2->set_alignment(LEFT_ALIGN); $$ = $2; } 21175584Sru | RPILE pile_arg 21275584Sru { $2->set_alignment(RIGHT_ALIGN); $$ = $2; } 21375584Sru | CPILE pile_arg 21475584Sru { $2->set_alignment(CENTER_ALIGN); $$ = $2; } 21575584Sru | MATRIX '{' column_list '}' 21675584Sru { $$ = $3; } 21775584Sru | LEFT delim equation RIGHT delim 21875584Sru { $$ = make_delim_box($2, $3, $5); } 21975584Sru | LEFT delim equation 22075584Sru { $$ = make_delim_box($2, $3, 0); } 22175584Sru | simple BAR 22275584Sru { $$ = make_overline_box($1); } 22375584Sru | simple UNDER 22475584Sru { $$ = make_underline_box($1); } 22575584Sru | simple PRIME 22675584Sru { $$ = make_prime_box($1); } 22775584Sru | simple ACCENT simple 22875584Sru { $$ = make_accent_box($1, $3); } 22975584Sru | simple UACCENT simple 23075584Sru { $$ = make_uaccent_box($1, $3); } 23175584Sru | ROMAN simple 23275584Sru { $$ = new font_box(strsave(get_grfont()), $2); } 23375584Sru | BOLD simple 23475584Sru { $$ = new font_box(strsave(get_gbfont()), $2); } 23575584Sru | ITALIC simple 23675584Sru { $$ = new font_box(strsave(get_gfont()), $2); } 23775584Sru | FAT simple 23875584Sru { $$ = new fat_box($2); } 23975584Sru | FONT text simple 24075584Sru { $$ = new font_box($2, $3); } 24175584Sru | SIZE text simple 24275584Sru { $$ = new size_box($2, $3); } 24375584Sru | FWD number simple 24475584Sru { $$ = new hmotion_box($2, $3); } 24575584Sru | BACK number simple 24675584Sru { $$ = new hmotion_box(-$2, $3); } 24775584Sru | UP number simple 24875584Sru { $$ = new vmotion_box($2, $3); } 24975584Sru | DOWN number simple 25075584Sru { $$ = new vmotion_box(-$2, $3); } 25175584Sru | TYPE text simple 25275584Sru { $3->set_spacing_type($2); $$ = $3; } 25375584Sru | VCENTER simple 25475584Sru { $$ = new vcenter_box($2); } 25575584Sru | SPECIAL text simple 25675584Sru { $$ = make_special_box($2, $3); } 25775584Sru ; 25875584Sru 25975584Srunumber: 26075584Sru text 26175584Sru { 26275584Sru int n; 26375584Sru if (sscanf($1, "%d", &n) == 1) 26475584Sru $$ = n; 26575584Sru a_delete $1; 26675584Sru } 26775584Sru ; 26875584Sru 26975584Srupile_element_list: 27075584Sru equation 27175584Sru { $$ = new pile_box($1); } 27275584Sru | pile_element_list ABOVE equation 27375584Sru { $1->append($3); $$ = $1; } 27475584Sru ; 27575584Sru 27675584Srupile_arg: 27775584Sru '{' pile_element_list '}' 27875584Sru { $$ = $2; } 27975584Sru | number '{' pile_element_list '}' 28075584Sru { $3->set_space($1); $$ = $3; } 28175584Sru ; 28275584Sru 28375584Srucolumn_list: 28475584Sru column 28575584Sru { $$ = new matrix_box($1); } 28675584Sru | column_list column 28775584Sru { $1->append($2); $$ = $1; } 28875584Sru ; 28975584Sru 29075584Srucolumn_element_list: 29175584Sru equation 29275584Sru { $$ = new column($1); } 29375584Sru | column_element_list ABOVE equation 29475584Sru { $1->append($3); $$ = $1; } 29575584Sru ; 29675584Sru 29775584Srucolumn_arg: 29875584Sru '{' column_element_list '}' 29975584Sru { $$ = $2; } 30075584Sru | number '{' column_element_list '}' 30175584Sru { $3->set_space($1); $$ = $3; } 30275584Sru ; 30375584Sru 30475584Srucolumn: 30575584Sru COL column_arg 30675584Sru { $2->set_alignment(CENTER_ALIGN); $$ = $2; } 30775584Sru | LCOL column_arg 30875584Sru { $2->set_alignment(LEFT_ALIGN); $$ = $2; } 30975584Sru | RCOL column_arg 31075584Sru { $2->set_alignment(RIGHT_ALIGN); $$ = $2; } 31175584Sru | CCOL column_arg 31275584Sru { $2->set_alignment(CENTER_ALIGN); $$ = $2; } 31375584Sru ; 31475584Sru 31575584Srutext: TEXT 31675584Sru { $$ = $1; } 31775584Sru | QUOTED_TEXT 31875584Sru { $$ = $1; } 31975584Sru ; 32075584Sru 32175584Srudelim: 32275584Sru text 32375584Sru { $$ = $1; } 32475584Sru | '{' 32575584Sru { $$ = strsave("{"); } 32675584Sru | '}' 32775584Sru { $$ = strsave("}"); } 32875584Sru ; 32975584Sru 33075584Sru%% 331