1 %term	CONTIG QTEXT SPACE THIN TAB
2 %term	MATRIX LCOL CCOL RCOL COL ABOVE
3 %term	MARK LINEUP
4 %term	SUM INT PROD UNION INTER
5 %term	DEFINE TDEFINE NDEFINE DELIM GSIZE GFONT INCLUDE SPACE IFDEF
6 %term	DOTEQ DOTEN
7 
8 %right	FROM TO
9 %left	OVER SQRT
10 %right	SUP SUB
11 %right	SIZE FONT ROMAN ITALIC BOLD FAT
12 %right	UP DOWN BACK FWD
13 %left	LEFT RIGHT
14 %right	DOT DOTDOT HAT TILDE BAR LOWBAR HIGHBAR UNDER VEC DYAD UTILDE
15 
16 %{
17 #include "e.h"
18 %}
19 
20 %%
21 
22 stuff	: eqn 		{ putout($1); }
23 	| error		{ error(!FATAL, "syntax error"); }
24 	|		{ eqnreg = 0; }
25 	;
26 
27 eqn	: box
28 	| eqn box	{ eqnbox($1, $2, 0); }
29 	| eqn lineupbox	{ eqnbox($1, $2, 1); }
30 	| LINEUP	{ lineup(0); }
31 	;
32 
33 lineupbox: LINEUP box	{ $$ = $2; lineup(1); }
34 	;
35 
36 sbox	: SUP box	%prec SUP	{ $$ = $2; }
37 	|		%prec SUP	{ $$ = 0; }
38 	;
39 
40 tbox	: TO box	%prec TO	{ $$ = $2; }
41 	|		%prec FROM	{ $$ = 0; }
42 	;
43 
44 box	: '{' eqn '}'	{ $$ = $2; }
45 	| QTEXT		{ text(QTEXT, (char *) $1); }
46 	| CONTIG	{ text(CONTIG, (char *) $1); }
47 	| SPACE		{ text(SPACE, 0); }
48 	| THIN		{ text(THIN, 0); }
49 	| TAB		{ text(TAB, 0); }
50 	| SUM		{ funny(SUM); }
51 	| PROD		{ funny(PROD); }
52 	| UNION		{ funny(UNION); }
53 	| INTER		{ funny(INTER); }
54  	| box OVER box			{ boverb($1, $3); }
55 	| MARK box			{ mark($2); }
56 	| size box	%prec SIZE	{ size($1, $2); }
57 	| font box	%prec FONT	{ font($1, $2); }
58 	| FAT box			{ fatbox($2); }
59 	| SQRT box			{ sqrt($2); }
60 	| box SUB {ps -= deltaps;} box sbox	%prec SUB	{ subsup($1, $4, $5); }
61 	| box SUP {ps -= deltaps;} box		%prec SUP	{ subsup($1, 0, $4); }
62 	| int SUB {ps -= deltaps;} box sbox	%prec SUB	{ integral($1, $4, $5); }
63 	| int SUP {ps -= deltaps;} box		%prec SUP	{ integral($1, 0, $4); }
64 	| int					{ integral($1, 0, 0); }
65 	| box FROM {ps -= deltaps;} box tbox	%prec FROM	{ fromto($1, $4, $5); }
66 	| box TO {ps -= deltaps;} box		%prec TO	{ fromto($1, 0, $4); }
67 	| left eqn right			{ paren($1, $2, $3); }
68 	| left eqn 				{ paren($1, $2, 0); }
69 	| box diacrit			{ diacrit($1, $2); }
70 	| fwd box	%prec UP	{ move(FWD, $1, $2); }
71 	| up box	%prec UP	{ move(UP, $1, $2); }
72 	| back box	%prec UP	{ move(BACK, $1, $2); }
73 	| down box	%prec UP	{ move(DOWN, $1, $2); }
74 	| column			{ pile($1); ct = $1; }
75 	| MATRIX {$$=ct;} '{' collist '}'	{ matrix($2); ct = $2; }
76 	;
77 
78 int	: INT		{ setintegral(); }
79 	;
80 
81 fwd	: FWD text	{ $$ = atoi((char *) $1); } ;
82 up	: UP text	{ $$ = atoi((char *) $1); } ;
83 back	: BACK text	{ $$ = atoi((char *) $1); } ;
84 down	: DOWN text	{ $$ = atoi((char *) $1); } ;
85 
86 diacrit	: HAT		{ $$ = HAT; }
87 	| VEC		{ $$ = VEC; }
88 	| DYAD		{ $$ = DYAD; }
89 	| BAR		{ $$ = BAR; }
90 	| LOWBAR	{ $$ = LOWBAR; }
91 	| HIGHBAR	{ $$ = HIGHBAR; }
92 	| UNDER		{ $$ = UNDER; }	/* underbar */
93 	| DOT		{ $$ = DOT; }
94 	| TILDE		{ $$ = TILDE; }
95 	| UTILDE	{ $$ = UTILDE; }
96 	| DOTDOT	{ $$ = DOTDOT; } /* umlaut = double dot */
97 	;
98 
99 left	: LEFT text	{ $$ = ((char *)$2)[0]; }
100 	| LEFT '{'	{ $$ = '{'; }
101 	;
102 
103 right	: RIGHT text	{ $$ = ((char *)$2)[0]; }
104 	| RIGHT '}'	{ $$ = '}'; }
105 	;
106 
107 collist	: column
108 	| collist column
109 	;
110 
111 column	: col '{' list '}'				{ column($1, DEFGAP); }
112 	| col text {$$=atoi((char*)$2);} '{' list '}'	{ column($1, $3); }
113 	;
114 
115 col	: LCOL		{ $$ = startcol(LCOL); }
116 	| CCOL		{ $$ = startcol(CCOL); }
117 	| RCOL		{ $$ = startcol(RCOL); }
118 	| COL		{ $$ = startcol(COL); }
119 	;
120 
121 list	: eqn			{ lp[ct++] = $1; }
122 	| list ABOVE eqn	{ lp[ct++] = $3; }
123 	;
124 
125 size	: SIZE text	{ $$ = ps; setsize((char *) $2); }
126 	;
127 
128 font	: ROMAN		{ setfont("R"); }
129 	| ITALIC	{ setfont("I"); }
130 	| BOLD		{ setfont("B"); }
131 	| FONT text	{ setfont((char *)$2); }
132 	;
133 
134 text	: CONTIG
135 	| QTEXT
136 	;
137 
138 %%
139