let parse_conf_file fname =
  let pp_lpos { Lexing.pos_fname = _fname;
                pos_lnum = lnum; pos_bol = bol; pos_cnum = cnum } =
    Printf.sprintf "%d:%d" lnum (cnum - bol)
  in
  let ic = open_in fname in
  let lexbuf = Lexing.from_channel ic in
  try
    let stanzas = Cudf_822_parser.doc_822 Cudf_822_lexer.token_822 lexbuf in
    let r = 
      List.flatten (
        List.map (fun stanza -> 
          let (_,sl) = List.assoc "solver" stanza in
          let l = List.map (fun (k, (_loc, v)) -> (k,v)) stanza in
          List.filter_map (fun s -> 
            match ExtString.String.strip s with
            |"" -> None
            |-> Some(x,l)
          ) (ExtString.String.nsplit sl ",")
        ) stanzas 
      )
    in
    close_in ic; r
  with Cudf_types.Parse_error_822 (msg, (startpos, endpos)) ->
    fatal "Parse error on file %s:%s--%s" fname (pp_lpos startpos) (pp_lpos endpos)