aboutsummaryrefslogtreecommitdiff
path: root/ide/config_lexer.mll
blob: 0d0e6307ee8b91a1ca2b8ee215ef93bdc43b1ad8 (plain)
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
{

  open Lexing
}

let space = 
  [' ' '\010' '\013' '\009' '\012']
let char = ['A'-'Z' 'a'-'z' '_' '0'-'9']

let ident = char+

let value = ('"'|'[')( [^ '='] | ('\\''"') )*('"'|']')
let list_value = [^';']+ ';'

rule next_config = parse
  | ident 
      { let id = lexeme lexbuf in 
        let v = value lexbuf in
        (id,v)
      }
  | _    { next_config lexbuf}
  | eof  { raise End_of_file }

and value = parse
  | value { let s = lexeme lexbuf in
	    String.sub s 1 (String.length s - 2)}
  | _    { value lexbuf }
  | eof  { raise End_of_file }

and split_list = parse
  | list_value {
      let h = lexeme lexbuf in
      h::(split_list lexbuf)
    }
  | _ { split_list lexbuf}
  | eof {[]}

{
  let get_config f = 
    let ci = open_in f in
    let lb = from_channel ci in 
    let result = ref [] in
    begin try 
      while true do 
	let r = next_config lb in
	result := r::!result
      done
    with End_of_file -> close_in ci; 
    end;
    !result

  let split s = 
    let cs = ref "" in
    let l = ref [] in
    String.iter 
      (fun c -> if c = ';' then begin l:= !cs::!l; cs:="" end 
       else cs := !cs^(Char.escaped c))
      s;
    if !cs ="" then !l else !cs::!l
}