xref: /original-bsd/old/eqn/common_source/e.y (revision 1897046e)
1 %{#
2 /*-
3  * Copyright (c) 1991 The Regents of the University of California.
4  * All rights reserved.
5  *
6  * %sccs.include.proprietary.c%
7  */
8 
9 #ifndef lint
10 static char sccsid[] = "@(#)e.y	4.3 (Berkeley) 03/01/93";
11 #endif /* not lint */
12 
13 #include "e.h"
14 int	fromflg;
15 %}
16 %term	CONTIG QTEXT SPACE THIN TAB
17 %term	MATRIX LCOL CCOL RCOL COL
18 %term	MARK LINEUP
19 %term	SUM INT PROD UNION INTER
20 %term	LPILE PILE CPILE RPILE ABOVE
21 %term	DEFINE TDEFINE NDEFINE DELIM GSIZE GFONT INCLUDE
22 %right	FROM TO
23 %left	OVER SQRT
24 %right	SUP SUB
25 %right	SIZE FONT ROMAN ITALIC BOLD FAT
26 %right	UP DOWN BACK FWD
27 %left	LEFT RIGHT
28 %right	DOT DOTDOT HAT TILDE BAR UNDER VEC DYAD
29 
30 %%
31 
32 stuff	: eqn 	{ putout($1); }
33 	| error	{ error(!FATAL, "syntax error"); }
34 	|	{ eqnreg = 0; }
35 	;
36 
37 eqn	: box
38 	| eqn box	{ eqnbox($1, $2, 0); }
39 	| eqn lineupbox	{ eqnbox($1, $2, 1); }
40 	| LINEUP	{ lineup(0); }
41 	;
42 
43 lineupbox: LINEUP box	{ $$ = $2; lineup(1); }
44 	;
45 
46 matrix	: MATRIX	{ $$ = ct; } ;
47 
48 collist	: column
49 	| collist column
50 	;
51 
52 column	: lcol '{' list '}'	{ column('L', $1); }
53 	| ccol '{' list '}'	{ column('C', $1); }
54 	| rcol '{' list '}'	{ column('R', $1); }
55 	| col '{' list '}'	{ column('-', $1); }
56 	;
57 
58 lcol	: LCOL		{ $$ = ct++; } ;
59 ccol	: CCOL		{ $$ = ct++; } ;
60 rcol	: RCOL		{ $$ = ct++; } ;
61 col	: COL		{ $$ = ct++; } ;
62 
63 sbox	: sup box	%prec SUP	{ $$ = $2; }
64 	;
65 
66 tbox	: to box	%prec TO	{ $$ = $2; }
67 	|		%prec FROM	{ $$ = 0; }
68 	;
69 
70 box	: box OVER box	{ boverb($1, $3); }
71 	| MARK box	{ mark($2); }
72 	| size box	%prec SIZE	{ size($1, $2); }
73 	| font box	%prec FONT	{ font($1, $2); }
74 	| FAT box	{ fatbox($2); }
75 	| SQRT box	{ eqsqrt($2); }
76 	| lpile '{' list '}'	{ lpile('L', $1, ct); ct = $1; }
77 	| cpile '{' list '}'	{ lpile('C', $1, ct); ct = $1; }
78 	| rpile '{' list '}'	{ lpile('R', $1, ct); ct = $1; }
79 	| pile '{' list '}'	{ lpile('-', $1, ct); ct = $1; }
80 	| box sub box sbox	%prec SUB	{ shift2($1, $3, $4); }
81 	| box sub box		%prec SUB	{ bshiftb($1, $2, $3); }
82 	| box sup box		%prec SUP	{ bshiftb($1, $2, $3); }
83 	| int sub box sbox	%prec SUB	{ integral($1, $3, $4); }
84 	| int sub box		%prec SUB	{ integral($1, $3, 0); }
85 	| int sup box		%prec SUP	{ integral($1, 0, $3); }
86 	| int					{ integral($1, 0, 0); }
87 	| left eqn right	{ paren($1, $2, $3); }
88 	| pbox
89 	| box from box tbox	%prec FROM	{ fromto($1, $3, $4); fromflg=0; }
90 	| box to box	%prec TO	{ fromto($1, 0, $3); }
91 	| box diacrit	{ diacrit($1, $2); }
92 	| fwd box	%prec UP	{ move(FWD, $1, $2); }
93 	| up box	%prec UP	{ move(UP, $1, $2); }
94 	| back box	%prec UP	{ move(BACK, $1, $2); }
95 	| down box	%prec UP	{ move(DOWN, $1, $2); }
96 	| matrix '{' collist '}'	{ matrix($1); }
97 	;
98 
99 int	: INT	{ setintegral(); }
100 	;
101 
102 fwd	: FWD text	{ $$ = atoi((char *) $1); } ;
103 up	: UP text	{ $$ = atoi((char *) $1); } ;
104 back	: BACK text	{ $$ = atoi((char *) $1); } ;
105 down	: DOWN text	{ $$ = atoi((char *) $1); } ;
106 
107 diacrit	: HAT	{ $$ = HAT; }
108 	| VEC	{ $$ = VEC; }
109 	| DYAD	{ $$ = DYAD; }
110 	| BAR	{ $$ = BAR; }
111 	| UNDER	{ $$ = UNDER; }	/* under bar */
112 	| DOT	{ $$ = DOT; }
113 	| TILDE	{ $$ = TILDE; }
114 	| DOTDOT	{ $$ = DOTDOT; } /* umlaut = double dot */
115 	;
116 
117 from	: FROM	{ $$=ps; ps -= 3; fromflg = 1;
118 		if(dbg)printf(".\tfrom: old ps %d, new ps %d, fflg %d\n", $$, ps, fromflg);
119 		}
120 	;
121 
122 to	: TO	{ $$=ps; if(fromflg==0)ps -= 3;
123 			if(dbg)printf(".\tto: old ps %d, new ps %d\n", $$, ps);
124 		}
125 	;
126 
127 left	: LEFT text	{ $$ = ((char *)$2)[0]; }
128 	| LEFT '{'	{ $$ = '{'; }
129 	;
130 
131 right	: RIGHT text	{ $$ = ((char *)$2)[0]; }
132 	| RIGHT '}'	{ $$ = '}'; }
133 	|		{ $$ = 0; }
134 	;
135 
136 list	: eqn	{ lp[ct++] = $1; }
137 	| list ABOVE eqn	{ lp[ct++] = $3; }
138 	;
139 
140 lpile	: LPILE	{ $$ = ct; } ;
141 cpile	: CPILE	{ $$ = ct; } ;
142 pile	: PILE	{ $$ = ct; } ;
143 rpile	: RPILE	{ $$ = ct; } ;
144 
145 size	: SIZE text	{ $$ = ps; setsize((char *) $2); }
146 	;
147 
148 font	: ROMAN		{ setfont(ROM); }
149 	| ITALIC	{ setfont(ITAL); }
150 	| BOLD		{ setfont(BLD); }
151 	| FONT text	{ setfont(((char *)$2)[0]); }
152 	;
153 
154 sub	: SUB	{ shift(SUB); }
155 	;
156 
157 sup	: SUP	{ shift(SUP); }
158 	;
159 
160 pbox	: '{' eqn '}'	{ $$ = $2; }
161 	| QTEXT		{ text(QTEXT, (char *) $1); }
162 	| CONTIG	{ text(CONTIG, (char *) $1); }
163 	| SPACE		{ text(SPACE, 0); }
164 	| THIN		{ text(THIN, 0); }
165 	| TAB		{ text(TAB, 0); }
166 	| SUM		{ funny(SUM); }
167 	| PROD		{ funny(PROD); }
168 	| UNION		{ funny(UNION); }
169 	| INTER		{ funny(INTER); }	/* intersection */
170 	;
171 
172 text	: CONTIG
173 	| QTEXT
174 	;
175 
176 %%
177