xref: /original-bsd/old/eqn/common_source/e.y (revision 7ead102e)
10b2a88b4Sshannon %{#
2ee3cb8f7Sbostic /*-
3ee3cb8f7Sbostic  * Copyright (c) 1991 The Regents of the University of California.
4ee3cb8f7Sbostic  * All rights reserved.
5ee3cb8f7Sbostic  *
6ee3cb8f7Sbostic  * %sccs.include.proprietary.c%
7ee3cb8f7Sbostic  */
8ee3cb8f7Sbostic 
9ee3cb8f7Sbostic #ifndef lint
10*7ead102eStorek static char sccsid[] = "@(#)e.y	4.3 (Berkeley) 03/01/93";
11ee3cb8f7Sbostic #endif /* not lint */
12ee3cb8f7Sbostic 
130b2a88b4Sshannon #include "e.h"
140b2a88b4Sshannon int	fromflg;
150b2a88b4Sshannon %}
160b2a88b4Sshannon %term	CONTIG QTEXT SPACE THIN TAB
170b2a88b4Sshannon %term	MATRIX LCOL CCOL RCOL COL
180b2a88b4Sshannon %term	MARK LINEUP
190b2a88b4Sshannon %term	SUM INT PROD UNION INTER
200b2a88b4Sshannon %term	LPILE PILE CPILE RPILE ABOVE
210b2a88b4Sshannon %term	DEFINE TDEFINE NDEFINE DELIM GSIZE GFONT INCLUDE
220b2a88b4Sshannon %right	FROM TO
230b2a88b4Sshannon %left	OVER SQRT
240b2a88b4Sshannon %right	SUP SUB
250b2a88b4Sshannon %right	SIZE FONT ROMAN ITALIC BOLD FAT
260b2a88b4Sshannon %right	UP DOWN BACK FWD
270b2a88b4Sshannon %left	LEFT RIGHT
280b2a88b4Sshannon %right	DOT DOTDOT HAT TILDE BAR UNDER VEC DYAD
290b2a88b4Sshannon 
300b2a88b4Sshannon %%
310b2a88b4Sshannon 
320b2a88b4Sshannon stuff	: eqn 	{ putout($1); }
330b2a88b4Sshannon 	| error	{ error(!FATAL, "syntax error"); }
340b2a88b4Sshannon 	|	{ eqnreg = 0; }
350b2a88b4Sshannon 	;
360b2a88b4Sshannon 
370b2a88b4Sshannon eqn	: box
380b2a88b4Sshannon 	| eqn box	{ eqnbox($1, $2, 0); }
390b2a88b4Sshannon 	| eqn lineupbox	{ eqnbox($1, $2, 1); }
400b2a88b4Sshannon 	| LINEUP	{ lineup(0); }
410b2a88b4Sshannon 	;
420b2a88b4Sshannon 
430b2a88b4Sshannon lineupbox: LINEUP box	{ $$ = $2; lineup(1); }
440b2a88b4Sshannon 	;
450b2a88b4Sshannon 
460b2a88b4Sshannon matrix	: MATRIX	{ $$ = ct; } ;
470b2a88b4Sshannon 
480b2a88b4Sshannon collist	: column
490b2a88b4Sshannon 	| collist column
500b2a88b4Sshannon 	;
510b2a88b4Sshannon 
520b2a88b4Sshannon column	: lcol '{' list '}'	{ column('L', $1); }
530b2a88b4Sshannon 	| ccol '{' list '}'	{ column('C', $1); }
540b2a88b4Sshannon 	| rcol '{' list '}'	{ column('R', $1); }
550b2a88b4Sshannon 	| col '{' list '}'	{ column('-', $1); }
560b2a88b4Sshannon 	;
570b2a88b4Sshannon 
580b2a88b4Sshannon lcol	: LCOL		{ $$ = ct++; } ;
590b2a88b4Sshannon ccol	: CCOL		{ $$ = ct++; } ;
600b2a88b4Sshannon rcol	: RCOL		{ $$ = ct++; } ;
610b2a88b4Sshannon col	: COL		{ $$ = ct++; } ;
620b2a88b4Sshannon 
630b2a88b4Sshannon sbox	: sup box	%prec SUP	{ $$ = $2; }
640b2a88b4Sshannon 	;
650b2a88b4Sshannon 
660b2a88b4Sshannon tbox	: to box	%prec TO	{ $$ = $2; }
670b2a88b4Sshannon 	|		%prec FROM	{ $$ = 0; }
680b2a88b4Sshannon 	;
690b2a88b4Sshannon 
700b2a88b4Sshannon box	: box OVER box	{ boverb($1, $3); }
710b2a88b4Sshannon 	| MARK box	{ mark($2); }
720b2a88b4Sshannon 	| size box	%prec SIZE	{ size($1, $2); }
730b2a88b4Sshannon 	| font box	%prec FONT	{ font($1, $2); }
740b2a88b4Sshannon 	| FAT box	{ fatbox($2); }
75*7ead102eStorek 	| SQRT box	{ eqsqrt($2); }
760b2a88b4Sshannon 	| lpile '{' list '}'	{ lpile('L', $1, ct); ct = $1; }
770b2a88b4Sshannon 	| cpile '{' list '}'	{ lpile('C', $1, ct); ct = $1; }
780b2a88b4Sshannon 	| rpile '{' list '}'	{ lpile('R', $1, ct); ct = $1; }
790b2a88b4Sshannon 	| pile '{' list '}'	{ lpile('-', $1, ct); ct = $1; }
800b2a88b4Sshannon 	| box sub box sbox	%prec SUB	{ shift2($1, $3, $4); }
810b2a88b4Sshannon 	| box sub box		%prec SUB	{ bshiftb($1, $2, $3); }
820b2a88b4Sshannon 	| box sup box		%prec SUP	{ bshiftb($1, $2, $3); }
830b2a88b4Sshannon 	| int sub box sbox	%prec SUB	{ integral($1, $3, $4); }
840b2a88b4Sshannon 	| int sub box		%prec SUB	{ integral($1, $3, 0); }
850b2a88b4Sshannon 	| int sup box		%prec SUP	{ integral($1, 0, $3); }
860b2a88b4Sshannon 	| int					{ integral($1, 0, 0); }
870b2a88b4Sshannon 	| left eqn right	{ paren($1, $2, $3); }
880b2a88b4Sshannon 	| pbox
890b2a88b4Sshannon 	| box from box tbox	%prec FROM	{ fromto($1, $3, $4); fromflg=0; }
900b2a88b4Sshannon 	| box to box	%prec TO	{ fromto($1, 0, $3); }
910b2a88b4Sshannon 	| box diacrit	{ diacrit($1, $2); }
920b2a88b4Sshannon 	| fwd box	%prec UP	{ move(FWD, $1, $2); }
930b2a88b4Sshannon 	| up box	%prec UP	{ move(UP, $1, $2); }
940b2a88b4Sshannon 	| back box	%prec UP	{ move(BACK, $1, $2); }
950b2a88b4Sshannon 	| down box	%prec UP	{ move(DOWN, $1, $2); }
960b2a88b4Sshannon 	| matrix '{' collist '}'	{ matrix($1); }
970b2a88b4Sshannon 	;
980b2a88b4Sshannon 
990b2a88b4Sshannon int	: INT	{ setintegral(); }
1000b2a88b4Sshannon 	;
1010b2a88b4Sshannon 
1020b2a88b4Sshannon fwd	: FWD text	{ $$ = atoi((char *) $1); } ;
1030b2a88b4Sshannon up	: UP text	{ $$ = atoi((char *) $1); } ;
1040b2a88b4Sshannon back	: BACK text	{ $$ = atoi((char *) $1); } ;
1050b2a88b4Sshannon down	: DOWN text	{ $$ = atoi((char *) $1); } ;
1060b2a88b4Sshannon 
1070b2a88b4Sshannon diacrit	: HAT	{ $$ = HAT; }
1080b2a88b4Sshannon 	| VEC	{ $$ = VEC; }
1090b2a88b4Sshannon 	| DYAD	{ $$ = DYAD; }
1100b2a88b4Sshannon 	| BAR	{ $$ = BAR; }
1110b2a88b4Sshannon 	| UNDER	{ $$ = UNDER; }	/* under bar */
1120b2a88b4Sshannon 	| DOT	{ $$ = DOT; }
1130b2a88b4Sshannon 	| TILDE	{ $$ = TILDE; }
1140b2a88b4Sshannon 	| DOTDOT	{ $$ = DOTDOT; } /* umlaut = double dot */
1150b2a88b4Sshannon 	;
1160b2a88b4Sshannon 
1170b2a88b4Sshannon from	: FROM	{ $$=ps; ps -= 3; fromflg = 1;
1180b2a88b4Sshannon 		if(dbg)printf(".\tfrom: old ps %d, new ps %d, fflg %d\n", $$, ps, fromflg);
1190b2a88b4Sshannon 		}
1200b2a88b4Sshannon 	;
1210b2a88b4Sshannon 
1220b2a88b4Sshannon to	: TO	{ $$=ps; if(fromflg==0)ps -= 3;
1230b2a88b4Sshannon 			if(dbg)printf(".\tto: old ps %d, new ps %d\n", $$, ps);
1240b2a88b4Sshannon 		}
1250b2a88b4Sshannon 	;
1260b2a88b4Sshannon 
1270b2a88b4Sshannon left	: LEFT text	{ $$ = ((char *)$2)[0]; }
1280b2a88b4Sshannon 	| LEFT '{'	{ $$ = '{'; }
1290b2a88b4Sshannon 	;
1300b2a88b4Sshannon 
1310b2a88b4Sshannon right	: RIGHT text	{ $$ = ((char *)$2)[0]; }
1320b2a88b4Sshannon 	| RIGHT '}'	{ $$ = '}'; }
1330b2a88b4Sshannon 	|		{ $$ = 0; }
1340b2a88b4Sshannon 	;
1350b2a88b4Sshannon 
1360b2a88b4Sshannon list	: eqn	{ lp[ct++] = $1; }
1370b2a88b4Sshannon 	| list ABOVE eqn	{ lp[ct++] = $3; }
1380b2a88b4Sshannon 	;
1390b2a88b4Sshannon 
1400b2a88b4Sshannon lpile	: LPILE	{ $$ = ct; } ;
1410b2a88b4Sshannon cpile	: CPILE	{ $$ = ct; } ;
1420b2a88b4Sshannon pile	: PILE	{ $$ = ct; } ;
1430b2a88b4Sshannon rpile	: RPILE	{ $$ = ct; } ;
1440b2a88b4Sshannon 
1450b2a88b4Sshannon size	: SIZE text	{ $$ = ps; setsize((char *) $2); }
1460b2a88b4Sshannon 	;
1470b2a88b4Sshannon 
1480b2a88b4Sshannon font	: ROMAN		{ setfont(ROM); }
1490b2a88b4Sshannon 	| ITALIC	{ setfont(ITAL); }
1500b2a88b4Sshannon 	| BOLD		{ setfont(BLD); }
1510b2a88b4Sshannon 	| FONT text	{ setfont(((char *)$2)[0]); }
1520b2a88b4Sshannon 	;
1530b2a88b4Sshannon 
1540b2a88b4Sshannon sub	: SUB	{ shift(SUB); }
1550b2a88b4Sshannon 	;
1560b2a88b4Sshannon 
1570b2a88b4Sshannon sup	: SUP	{ shift(SUP); }
1580b2a88b4Sshannon 	;
1590b2a88b4Sshannon 
1600b2a88b4Sshannon pbox	: '{' eqn '}'	{ $$ = $2; }
1610b2a88b4Sshannon 	| QTEXT		{ text(QTEXT, (char *) $1); }
1620b2a88b4Sshannon 	| CONTIG	{ text(CONTIG, (char *) $1); }
1630b2a88b4Sshannon 	| SPACE		{ text(SPACE, 0); }
1640b2a88b4Sshannon 	| THIN		{ text(THIN, 0); }
1650b2a88b4Sshannon 	| TAB		{ text(TAB, 0); }
1660b2a88b4Sshannon 	| SUM		{ funny(SUM); }
1670b2a88b4Sshannon 	| PROD		{ funny(PROD); }
1680b2a88b4Sshannon 	| UNION		{ funny(UNION); }
1690b2a88b4Sshannon 	| INTER		{ funny(INTER); }	/* intersection */
1700b2a88b4Sshannon 	;
1710b2a88b4Sshannon 
1720b2a88b4Sshannon text	: CONTIG
1730b2a88b4Sshannon 	| QTEXT
1740b2a88b4Sshannon 	;
1750b2a88b4Sshannon 
1760b2a88b4Sshannon %%
177