aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.depend11
-rw-r--r--Makefile15
-rw-r--r--ide/.cvsignore2
-rw-r--r--ide/config_lexer.mll96
-rw-r--r--ide/config_parser.mly34
-rw-r--r--ide/ideutils.ml2
-rw-r--r--ide/preferences.ml176
7 files changed, 174 insertions, 162 deletions
diff --git a/.depend b/.depend
index fd85e4f6f..ed7da896f 100644
--- a/.depend
+++ b/.depend
@@ -1,3 +1,4 @@
+ide/config_parser.cmi: lib/util.cmi
ide/coq.cmi: kernel/environ.cmi pretyping/evd.cmi kernel/names.cmi \
kernel/term.cmi lib/util.cmi toplevel/vernacexpr.cmo
interp/constrextern.cmi: kernel/environ.cmi library/impargs.cmi \
@@ -475,6 +476,10 @@ doc/parse.cmo: parsing/ast.cmi
doc/parse.cmx: parsing/ast.cmx
ide/command_windows.cmo: ide/coq.cmi ide/coq_commands.cmo ide/ideutils.cmo
ide/command_windows.cmx: ide/coq.cmx ide/coq_commands.cmx ide/ideutils.cmx
+ide/config_lexer.cmo: ide/config_parser.cmi lib/util.cmi
+ide/config_lexer.cmx: ide/config_parser.cmx lib/util.cmx
+ide/config_parser.cmo: lib/util.cmi ide/config_parser.cmi
+ide/config_parser.cmx: lib/util.cmx ide/config_parser.cmi
ide/coq.cmo: toplevel/cerrors.cmi config/coq_config.cmi toplevel/coqtop.cmi \
kernel/environ.cmi pretyping/evarutil.cmi pretyping/evd.cmi \
tactics/hipattern.cmi ide/ideutils.cmo library/lib.cmi kernel/names.cmi \
@@ -505,8 +510,10 @@ ide/ideutils.cmo: config/coq_config.cmi lib/options.cmi lib/pp_control.cmi \
ide/preferences.cmo
ide/ideutils.cmx: config/coq_config.cmx lib/options.cmx lib/pp_control.cmx \
ide/preferences.cmx
-ide/preferences.cmo: ide/utils/configwin.cmi ide/utils/editable_cells.cmo
-ide/preferences.cmx: ide/utils/configwin.cmx ide/utils/editable_cells.cmx
+ide/preferences.cmo: ide/config_lexer.cmo ide/utils/configwin.cmi \
+ ide/utils/editable_cells.cmo lib/util.cmi
+ide/preferences.cmx: ide/config_lexer.cmx ide/utils/configwin.cmx \
+ ide/utils/editable_cells.cmx lib/util.cmx
ide/undo.cmo: ide/ideutils.cmo ide/undo.cmi
ide/undo.cmx: ide/ideutils.cmx ide/undo.cmi
interp/constrextern.cmo: pretyping/classops.cmi library/declare.cmi \
diff --git a/Makefile b/Makefile
index 9d5d13aa6..93654570d 100644
--- a/Makefile
+++ b/Makefile
@@ -386,8 +386,8 @@ COQIDECMO=ide/utils/okey.cmo ide/utils/uoptions.cmo \
ide/utils/configwin_keys.cmo ide/utils/configwin_types.cmo \
ide/utils/configwin_messages.cmo ide/utils/configwin_ihm.cmo \
ide/utils/configwin.cmo \
- ide/utils/editable_cells.cmo ide/config_lexer.cmo \
- ide/preferences.cmo \
+ ide/utils/editable_cells.cmo ide/config_parser.cmo \
+ ide/config_lexer.cmo ide/preferences.cmo \
ide/ideutils.cmo ide/undo.cmo \
ide/find_phrase.cmo \
ide/highlight.cmo ide/coq.cmo ide/coq_commands.cmo \
@@ -396,6 +396,7 @@ COQIDECMO=ide/utils/okey.cmo ide/utils/uoptions.cmo \
COQIDECMX=$(COQIDECMO:.cmo=.cmx)
COQIDEFLAGS=-thread -I +lablgtk2
beforedepend:: ide/config_lexer.ml ide/find_phrase.ml ide/highlight.ml
+beforedepend:: ide/config_parser.mli ide/config_parser.ml
FULLIDELIB=$(FULLCOQLIB)/ide
IDEFILES=ide/coq.png ide/.coqiderc
@@ -429,6 +430,8 @@ ide/utils/%.cmi: ide/%.mli
ide/utils/%.cmx: ide/%.ml
$(OCAMLOPT) $(COQIDEFLAGS) $(OPTFLAGS) -c $<
clean::
+ rm -f ide/extract_index.ml ide/find_phrase.ml ide/highlight.ml
+ rm -f ide/config_lexer.ml ide/config_parser.mli ide/config_parser.ml
rm -f $(COQIDEBYTE) $(COQIDEOPT)
# coqc
@@ -1101,7 +1104,7 @@ parsing/lexer.cmo: parsing/lexer.ml4
# Default rules
###########################################################################
-.SUFFIXES: .ml .mli .cmo .cmi .cmx .mll .ml4 .v .vo .el .elc
+.SUFFIXES: .ml .mli .cmo .cmi .cmx .mll .mly .ml4 .v .vo .el .elc
.ml.cmo:
$(OCAMLC) $(BYTEFLAGS) -c $<
@@ -1115,6 +1118,12 @@ parsing/lexer.cmo: parsing/lexer.ml4
.mll.ml:
ocamllex $<
+.mly.ml:
+ ocamlyacc $<
+
+.mly.mli:
+ ocamlyacc $<
+
.ml4.cmx:
$(OCAMLOPT) $(OPTFLAGS) -pp "$(CAMLP4O) $(CAMLP4EXTENDFLAGS) `$(CAMLP4DEPS) $<` -impl" -c -impl $<
diff --git a/ide/.cvsignore b/ide/.cvsignore
index 331b1947b..56eea49c9 100644
--- a/ide/.cvsignore
+++ b/ide/.cvsignore
@@ -8,3 +8,5 @@ Makefile
test
config_lexer.ml
*.crashcoqide
+config_parser.mli
+config_parser.ml
diff --git a/ide/config_lexer.mll b/ide/config_lexer.mll
index 0d0e6307e..480f04e24 100644
--- a/ide/config_lexer.mll
+++ b/ide/config_lexer.mll
@@ -1,60 +1,58 @@
{
open Lexing
+ open Format
+ open Config_parser
+ open Util
+
+ let string_buffer = Buffer.create 1024
+
}
-let space =
- [' ' '\010' '\013' '\009' '\012']
+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 {[]}
+rule token = parse
+ | space+ { token lexbuf }
+ | '#' [^ '\n']* { token lexbuf }
+ | ident { IDENT (lexeme lexbuf) }
+ | '=' { EQUAL }
+ | '"' { Buffer.reset string_buffer;
+ Buffer.add_char string_buffer '"';
+ string lexbuf;
+ let s = Buffer.contents string_buffer in
+ STRING (Scanf.sscanf s "%S" (fun s -> s)) }
+ | _ { let c = lexeme_start lexbuf in
+ eprintf ".coqiderc: invalid character (%d)\n@." c;
+ token lexbuf }
+ | eof { EOF }
+
+and string = parse
+ | '"' { Buffer.add_char string_buffer '"' }
+ | '\\' '"' | _
+ { Buffer.add_string string_buffer (lexeme lexbuf); string lexbuf }
+ | eof { eprintf ".coqiderc: unterminated string\n@." }
{
- 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
+
+ let load_file f =
+ let c = open_in f in
+ let lb = from_channel c in
+ let m = Config_parser.prefs token lb in
+ close_in c;
+ m
+
+ let print_file f m =
+ let c = open_out f in
+ let fmt = formatter_of_out_channel c in
+ let rec print_list fmt = function
+ | [] -> ()
+ | s :: sl -> fprintf fmt "%S@ %a" s print_list sl
+ in
+ Stringmap.iter
+ (fun k s -> fprintf fmt "@[<hov 2>%s = %a@]@\n" k print_list s) m;
+ fprintf fmt "@.";
+ close_out c
+
}
diff --git a/ide/config_parser.mly b/ide/config_parser.mly
new file mode 100644
index 000000000..fe9071964
--- /dev/null
+++ b/ide/config_parser.mly
@@ -0,0 +1,34 @@
+
+%{
+
+ open Parsing
+ open Util
+
+%}
+
+%token <string> IDENT STRING
+%token EQUAL EOF
+
+%type <(string list) Util.Stringmap.t> prefs
+%start prefs
+
+%%
+
+prefs:
+ pref_list EOF { $1 }
+;
+
+pref_list:
+ pref_list pref { let (k,d) = $2 in Stringmap.add k d $1 }
+ | /* epsilon */ { Stringmap.empty }
+;
+
+pref:
+ IDENT EQUAL string_list { ($1, List.rev $3) }
+;
+
+string_list:
+ string_list STRING { $2 :: $1 }
+ | /* epsilon */ { [] }
+;
+
diff --git a/ide/ideutils.ml b/ide/ideutils.ml
index d5d1490fe..f0f54650e 100644
--- a/ide/ideutils.ml
+++ b/ide/ideutils.ml
@@ -200,3 +200,5 @@ let find_tag_limits (tag :GText.tag) (it:GText.iter) =
let async =
if Sys.os_type <> "Unix" then GtkThread.async else (fun x -> x)
+
+
diff --git a/ide/preferences.ml b/ide/preferences.ml
index c78cf3214..4370ca985 100644
--- a/ide/preferences.ml
+++ b/ide/preferences.ml
@@ -1,5 +1,6 @@
open Configwin
open Printf
+open Util
let pref_file =
try (Filename.concat (Sys.getenv "HOME") ".coqidepref")
@@ -50,7 +51,7 @@ type pref =
mutable auto_save : bool;
mutable auto_save_delay : int;
- mutable auto_save_name : string*string;
+ mutable auto_save_name : string * string;
mutable automatic_tactics : (string * string) list;
mutable cmd_print : string;
@@ -68,61 +69,34 @@ type pref =
let save_pref p =
try
- let fd = open_out pref_file in
- output_value fd p;
-(*
- let output_string f c = fprintf fd "%s = \"%s\"\n" f c in
- let output_bool f c = fprintf fd "%s = \"%b\"\n" f c in
- let output_int f c = fprintf fd "%s = \"%d\"\n" f c in
- let output_list f to_string l =
- fprintf fd "%s = [%a]\n" f
- (fun c ->
- List.iter
- (fun x -> fprintf c "%a;" to_string x)) l in
- let output_modi fd m = fprintf fd "%s" (mod_to_str m) in
- let output_tactics fd (m1,m2) = fprintf fd "%s,%s" m1 m2 in
- output_string "cmd_coqc" p.cmd_coqc;
- output_string "cmd_make" p.cmd_make;
- output_string "cmd_coqmakefile" p.cmd_coqmakefile;
- output_string "cmd_coqdoc" p.cmd_coqdoc;
- output_string "cmd_print" p.cmd_print;
-
- output_bool "global_auto_revert" p.global_auto_revert;
- output_int "global_auto_revert_delay" p.global_auto_revert_delay;
-
- output_bool "auto_save" p.auto_save;
- output_int "auto_save_delay" p.auto_save_delay;
- output_string "auto_save_prefix" (fst p.auto_save_name);
- output_string "auto_save_suffix" (snd p.auto_save_name);
-
- output_string "cmd_browse_prefix" (fst p.cmd_browse);
- output_string "cmd_browse_suffix" (snd p.cmd_browse);
-
- output_string "doc_url" p.doc_url;
- output_string "library_url" p.library_url;
- output_list
- "modifier_for_navigation"
- output_modi
- p.modifier_for_navigation;
- output_list
- "modifier_for_templates"
- output_modi
- p.modifier_for_templates;
- output_list
- "modifier_for_tactics"
- output_modi
- p.modifier_for_navigation;
- output_list
- "modifiers_valid"
- output_modi
- p.modifiers_valid;
- output_list
- "automatic_tactics"
- output_tactics
- p.automatic_tactics;
-*)
- close_out fd
-
+ let add = Stringmap.add in
+ let (++) x f = f x in
+ Stringmap.empty ++
+ add "cmd_coqc" [p.cmd_coqc] ++
+ add "cmd_make" [p.cmd_make] ++
+ add "cmd_coqmakefile" [p.cmd_coqmakefile] ++
+ add "cmd_coqdoc" [p.cmd_coqdoc] ++
+ add "global_auto_revert" [string_of_bool p.global_auto_revert] ++
+ add "global_auto_revert_delay"
+ [string_of_int p.global_auto_revert_delay] ++
+ add "auto_save" [string_of_bool p.auto_save] ++
+ add "auto_save_delay" [string_of_int p.auto_save_delay] ++
+ add "auto_save_name" [fst p.auto_save_name; snd p.auto_save_name] ++
+ add "automatic_tactics"
+ (List.fold_left (fun l (v1,v2) -> v1::v2::l) [] p.automatic_tactics) ++
+ add "cmd_print" [p.cmd_print] ++
+ add "modifier_for_navigation"
+ (List.map mod_to_str p.modifier_for_navigation) ++
+ add "modifier_for_templates"
+ (List.map mod_to_str p.modifier_for_templates) ++
+ add "modifier_for_tactics"
+ (List.map mod_to_str p.modifier_for_tactics) ++
+ add "modifiers_valid"
+ (List.map mod_to_str p.modifiers_valid) ++
+ add "cmd_browse" [fst p.cmd_browse; snd p.cmd_browse] ++
+ add "doc_url" [p.doc_url] ++
+ add "library_url" [p.library_url] ++
+ Config_lexer.print_file pref_file
with _ -> prerr_endline "Could not save preferences."
let (current:pref ref) =
@@ -163,58 +137,44 @@ let (current:pref ref) =
let load_pref p =
try
-(* let l = Config_lexer.get_config pref_file in
- List.iter
- (function k,v -> try match k with
- | "cmd_coqc" -> p.cmd_coqc <- v
- | "cmd_make" -> p.cmd_make <- v
- | "cmd_coqmakefile" -> p.cmd_coqmakefile <- v
- | "cmd_coqdoc" -> p.cmd_coqdoc <- v
- | "cmd_print" -> p.cmd_print <- v
- | "global_auto_revert" -> p.global_auto_revert <- bool_of_string v
- | "global_auto_revert_delay" ->
- p.global_auto_revert_delay <- int_of_string v
- | "auto_save" -> p.auto_save <- bool_of_string v
- | "auto_save_delay" -> p.auto_save_delay <- int_of_string v
- | "auto_save_prefix" ->
- let x,y = p.auto_save_name in
- p.auto_save_name <- (v,y)
- | "auto_save_suffix" ->
- let x,y = p.auto_save_name in
- p.auto_save_name <- (x,v)
-
- | "cmd_browse_prefix" ->
- let x,y = p.cmd_browse in
- p.cmd_browse <- (v,y)
- | "cmd_browse_suffix" ->
- let x,y = p.cmd_browse in
- p.cmd_browse <- (x,v)
- | "doc_url" -> p.doc_url <- v
- | "library_url" -> p.library_url <- v
- | "modifier_for_navigation" ->
- p.modifier_for_navigation <-
- List.rev_map str_to_mod (Config_lexer.split v)
- | "modifier_for_templates" ->
- p.modifier_for_templates <-
- List.rev_map str_to_mod (Config_lexer.split v)
- | "modifier_for_tactics" ->
- p.modifier_for_tactics <-
- List.rev_map str_to_mod (Config_lexer.split v)
- | "modifiers_valid" ->
- p.modifiers_valid <-
- List.rev_map str_to_mod (Config_lexer.split v)
- | "automatic_tactics" ->
- p.automatic_tactics <-
- List.map (fun x -> Pervasives.prerr_endline x;(x,"")) (Config_lexer.split v)
- | _ -> prerr_endline ("Warning: unknown option "^k)
- with _ -> ())
- l
-*)
- let cin = open_in pref_file in
- let (new_pref:pref) = input_value cin in
- close_in cin;
- current := new_pref
- with _ -> prerr_endline "Could not load preferences."
+ let m = Config_lexer.load_file pref_file in
+ let np = { !p with cmd_coqc = !p.cmd_coqc } in
+ let set k f = try let v = Stringmap.find k m in f v with _ -> () in
+ let set_hd k f = set k (fun v -> f (List.hd v)) in
+ let set_bool k f = set_hd k (fun v -> f (bool_of_string v)) in
+ let set_int k f = set_hd k (fun v -> f (int_of_string v)) in
+ let set_pair k f = set k (function [v1;v2] -> f v1 v2 | _ -> raise Exit) in
+ set_hd "cmd_coqc" (fun v -> np.cmd_coqc <- v);
+ set_hd "cmd_make" (fun v -> np.cmd_make <- v);
+ set_hd "cmd_coqmakefile" (fun v -> np.cmd_coqmakefile <- v);
+ set_hd "cmd_coqdoc" (fun v -> np.cmd_coqdoc <- v);
+ set_bool "global_auto_revert" (fun v -> np.global_auto_revert <- v);
+ set_int "global_auto_revert_delay"
+ (fun v -> np.global_auto_revert_delay <- v);
+ set_bool "auto_save" (fun v -> np.auto_save <- v);
+ set_int "auto_save_delay" (fun v -> np.auto_save_delay <- v);
+ set_pair "auto_save_name" (fun v1 v2 -> np.auto_save_name <- (v1,v2));
+ set "automatic_tactics"
+ (fun v ->
+ let rec from_list = function
+ | [] | [_] -> []
+ | x :: y :: l -> (x,y) :: from_list l
+ in
+ np.automatic_tactics <- from_list v);
+ set_hd "cmd_print" (fun v -> np.cmd_print <- v);
+ set "modifier_for_navigation"
+ (fun v -> np.modifier_for_navigation <- List.map str_to_mod v);
+ set "modifier_for_templates"
+ (fun v -> np.modifier_for_templates <- List.map str_to_mod v);
+ set "modifier_for_tactics"
+ (fun v -> np.modifier_for_tactics <- List.map str_to_mod v);
+ set "modifiers_valid"
+ (fun v -> np.modifiers_valid <- List.map str_to_mod v);
+ set_pair "cmd_browse" (fun v1 v2 -> np.cmd_browse <- (v1,v2));
+ set_hd "doc_url" (fun v -> np.doc_url <- v);
+ set_hd "library_url" (fun v -> np.library_url <- v);
+ current := np
+ with e -> prerr_endline (Printexc.to_string e); prerr_endline "Could not load preferences."
let configure () =
let cmd_coqc =