From b59fd68938a2769d981402d0ff408f9f991b3bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tuong?= <tuong@users.noreply.github.com> Date: Sat, 23 May 2020 14:16:43 +0100 Subject: [PATCH] report C99 parsing errors --- src_ext/l4v/src/tools/c-parser/Feedback.ML | 6 ++++++ src_ext/l4v/src/tools/c-parser/StrictCParser.ML | 14 ++++++++++---- src_ext/l4v/src/tools/c-parser/isar_install.ML | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src_ext/l4v/src/tools/c-parser/Feedback.ML b/src_ext/l4v/src/tools/c-parser/Feedback.ML index 553e37b68..23cf17818 100644 --- a/src_ext/l4v/src/tools/c-parser/Feedback.ML +++ b/src_ext/l4v/src/tools/c-parser/Feedback.ML @@ -13,6 +13,9 @@ signature FEEDBACK = sig exception WantToExit of string + + val msg_c99 : string + val numErrors : int Unsynchronized.ref val errorThreshold : int option Unsynchronized.ref val errorStr : Region.t * string -> unit @@ -35,6 +38,9 @@ structure Feedback :> FEEDBACK = struct open Unsynchronized exception WantToExit of string + +val msg_c99 = "C99 parser" + val isSome = Option.isSome val numErrors = ref 0 diff --git a/src_ext/l4v/src/tools/c-parser/StrictCParser.ML b/src_ext/l4v/src/tools/c-parser/StrictCParser.ML index b8dafec53..dd9c81f49 100644 --- a/src_ext/l4v/src/tools/c-parser/StrictCParser.ML +++ b/src_ext/l4v/src/tools/c-parser/StrictCParser.ML @@ -63,7 +63,7 @@ fun parse maybe_c11 docpp0 error_lookahead (includes : string list) (input : inp | (_, Source src) => f (drain [Input.source_content src |> #1]) (C_Env.encode_positions [Input.pos_of src]) - fun parse_without_c11 thy = + fun parse_without_c11 exit_err thy = docpp (open_close (fn istream => fn fname => let @@ -71,8 +71,14 @@ fun parse maybe_c11 docpp0 error_lookahead (includes : string list) (input : inp val lexarg = StrictCLex.UserDeclarations.new_state fname val lexer = StrictCParser.makeLexer istream lexarg val pos = #source lexarg + fun err e = + tap (fn _ => + (writeln (Markup.markup (Markup.bad ()) (Feedback.msg_c99 ^ ": " ^ "returning a default empty parsed value")); + exit_err (Feedback.msg_c99 ^ ": " ^ @{make_string} e ^ Position.here \<^here>))) + ([], !Feedback.numErrors) in (invoke error_lookahead pos lexer - handle StrictCParser.ParseError => ([], !Feedback.numErrors)) + handle e as StrictCParser.ParseError => err e + | e as Feedback.WantToExit _ => err e) |>> pair fname end)) |>> (fn (fname, v) => Synchronized.change_result last_parsed (K (v, (fname, v)))) @@ -119,7 +125,7 @@ fun parse maybe_c11 docpp0 error_lookahead (includes : string list) (input : inp case maybe_c11 of SOME true => let val ((res2, err2), thy) = parse_with_c11 thy - val ((res1, err1), thy) = parse_without_c11 thy + val ((res1, err1), thy) = parse_without_c11 warning thy val rm = StmtDecl.rm_region_ext_decl_list val r1 = rm res1 val r2 = rm res2 @@ -134,7 +140,7 @@ fun parse maybe_c11 docpp0 error_lookahead (includes : string list) (input : inp r1 r2 (0, true)) then ((res1, err1 + err2), thy) else error "Parsed values are not similar." end - | SOME false => parse_without_c11 thy + | SOME false => parse_without_c11 error thy | _ => parse_with_c11 thy end diff --git a/src_ext/l4v/src/tools/c-parser/isar_install.ML b/src_ext/l4v/src/tools/c-parser/isar_install.ML index 8200f1bd9..3c4be8ced 100644 --- a/src_ext/l4v/src/tools/c-parser/isar_install.ML +++ b/src_ext/l4v/src/tools/c-parser/isar_install.ML @@ -55,7 +55,7 @@ fun setup_feedback extra_output_filename = let NONE => (fn _ => fn f => f) | SOME _ => (fn pfx => fn f => fn s => (trace_extra (pfx ^ s); f s)) in - Feedback.errorf := add_extra "ERROR: " (writeln o Markup.markup (Markup.bad ())); + Feedback.errorf := add_extra "ERROR: " (writeln o Markup.markup (Markup.bad ()) o (fn s => Feedback.msg_c99 ^ ": " ^ s)); Feedback.warnf := add_extra "" warning; Feedback.informf := add_extra "" (Output.tracing o Feedback.timestamp) end -- GitLab