1: \{# 2: # 3: int fromflg 0; 4: \} 5: %term CONTIG QTEXT SPACE THIN TAB 6: %term UP DOWN BACK FWD 7: %term MATRIX LCOL CCOL RCOL COL 8: %term MARK LINEUP 9: %term SUM INT PROD UNION INTER 10: %term LPILE PILE CPILE RPILE ABOVE 11: %term DEFINE DELIM GSIZE GFONT 12: %right FROM TO 13: %left OVER SQRT 14: %right SUPER SUB 15: %right SIZE FONT ROMAN ITALIC BOLD 16: %left MQ MQ1 17: %left LEFT RIGHT 18: %right DOT DOTDOT HAT TILDE BAR UNDER 19: 20: %% 21: 22: stuff : eqn ={ putout($1); } 23: | error ={ error(!FATAL, "syntax error in equation %d", first); } 24: | ={ eqnreg = 0; } 25: ; 26: 27: eqn : box ={ if(dbg)printf(".\teqn: S%d\n",$1); } 28: | eqn box ={ eqnbox($1,$2); } 29: | eqn MARK ={ mark($1); } 30: | MARK ={ mark(0); } 31: | eqn LINEUP ={ lineup($1); } 32: | LINEUP ={ lineup(0); } 33: ; 34: 35: matrix : MATRIX ={ $$ = ct; } ; 36: 37: collist : column 38: | collist column 39: ; 40: 41: column : lcol MQ list MQ1 ={ column('L',$1,$3); } 42: | ccol MQ list MQ1 ={ column('C',$1,$3); } 43: | rcol MQ list MQ1 ={ column('R',$1,$3); } 44: | col MQ list MQ1 ={ column('-',$1,$3); } 45: ; 46: 47: lcol : LCOL ={ $$ = ct++; } ; 48: ccol : CCOL ={ $$ = ct++; } ; 49: rcol : RCOL ={ $$ = ct++; } ; 50: col : COL ={ $$ = ct++; } ; 51: 52: sbox : super box %prec SUPER 53: ={ $$ = $2; } 54: | %prec SUB 55: ={ $$ = 0; } 56: ; 57: 58: box : box OVER box ={ boverb($1,$3); } 59: | size box %prec SIZE 60: ={ size($1,$2); } 61: | font box %prec FONT 62: ={ font($1,$2); } 63: | SQRT box ={ sqrt($2); } 64: | lpile MQ list MQ1 %prec LPILE 65: ={ lpile('L', $1, ct); ct=$1; } 66: | cpile MQ list MQ1 %prec CPILE 67: ={ lpile('C', $1, ct); ct=$1; } 68: | rpile MQ list MQ1 %prec RPILE 69: ={ lpile('R', $1, ct); ct=$1; } 70: | pile MQ list MQ1 %prec PILE 71: ={ lpile('-', $1, ct); ct=$1; } 72: | box sub box sbox %prec SUB 73: ={ if(dbg)printf(".\t sub box %d %d %d\n",$1,$3,$4); 74: if($4 == 0)bshiftb($1,$2,$3); 75: else shift2($1,$3,$4); 76: } 77: | box super box %prec SUPER 78: ={ bshiftb($1,$2,$3); } 79: | left eqn right %prec LEFT 80: ={ paren($1,$2,$3); } 81: | pbox 82: | box from box to box %prec TO 83: ={ fromto($1,$3,$5); fromflg=0; } 84: | box from box %prec FROM 85: ={ fromto($1,$3,0); fromflg=0; } 86: | box to box %prec TO 87: ={ fromto($1,0,$3); } 88: | box diacrit ={ diacrit($1,$2); } 89: | fwd box ={ move(0,$1,$2); } 90: | up box ={ move(1,$1,$2); } 91: | back box ={ move(2,$1,$2); } 92: | down box ={ move(3,$1,$2); } 93: | matrix MQ collist MQ1 ={ matrix($1,$3); } 94: ; 95: 96: fwd : FWD text ={ $$ = numb($1); } ; 97: up : UP text ={ $$ = numb($1); } ; 98: back : BACK text ={ $$ = numb($1); } ; 99: down : DOWN text ={ $$ = numb($1); } ; 100: 101: diacrit : HAT ={ $$ = 'H'; } 102: | BAR ={ $$ = 'B'; } 103: | UNDER ={ $$ = 'N'; } /* under bar */ 104: | DOT ={ $$ = 'D'; } 105: | TILDE ={ $$ = 'T'; } 106: | DOTDOT ={ $$ = 'U'; } /* umlaut = double dot */ 107: ; 108: 109: from : FROM 110: ; 111: to : TO 112: ; 113: 114: left : LEFT text ={ $$ = $2->c1; } 115: | LEFT MQ ={ $$ = '{'; } 116: ; 117: 118: right : RIGHT text ={ $$ = $2->c1; } 119: | RIGHT MQ1 ={ $$ = '}'; } 120: | ={ $$ = 0; } 121: ; 122: 123: list : eqn ={ lp[ct++] = $1; } 124: | list ABOVE eqn ={ lp[ct++] = $3; } 125: ; 126: 127: lpile : LPILE ={ $$=ct; } ; 128: cpile : CPILE ={ $$=ct; } ; 129: pile : PILE ={ $$=ct; } ; 130: rpile : RPILE ={ $$=ct; } ; 131: 132: size : SIZE text 133: ; 134: 135: font : ROMAN 136: | ITALIC 137: | BOLD 138: | FONT text 139: ; 140: 141: sub : SUB ={ shift(1); } ; 142: 143: super : SUPER ={ shift(-1); } ; 144: 145: pbox : MQ eqn MQ1 ={ $$ = $2; } 146: | QTEXT ={ text('q',$1); } 147: | CONTIG ={ text('c',$1); } 148: | SPACE ={ text('~', $1); } 149: | THIN ={ text('^', $1); } 150: | TAB ={ text('\t', $1); } 151: | SUM ={ text('c', "SIGMA"); } 152: | PROD ={ text('c', "PI"); } 153: | INT ={ text('c', "^"); } 154: | UNION ={ text('c' ,"U"); } 155: | INTER ={ text('c', "A"); } 156: ; 157: 158: text : CONTIG 159: | QTEXT 160: | SPACE ={ $$ = & "\\|\\|"; } 161: | THIN ={ $$ = & "\\|"; } 162: ; 163: 164: %%