@@ -76,14 +76,19 @@ let read_file (filename:string) =
7676 if debug then FStarC_Format. print1 " Opening file %s\n " filename;
7777 filename, read_physical_file filename
7878
79- let fst_extensions = [" .fst" ; " .fsti" ]
80- let interface_extensions = [" .fsti" ]
79+ let extra_extensions () = List. concat_map (fun x -> [" ." ^ x; " ." ^ x ^ " i" ]) (FStarC_Options. lang_extensions () )
80+ let fst_extensions () = [" .fst" ; " .fsti" ] @ extra_extensions ()
81+ let extra_extensions_interface () = List. map (fun x -> " ." ^ x ^ " i" ) (FStarC_Options. lang_extensions () )
82+ let interface_extensions () = [" .fsti" ] @ extra_extensions_interface ()
8183
8284let has_extension file extensions =
8385 FStar_List. existsb (U. ends_with file) extensions
8486
87+ let take_lang_extension file =
88+ FStar_List. tryFind (fun x -> U. ends_with file (" ." ^ x)) (extra_extensions () )
89+
8590let check_extension fn =
86- if (not (has_extension fn fst_extensions)) then
91+ if (not (has_extension fn ( fst_extensions () ) )) then
8792 let message = FStarC_Format. fmt1 " Unrecognized extension '%s'" fn in
8893 raise_error_text FStarC_Range. dummyRange Fatal_UnrecognizedExtension message
8994
@@ -523,91 +528,113 @@ let _ = FStarC_Parser_AST_Util.register_extension_lang_parser "fstar" parse_fsta
523528type lang_opts = string option
524529
525530let parse_lang lang fn =
526- match fn with
527- | Filename _ ->
528- failwith " parse_lang: only in incremental mode"
529- | Incremental s
530- | Toplevel s
531- | Fragment s ->
532- try
533- let frag_pos = FStarC_Range. mk_pos s.frag_line s.frag_col in
534- let rng = FStarC_Range. mk_range s.frag_fname frag_pos frag_pos in
535- let decls = FStarC_Parser_AST_Util. parse_extension_lang lang s.frag_text rng in
536- let comments = FStarC_Parser_Util. flush_comments () in
537- ASTFragment (Inr decls, comments)
538- with
531+ let s =
532+ match fn with
533+ | Filename f ->
534+ check_extension f;
535+ let f', contents = read_file f in
536+ {
537+ frag_fname = f';
538+ frag_text = contents;
539+ frag_line = Z. one;
540+ frag_col = Z. zero;
541+ }
542+ | Incremental s
543+ | Toplevel s
544+ | Fragment s -> s
545+ in
546+ try
547+ let frag_pos = FStarC_Range. mk_pos s.frag_line s.frag_col in
548+ let rng = FStarC_Range. mk_range s.frag_fname frag_pos frag_pos in
549+ let decls = FStarC_Parser_AST_Util. parse_extension_lang lang s.frag_text rng in
550+ let comments = FStarC_Parser_Util. flush_comments () in
551+ ASTFragment (Inr decls, comments)
552+ with
553+ | FStarC_Errors. Error (e , msg , r , _ctx ) ->
554+ ParseError (e, msg, r)
555+
556+ let parse_no_lang fn =
557+ let lexbuf, filename, contents =
558+ match fn with
559+ | Filename f ->
560+ check_extension f;
561+ let f', contents = read_file f in
562+ (try create contents f' 1 0 , f', contents
563+ with _ -> raise_error_text FStarC_Range. dummyRange Fatal_InvalidUTF8Encoding (FStarC_Format. fmt1 " File %s has invalid UTF-8 encoding." f'))
564+ | Incremental s
565+ | Toplevel s
566+ | Fragment s ->
567+ create s.frag_text s.frag_fname (Z. to_int s.frag_line) (Z. to_int s.frag_col), " <input>" , s.frag_text
568+ in
569+
570+ let lexer () =
571+ let tok = FStarC_Parser_LexFStar. token lexbuf in
572+ if ! dbg_Tokens then
573+ print_string (" TOKEN: " ^ (string_of_token tok) ^ " \n " );
574+ (tok, lexbuf.start_p, lexbuf.cur_p)
575+ in
576+ try
577+ match fn with
578+ | Filename _
579+ | Toplevel _ -> begin
580+ let fileOrFragment =
581+ MenhirLib.Convert.Simplified. traditional2revised FStarC_Parser_Parse. inputFragment lexer
582+ in
583+ let frags = match fileOrFragment with
584+ | FStar_Pervasives. Inl modul ->
585+ if has_extension filename (interface_extensions () )
586+ then FStar_Pervasives. Inl (FStarC_Parser_AST. as_interface modul)
587+ else FStar_Pervasives. Inl modul
588+ | _ -> fileOrFragment
589+ in ASTFragment (frags, FStarC_Parser_Util. flush_comments () )
590+ end
591+
592+ | Incremental i ->
593+ let decls, comments, err_opt =
594+ parse_incremental_fragment
595+ filename
596+ i.frag_text
597+ lexbuf
598+ lexer
599+ (fun (d :FStarC_Parser_AST.decl ) -> d.drange)
600+ FStarC_Parser_Parse. oneDeclOrEOF
601+ in
602+ IncrementalFragment (decls, comments, err_opt)
603+
604+ | Fragment _ ->
605+ Term (MenhirLib.Convert.Simplified. traditional2revised FStarC_Parser_Parse. term lexer)
606+ with
607+ | FStarC_Errors. Empty_frag ->
608+ ASTFragment (FStar_Pervasives. Inr [] , [] )
609+
539610 | FStarC_Errors. Error (e , msg , r , _ctx ) ->
540611 ParseError (e, msg, r)
541612
613+ | e ->
614+ (*
615+ | Parsing.Parse_error as _e
616+ | FStarC_Parser_Parse.MenhirBasics.Error as _e ->
617+ *)
618+ ParseError (err_of_parse_error filename lexbuf None )
619+
620+
542621let parse (lang_opt :lang_opts ) fn =
543622 FStarC_Stats. record " parse" @@ fun () ->
544623 FStarC_Parser_Util. warningHandler := (function
545624 | e -> Printf. printf " There was some warning (TODO)\n " );
546- match lang_opt with
547- | Some lang -> parse_lang lang fn
548- | _ ->
549- let lexbuf, filename, contents =
550- match fn with
551- | Filename f ->
552- check_extension f;
553- let f', contents = read_file f in
554- (try create contents f' 1 0 , f', contents
555- with _ -> raise_error_text FStarC_Range. dummyRange Fatal_InvalidUTF8Encoding (FStarC_Format. fmt1 " File %s has invalid UTF-8 encoding." f'))
556- | Incremental s
557- | Toplevel s
558- | Fragment s ->
559- create s.frag_text s.frag_fname (Z. to_int s.frag_line) (Z. to_int s.frag_col), " <input>" , s.frag_text
560- in
561-
562- let lexer () =
563- let tok = FStarC_Parser_LexFStar. token lexbuf in
564- if ! dbg_Tokens then
565- print_string (" TOKEN: " ^ (string_of_token tok) ^ " \n " );
566- (tok, lexbuf.start_p, lexbuf.cur_p)
567- in
568- try
569- match fn with
570- | Filename _
571- | Toplevel _ -> begin
572- let fileOrFragment =
573- MenhirLib.Convert.Simplified. traditional2revised FStarC_Parser_Parse. inputFragment lexer
574- in
575- let frags = match fileOrFragment with
576- | FStar_Pervasives. Inl modul ->
577- if has_extension filename interface_extensions
578- then FStar_Pervasives. Inl (FStarC_Parser_AST. as_interface modul)
579- else FStar_Pervasives. Inl modul
580- | _ -> fileOrFragment
581- in ASTFragment (frags, FStarC_Parser_Util. flush_comments () )
582- end
583-
584- | Incremental i ->
585- let decls, comments, err_opt =
586- parse_incremental_fragment
587- filename
588- i.frag_text
589- lexbuf
590- lexer
591- (fun (d :FStarC_Parser_AST.decl ) -> d.drange)
592- FStarC_Parser_Parse. oneDeclOrEOF
593- in
594- IncrementalFragment (decls, comments, err_opt)
595-
596- | Fragment _ ->
597- Term (MenhirLib.Convert.Simplified. traditional2revised FStarC_Parser_Parse. term lexer)
598- with
599- | FStarC_Errors. Empty_frag ->
600- ASTFragment (FStar_Pervasives. Inr [] , [] )
601-
602- | FStarC_Errors. Error (e , msg , r , _ctx ) ->
603- ParseError (e, msg, r)
604-
605- | e ->
606- (*
607- | Parsing.Parse_error as _e
608- | FStarC_Parser_Parse.MenhirBasics.Error as _e ->
609- *)
610- ParseError (err_of_parse_error filename lexbuf None )
625+ match lang_opt, fn with
626+ | Some lang , _ -> parse_lang lang fn
627+ | None , Filename fn' -> begin
628+ match take_lang_extension fn' with
629+ | Some lang -> parse_lang lang fn
630+ | None -> parse_no_lang fn
631+ end
632+ | None , Toplevel fn' -> begin
633+ match take_lang_extension fn'.frag_fname with
634+ | Some lang -> parse_lang lang fn
635+ | None -> parse_no_lang fn
636+ end
637+ | _ , _ -> parse_no_lang fn
611638
612639
613640(* * Parsing of command-line error/warning/silent flags. *)
0 commit comments