Don't look for pipes in the root node.
[lhc/web/wiklou.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 }