module Pass_nested_sections = let word = /[a-zA-Z0-9]+/ let ws = /[ \t]*/ let nl = /\n/ let eol = del (ws . nl) "\n" let eq = del (ws . "=" . ws) "=" let lbr = del (ws . "{" . ws . nl) " {\n" let rbr = del (ws . "}" . ws . nl) "}\n" let indent = del ws "" let entry = [ indent . key word . eq . store word . eol ] let rec lns = let sec = [ indent . key word . lbr . lns . rbr ] in (sec | entry)+ test lns get "key = value\n" = { "key" = "value" } test lns get "section { key1 = v1 key2 = v2 section { section { key4 = v4 } } section { key5 = v5 } }\n" = { "section" { "key1" = "v1" } { "key2" = "v2" } { "section" { "section" { "key4" = "v4" } } } { "section" { "key5" = "v5" } } } test lns get "section { section { key2 = v2 } } section { key3 = v3 } " = { "section" { "section" { "key2" = "v2" } } } { "section" { "key3" = "v3" } }