follow-up to r75761: coding style tweaks
[lhc/web/wiklou.git] / math / parser.mly
1 %{
2 open Tex
3 open Render_info
4
5 let sq_close_ri = HTMLABLEC(FONT_UFH,"]", "]")
6 %}
7 %token <Render_info.t> LITERAL DELIMITER
8 %token <string> FUN_AR2 FUN_INFIX FUN_AR1 DECL FUN_AR1opt BIG FUN_AR2nb
9 %token <string*string> BOX
10 %token <string*(string*string)> FUN_AR1hl
11 %token <string*Render_info.font_force> FUN_AR1hf DECLh
12 %token <string*(Tex.t->Tex.t->string*string*string)> FUN_AR2h
13 %token <string*(Tex.t list->Tex.t list->string*string*string)> FUN_INFIXh
14 %token EOF CURLY_OPEN CURLY_CLOSE SUB SUP SQ_CLOSE NEXT_CELL NEXT_ROW
15 %token BEGIN__MATRIX BEGIN_PMATRIX BEGIN_BMATRIX BEGIN_BBMATRIX BEGIN_VMATRIX BEGIN_VVMATRIX BEGIN_CASES BEGIN_ARRAY BEGIN_ALIGN BEGIN_ALIGNAT BEGIN_SMALLMATRIX
16 %token END__MATRIX END_PMATRIX END_BMATRIX END_BBMATRIX END_VMATRIX END_VVMATRIX END_CASES END_ARRAY END_ALIGN END_ALIGNAT END_SMALLMATRIX
17 %token LEFT RIGHT
18 %type <Tex.t list> tex_expr
19 %start tex_expr
20
21 %%
22 tex_expr:
23 expr EOF { $1 }
24 | ne_expr FUN_INFIX ne_expr EOF
25 { [TEX_INFIX($2,$1,$3)] }
26 | ne_expr FUN_INFIXh ne_expr EOF
27 { let t,h=$2 in [TEX_INFIXh(t,h,$1,$3)] }
28 expr:
29 /* */ { [] }
30 | ne_expr { $1 }
31 ne_expr:
32 lit_aq expr { $1 :: $2 }
33 | litsq_aq expr { $1 :: $2 }
34 | DECLh expr { let t,h = $1 in [TEX_DECLh(t,h,$2)] }
35 litsq_aq:
36 litsq_zq { $1 }
37 | litsq_dq { let base,downi = $1 in TEX_DQ(base,downi) }
38 | litsq_uq { let base,upi = $1 in TEX_UQ(base,upi)}
39 | litsq_fq { $1 }
40 litsq_fq:
41 litsq_dq SUP lit { let base,downi = $1 in TEX_FQ(base,downi,$3) }
42 | litsq_uq SUB lit { let base,upi = $1 in TEX_FQ(base,$3,upi) }
43 litsq_uq:
44 litsq_zq SUP lit { $1,$3 }
45 litsq_dq:
46 litsq_zq SUB lit { $1,$3 }
47 litsq_zq:
48 | SQ_CLOSE { TEX_LITERAL sq_close_ri }
49 expr_nosqc:
50 /* */ { [] }
51 | lit_aq expr_nosqc { $1 :: $2 }
52 lit_aq:
53 lit { $1 }
54 | lit_dq { let base,downi = $1 in TEX_DQ(base,downi) }
55 | lit_uq { let base,upi = $1 in TEX_UQ(base,upi)}
56 | lit_dqn { TEX_DQN($1) }
57 | lit_uqn { TEX_UQN($1) }
58 | lit_fq { $1 }
59
60 lit_fq:
61 lit_dq SUP lit { let base,downi = $1 in TEX_FQ(base,downi,$3) }
62 | lit_uq SUB lit { let base,upi = $1 in TEX_FQ(base,$3,upi) }
63 | lit_dqn SUP lit { TEX_FQN($1, $3) }
64
65 lit_uq:
66 lit SUP lit { $1,$3 }
67 lit_dq:
68 lit SUB lit { $1,$3 }
69 lit_uqn:
70 SUP lit { $2 }
71 lit_dqn:
72 SUB lit { $2 }
73
74
75 left:
76 LEFT DELIMITER { $2 }
77 | LEFT SQ_CLOSE { sq_close_ri }
78 right:
79 RIGHT DELIMITER { $2 }
80 | RIGHT SQ_CLOSE { sq_close_ri }
81 lit:
82 LITERAL { TEX_LITERAL $1 }
83 | DELIMITER { TEX_LITERAL $1 }
84 | BIG DELIMITER { TEX_BIG ($1,$2) }
85 | BIG SQ_CLOSE { TEX_BIG ($1,sq_close_ri) }
86 | left expr right { TEX_LR ($1,$3,$2) }
87 | FUN_AR1 lit { TEX_FUN1($1,$2) }
88 | FUN_AR1hl lit { let t,h=$1 in TEX_FUN1hl(t,h,$2) }
89 | FUN_AR1hf lit { let t,h=$1 in TEX_FUN1hf(t,h,$2) }
90 | FUN_AR1opt expr_nosqc SQ_CLOSE lit { TEX_FUN2sq($1,TEX_CURLY $2,$4) }
91 | FUN_AR2 lit lit { TEX_FUN2($1,$2,$3) }
92 | FUN_AR2nb lit lit { TEX_FUN2nb($1,$2,$3) }
93 | FUN_AR2h lit lit { let t,h=$1 in TEX_FUN2h(t,h,$2,$3) }
94 | BOX { let bt,s = $1 in TEX_BOX (bt,s) }
95 | CURLY_OPEN expr CURLY_CLOSE
96 { TEX_CURLY $2 }
97 | CURLY_OPEN ne_expr FUN_INFIX ne_expr CURLY_CLOSE
98 { TEX_INFIX($3,$2,$4) }
99 | CURLY_OPEN ne_expr FUN_INFIXh ne_expr CURLY_CLOSE
100 { let t,h=$3 in TEX_INFIXh(t,h,$2,$4) }
101 | BEGIN__MATRIX matrix END__MATRIX { TEX_MATRIX ("matrix", $2) }
102 | BEGIN_PMATRIX matrix END_PMATRIX { TEX_MATRIX ("pmatrix", $2) }
103 | BEGIN_BMATRIX matrix END_BMATRIX { TEX_MATRIX ("bmatrix", $2) }
104 | BEGIN_BBMATRIX matrix END_BBMATRIX { TEX_MATRIX ("Bmatrix", $2) }
105 | BEGIN_VMATRIX matrix END_VMATRIX { TEX_MATRIX ("vmatrix", $2) }
106 | BEGIN_VVMATRIX matrix END_VVMATRIX { TEX_MATRIX ("Vmatrix", $2) }
107 | BEGIN_ARRAY matrix END_ARRAY { TEX_MATRIX ("array", $2) }
108 | BEGIN_ALIGN matrix END_ALIGN { TEX_MATRIX ("aligned", $2) }
109 | BEGIN_ALIGNAT matrix END_ALIGNAT { TEX_MATRIX ("alignedat", $2) }
110 | BEGIN_SMALLMATRIX matrix END_SMALLMATRIX { TEX_MATRIX ("smallmatrix", $2) }
111 | BEGIN_CASES matrix END_CASES { TEX_MATRIX ("cases", $2) }
112 matrix:
113 line { [$1] }
114 | line NEXT_ROW matrix { $1::$3 }
115 line:
116 expr { [$1] }
117 | expr NEXT_CELL line { $1::$3 }
118 ;;