Blob Blame History Raw
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" } }