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