]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - math/lexer.mll
MediaWiki 1.17.0
[autoinstalls/mediawiki.git] / math / lexer.mll
1 {
2     open Parser
3     open Render_info
4     open Tex
5 }
6 let space = [' ' '\t' '\n' '\r']
7 let alpha = ['a'-'z' 'A'-'Z']
8 let literal_id = ['a'-'z' 'A'-'Z']
9 let literal_mn = ['0'-'9']
10 let literal_uf_lt = [',' ':' ';' '?' '!' '\'']
11 let delimiter_uf_lt = ['(' ')' '.']
12 let literal_uf_op = ['+' '-' '*' '=']
13 let delimiter_uf_op = ['/' '|']
14 let boxchars  = ['0'-'9' 'a'-'z' 'A'-'Z' '+' '-' '*' ',' '=' '(' ')' ':' '/' ';' '?' '.' '!' ' ' '\128'-'\255']
15 let aboxchars = ['0'-'9' 'a'-'z' 'A'-'Z' '+' '-' '*' ',' '=' '(' ')' ':' '/' ';' '?' '.' '!' ' ']
16
17 rule token = parse
18     space +                     { token lexbuf }
19   | "\\text" space * '{' boxchars + '}'
20                                 { Texutil.tex_use_ams (); let str = Lexing.lexeme lexbuf in
21                                   let n = String.index str '{' + 1 in
22                                   BOX ("\\text", String.sub str n (String.length str - n - 1)) }
23   | "\\mbox" space * '{' aboxchars + '}'
24                                 { let str = Lexing.lexeme lexbuf in
25                                   let n = String.index str '{' + 1 in
26                                   BOX ("\\mbox", String.sub str n (String.length str - n - 1)) }
27   | "\\hbox" space * '{' aboxchars + '}'
28                                 { let str = Lexing.lexeme lexbuf in
29                                   let n = String.index str '{' + 1 in
30                                   BOX ("\\hbox", String.sub str n (String.length str - n - 1)) }
31   | "\\vbox" space * '{' aboxchars + '}'
32                                 { let str = Lexing.lexeme lexbuf in
33                                   let n = String.index str '{' + 1 in
34                                   BOX ("\\vbox", String.sub str n (String.length str - n - 1)) }
35   | "\\mbox" space * '{' boxchars + '}'
36                                 { let str = Lexing.lexeme lexbuf in
37                                   let n = String.index str '{' + 1 in
38                                   Texutil.tex_use_nonascii();
39                                   BOX ("\\mbox", String.sub str n (String.length str - n - 1)) }
40   | "\\hbox" space * '{' boxchars + '}'
41                                 { let str = Lexing.lexeme lexbuf in
42                                   let n = String.index str '{' + 1 in
43                                   Texutil.tex_use_nonascii();
44                                   BOX ("\\hbox", String.sub str n (String.length str - n - 1)) }
45   | "\\vbox" space * '{' boxchars + '}'
46                                 { let str = Lexing.lexeme lexbuf in
47                                   let n = String.index str '{' + 1 in
48                                   Texutil.tex_use_nonascii();
49                                   BOX ("\\vbox", String.sub str n (String.length str - n - 1)) }
50   | literal_id                  { let str = Lexing.lexeme lexbuf in LITERAL (MHTMLABLEC (FONT_IT, str,str,MI,str)) }
51   | literal_mn                  { let str = Lexing.lexeme lexbuf in LITERAL (MHTMLABLEC (FONT_RM, str,str,MN,str)) }
52   | literal_uf_lt               { let str = Lexing.lexeme lexbuf in LITERAL (HTMLABLEC (FONT_UFH, str,str)) }
53   | delimiter_uf_lt             { let str = Lexing.lexeme lexbuf in DELIMITER (HTMLABLEC (FONT_UFH, str,str)) }
54   | "-"                         { let str = Lexing.lexeme lexbuf in LITERAL (MHTMLABLEC (FONT_UFH,"-"," − ",MO,str))}
55   | literal_uf_op               { let str = Lexing.lexeme lexbuf in LITERAL (MHTMLABLEC (FONT_UFH, str," "^str^" ",MO,str)) }
56   | delimiter_uf_op             { let str = Lexing.lexeme lexbuf in DELIMITER (MHTMLABLEC (FONT_UFH, str," "^str^" ",MO,str)) }
57   | "\\" alpha +                { Texutil.find (Lexing.lexeme lexbuf) }
58   | "\\sqrt" space * "["        { FUN_AR1opt "\\sqrt" }
59   | "\\xleftarrow" space * "["  { Texutil.tex_use_ams(); FUN_AR1opt "\\xleftarrow" }
60   | "\\xrightarrow" space * "[" { Texutil.tex_use_ams(); FUN_AR1opt "\\xrightarrow" }
61   | "\\,"                       { LITERAL (HTMLABLE (FONT_UF, "\\,"," ")) }
62   | "\\ "                       { LITERAL (HTMLABLE (FONT_UF, "\\ "," ")) }
63   | "\\;"                       { LITERAL (HTMLABLE (FONT_UF, "\\;"," ")) }
64   | "\\!"                       { LITERAL (TEX_ONLY "\\!") }
65   | "\\{"                       { DELIMITER (HTMLABLEC(FONT_UFH,"\\{","{")) }
66   | "\\}"                       { DELIMITER (HTMLABLEC(FONT_UFH,"\\}","}")) }
67   | "\\|"                       { DELIMITER (HTMLABLE (FONT_UFH,"\\|","||")) }
68   | "\\_"                       { LITERAL (HTMLABLEC(FONT_UFH,"\\_","_")) }
69   | "\\#"                       { LITERAL (HTMLABLE (FONT_UFH,"\\#","#")) }
70   | "\\%"                       { LITERAL (HTMLABLE (FONT_UFH,"\\%","%")) }
71   | "\\$"                       { LITERAL (HTMLABLE (FONT_UFH,"\\$","$")) }
72   | "\\&"                       { LITERAL (HTMLABLEC (FONT_RM,"\\&","&")) }
73   | "&"                         { NEXT_CELL }
74   | "\\\\"                      { NEXT_ROW }
75   | "\\begin{matrix}"           { Texutil.tex_use_ams(); BEGIN__MATRIX }
76   | "\\end{matrix}"             { END__MATRIX }
77   | "\\begin{pmatrix}"          { Texutil.tex_use_ams(); BEGIN_PMATRIX }
78   | "\\end{pmatrix}"            { END_PMATRIX }
79   | "\\begin{bmatrix}"          { Texutil.tex_use_ams(); BEGIN_BMATRIX }
80   | "\\end{bmatrix}"            { END_BMATRIX }
81   | "\\begin{Bmatrix}"          { Texutil.tex_use_ams(); BEGIN_BBMATRIX }
82   | "\\end{Bmatrix}"            { END_BBMATRIX }
83   | "\\begin{vmatrix}"          { Texutil.tex_use_ams(); BEGIN_VMATRIX }
84   | "\\end{vmatrix}"            { END_VMATRIX }
85   | "\\begin{Vmatrix}"          { Texutil.tex_use_ams(); BEGIN_VVMATRIX }
86   | "\\end{Vmatrix}"            { END_VVMATRIX }
87   | "\\begin{array}"            { Texutil.tex_use_ams(); BEGIN_ARRAY }
88   | "\\end{array}"              { END_ARRAY }
89   | "\\begin{align}"            { Texutil.tex_use_ams(); BEGIN_ALIGN }
90   | "\\end{align}"              { END_ALIGN }
91   | "\\begin{alignat}"          { Texutil.tex_use_ams(); BEGIN_ALIGNAT }
92   | "\\end{alignat}"            { END_ALIGNAT }
93   | "\\begin{smallmatrix}"      { Texutil.tex_use_ams(); BEGIN_SMALLMATRIX }
94   | "\\end{smallmatrix}"        { END_SMALLMATRIX }
95   | "\\begin{cases}"            { Texutil.tex_use_ams(); BEGIN_CASES }
96   | "\\end{cases}"              { END_CASES }
97   | '>'                         { LITERAL (HTMLABLEC(FONT_UFH,">"," > ")) }
98   | '<'                         { LITERAL (HTMLABLEC(FONT_UFH,"<"," &lt; ")) }
99   | '%'                         { LITERAL (HTMLABLEC(FONT_UFH,"\\%","%")) }
100   | '$'                         { LITERAL (HTMLABLEC(FONT_UFH,"\\$","$")) }
101   | '~'                         { LITERAL (HTMLABLE (FONT_UF, "~","&nbsp;")) }
102   | '['                         { DELIMITER (HTMLABLEC(FONT_UFH,"[","[")) }
103   | ']'                         { SQ_CLOSE }
104   | '{'                         { CURLY_OPEN }
105   | '}'                         { CURLY_CLOSE }
106   | '^'                         { SUP }
107   | '_'                         { SUB }
108   | eof                         { EOF }