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