Source file lexer_utils.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
open Types
let parse_module s = String.sub s 0 (String.length s - 1)
let parse_list_index s =
String.sub s 1 (String.length s - 2)
|> int_of_string
|> (fun i -> List_index i)
|> Option.some
let parse_align = function
| "<" -> Left
| ">" -> Right
| "^" -> Center
| "=" -> Pad
| u -> raise (ValueError ("Unknown alignment '" ^ u ^ "'"))
let parse_fill s =
match String.length s with
| 1 -> (Some (parse_align s), None)
| 2 -> (Some (parse_align (String.sub s 1 1)), Some s.[0])
| _ -> raise (ValueError "Unexpected alignment string")
let parse_sign = function
| "+" -> Some Plus
| "-" -> Some Minus
| " " -> Some Space
| u -> raise (ValueError ("Unknown sign '" ^ u ^ "'"))
let parse_width s =
let zero = if String.get s 0 = '0' then Some () else None in
let width = Some (int_of_string s) in
(zero, width)
let parse_grouping_option = function
| "," -> Some Comma
| "_" -> Some Underscore
| u -> raise (ValueError ("Unknown grouping option '" ^ u ^ "'"))
let pasrse_precision s =
String.sub s 1 (String.length s - 1) |> int_of_string |> Option.some
let parse_type s =
let type_ =
match s with
| "s" -> String
| "b" -> Int Binary
| "c" -> Int Char
| "d" -> Int Decimal
| "o" -> Int Octal
| "x" | "X" -> Int Hex
| "e" | "E" -> Float Scientific
| "f" | "F" -> Float Fixed
| "g" | "G" -> Float General
| "%" -> Float Percentage
| u -> raise (ValueError ("Unknown format code '" ^ u ^ "'"))
in
let upper =
if String.uppercase_ascii s = s && type_ <> Float Percentage then
Some ()
else
None
in
(Some type_, upper)