瀏覽代碼

improve position guessing in parser a bit

Currently we sometimes miss a display field because token skipping does not fill the cache, which is then accessed by `last_token`.
Simon Krajewski 9 年之前
父節點
當前提交
7aa803658e
共有 2 個文件被更改,包括 8 次插入6 次删除
  1. 1 0
      src/server.ml
  2. 7 6
      src/syntax/parser.ml

+ 1 - 0
src/server.ml

@@ -261,6 +261,7 @@ let rec wait_loop process_params verbose accept =
 					let defines = PMap.foldi (fun k v acc -> (k ^ "=" ^ v) :: acc) ctx.com.defines [] in
 					print_endline ("Defines " ^ (String.concat "," (List.sort compare defines)));
 					print_endline ("Using signature " ^ Digest.to_hex (get_signature ctx.com));
+					print_endline ("Display position: " ^ (Printer.s_pos !Parser.resume_display));
 				end;
 				Parser.display_error := (fun e p -> has_parse_error := true; ctx.com.error (Parser.error_msg e) p);
 				if ctx.com.display.dms_display then begin

+ 7 - 6
src/syntax/parser.ml

@@ -519,6 +519,10 @@ let reify in_macro =
 	in
 	(fun e -> to_expr e (snd e)), to_ctype, to_type_def
 
+let next_token s = match Stream.peek s with
+	| Some tk -> tk
+	| _ -> last_token s
+
 let popt f = parser
 	| [< v = f >] -> Some v
 	| [< >] -> None
@@ -757,7 +761,7 @@ and parse_class_fields tdecl p1 s =
 	let l = parse_class_field_resume tdecl s in
 	let p2 = (match s with parser
 		| [< '(BrClose,p2) >] -> p2
-		| [< >] -> if do_resume() then pos (last_token s) else serror()
+		| [< >] -> if do_resume() then pos (next_token s) else serror()
 	) in
 	l, p2
 
@@ -1171,7 +1175,7 @@ and block_with_pos acc p s =
 		| Stream.Failure ->
 			List.rev acc,p
 		| Stream.Error _ ->
-			let tk , pos = (match Stream.peek s with None -> last_token s | Some t -> t) in
+			let tk , pos = next_token s in
 			(!display_error) (Unexpected tk) pos;
 			block_with_pos acc pos s
 		| Error (e,p) ->
@@ -1288,10 +1292,7 @@ and expr = parser
 				| [< '(BrClose,p2) >] -> p2
 				| [< >] ->
 					(* Ignore missing } if we are resuming and "guess" the last position. *)
-					if do_resume() then begin match Stream.peek s with
-						| Some (_,p) -> p
-						| None -> pos (last_token s)
-					end else serror()
+					if do_resume() then pos (next_token s) else serror()
 			in
 			let e = (b,punion p1 p2) in
 			(match b with