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