API * Implemented backlinks / imagelinks / embeddedin modules
[mediawiki.git] / math / parser.mly
blob59a00b98d6aa99e87e0d549df7ca9cc586a4f2ef
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 BEGIN_ARRAY 
16 %token END__MATRIX END_PMATRIX END_BMATRIX END_BBMATRIX END_VMATRIX END_VVMATRIX END_CASES END_ARRAY 
17 %token LEFT RIGHT
19 %type <Tex.t list> tex_expr
20 %start tex_expr
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_ARRAY    matrix END_ARRAY         { TEX_MATRIX ("array", $2) }
97   | BEGIN_CASES    matrix END_CASES     { TEX_MATRIX ("cases", $2) }
98 matrix:
99     line                        { [$1] }
100   | line NEXT_ROW matrix        { $1::$3 }
101 line:
102     expr                        { [$1] }
103   | expr NEXT_CELL line         { $1::$3 }