BSD make fails; note gmake in readme
[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
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
16 %token END__MATRIX END_PMATRIX END_BMATRIX END_BBMATRIX END_VMATRIX END_VVMATRIX END_CASES
17 %token LEFT RIGHT
18
19 %type <Tex.t list> tex_expr
20 %start tex_expr
21
22 %%
23 tex_expr:
24 expr EOF { $1 }
25 | ne_expr FUN_INFIX ne_expr EOF
26 { [TEX_INFIX($2,$1,$3)] }
27 | ne_expr FUN_INFIXh ne_expr EOF
28 { let t,h=$2 in [TEX_INFIXh(t,h,$1,$3)] }
29 expr:
30 /* */ { [] }
31 | ne_expr { $1 }
32 ne_expr:
33 lit_aq expr { $1 :: $2 }
34 | litsq_aq expr { $1 :: $2 }
35 | DECLh expr { let t,h = $1 in [TEX_DECLh(t,h,$2)] }
36 litsq_aq:
37 litsq_zq { $1 }
38 | litsq_dq { let base,downi = $1 in TEX_DQ(base,downi) }
39 | litsq_uq { let base,upi = $1 in TEX_UQ(base,upi)}
40 | litsq_fq { $1 }
41 litsq_fq:
42 litsq_dq SUP lit { let base,downi = $1 in TEX_FQ(base,downi,$3) }
43 | litsq_uq SUB lit { let base,upi = $1 in TEX_FQ(base,$3,upi) }
44 litsq_uq:
45 litsq_zq SUP lit { $1,$3 }
46 litsq_dq:
47 litsq_zq SUB lit { $1,$3 }
48 litsq_zq:
49 | SQ_CLOSE { TEX_LITERAL sq_close_ri }
50 expr_nosqc:
51 /* */ { [] }
52 | lit_aq expr_nosqc { $1 :: $2 }
53 lit_aq:
54 lit { $1 }
55 | lit_dq { let base,downi = $1 in TEX_DQ(base,downi) }
56 | lit_uq { let base,upi = $1 in TEX_UQ(base,upi)}
57 | lit_fq { $1 }
58 lit_fq:
59 lit_dq SUP lit { let base,downi = $1 in TEX_FQ(base,downi,$3) }
60 | lit_uq SUB lit { let base,upi = $1 in TEX_FQ(base,$3,upi) }
61 lit_uq:
62 lit SUP lit { $1,$3 }
63 lit_dq:
64 lit SUB lit { $1,$3 }
65 left:
66 LEFT DELIMITER { $2 }
67 | LEFT SQ_CLOSE { sq_close_ri }
68 right:
69 RIGHT DELIMITER { $2 }
70 | RIGHT SQ_CLOSE { sq_close_ri }
71 lit:
72 LITERAL { TEX_LITERAL $1 }
73 | DELIMITER { TEX_LITERAL $1 }
74 | BIG DELIMITER { TEX_BIG ($1,$2) }
75 | BIG SQ_CLOSE { TEX_BIG ($1,sq_close_ri) }
76 | left expr right { TEX_LR ($1,$3,$2) }
77 | FUN_AR1 lit { TEX_FUN1($1,$2) }
78 | FUN_AR1hl lit { let t,h=$1 in TEX_FUN1hl(t,h,$2) }
79 | FUN_AR1hf lit { let t,h=$1 in TEX_FUN1hf(t,h,$2) }
80 | FUN_AR1opt expr_nosqc SQ_CLOSE lit { TEX_FUN2sq($1,TEX_CURLY $2,$4) }
81 | FUN_AR2 lit lit { TEX_FUN2($1,$2,$3) }
82 | FUN_AR2h lit lit { let t,h=$1 in TEX_FUN2h(t,h,$2,$3) }
83 | BOX { let bt,s = $1 in TEX_BOX (bt,s) }
84 | CURLY_OPEN expr CURLY_CLOSE
85 { TEX_CURLY $2 }
86 | CURLY_OPEN ne_expr FUN_INFIX ne_expr CURLY_CLOSE
87 { TEX_INFIX($3,$2,$4) }
88 | CURLY_OPEN ne_expr FUN_INFIXh ne_expr CURLY_CLOSE
89 { let t,h=$3 in TEX_INFIXh(t,h,$2,$4) }
90 | BEGIN__MATRIX matrix END__MATRIX { TEX_MATRIX ("matrix", $2) }
91 | BEGIN_PMATRIX matrix END_PMATRIX { TEX_MATRIX ("pmatrix", $2) }
92 | BEGIN_BMATRIX matrix END_BMATRIX { TEX_MATRIX ("bmatrix", $2) }
93 | BEGIN_BBMATRIX matrix END_BBMATRIX { TEX_MATRIX ("Bmatrix", $2) }
94 | BEGIN_VMATRIX matrix END_VMATRIX { TEX_MATRIX ("vmatrix", $2) }
95 | BEGIN_VVMATRIX matrix END_VVMATRIX { TEX_MATRIX ("Vmatrix", $2) }
96 | BEGIN_CASES matrix END_CASES { TEX_MATRIX ("cases", $2) }
97 matrix:
98 line { [$1] }
99 | line NEXT_ROW matrix { $1::$3 }
100 line:
101 expr { [$1] }
102 | expr NEXT_CELL line { $1::$3 }
103 ;;