proper cut for Parse.enum1' and its derivatives (see also 769abc29bb8e);
authorwenzelm
Mon, 23 Oct 2023 12:52:56 +0200
changeset 78819 b8775a63cb35
parent 78818 aff231884b20
child 78820 b356019e8d49
proper cut for Parse.enum1' and its derivatives (see also 769abc29bb8e);
src/Pure/Isar/parse.ML
src/Pure/Isar/token.ML
--- a/src/Pure/Isar/parse.ML	Mon Oct 23 12:11:39 2023 +0200
+++ b/src/Pure/Isar/parse.ML	Mon Oct 23 12:52:56 2023 +0200
@@ -8,6 +8,7 @@
 sig
   val group: (unit -> string) -> (Token.T list -> 'a) -> Token.T list -> 'a
   val !!! : (Token.T list -> 'a) -> Token.T list -> 'a
+  val !!!! : (Context.generic * Token.src -> 'a) -> Context.generic * Token.src -> 'a
   val not_eof: Token.T parser
   val token: 'a parser -> Token.T parser
   val range: 'a parser -> ('a * Position.range) parser
@@ -146,7 +147,10 @@
 
 (* cut *)
 
-fun !!! scan = Scan.!!! "Outer syntax error" Token.input_position scan;
+val err_prefix = "Outer syntax error";
+
+fun !!! scan = Scan.!!! err_prefix Token.input_position scan;
+fun !!!! scan = Scan.!!! err_prefix Token.context_input_position scan;
 
 
 
@@ -236,7 +240,7 @@
 fun enum1 sep scan = scan ::: Scan.repeat ($$$ sep |-- !!! scan);
 fun enum sep scan = enum1 sep scan || Scan.succeed [];
 
-fun enum1' sep scan = scan ::: Scan.repeat (Scan.lift ($$$ sep) |-- scan);
+fun enum1' sep scan = scan ::: Scan.repeat (Scan.lift ($$$ sep) |-- !!!! scan);
 fun enum' sep scan = enum1' sep scan || Scan.succeed [];
 
 fun and_list1 scan = enum1 "and" scan;
--- a/src/Pure/Isar/token.ML	Mon Oct 23 12:11:39 2023 +0200
+++ b/src/Pure/Isar/token.ML	Mon Oct 23 12:52:56 2023 +0200
@@ -36,6 +36,7 @@
   val pos_of: T -> Position.T
   val adjust_offsets: (int -> int option) -> T -> T
   val input_position: src -> string option
+  val context_input_position: Context.generic * src -> string option
   val eof: T
   val is_eof: T -> bool
   val not_eof: T -> bool
@@ -219,6 +220,9 @@
 fun input_position [] = NONE
   | input_position (tok :: _) = SOME (Position.here (pos_of tok));
 
+fun context_input_position (_: Context.generic, []) = NONE
+  | context_input_position (_, tok :: _) = SOME (Position.here (pos_of tok));
+
 
 (* stopper *)