# HG changeset patch # User wenzelm # Date 895054828 -7200 # Node ID 9397b1446cdb3d084a6ca88efdf0f6491e53e655 # Parent f66f67577cf316476e0104729cf3d3dbfb5d9fc5 added fail_with and adapted !!; diff -r f66f67577cf3 -r 9397b1446cdb src/Pure/Syntax/scan.ML --- a/src/Pure/Syntax/scan.ML Wed May 13 12:19:01 1998 +0200 +++ b/src/Pure/Syntax/scan.ML Wed May 13 12:20:28 1998 +0200 @@ -11,7 +11,7 @@ signature BASIC_SCAN = sig - val !! : ('a -> string) -> ('a -> 'b) -> 'a -> 'b + val !! : ('a * string option -> string) -> ('a -> 'b) -> 'a -> 'b val >> : ('a -> 'b * 'c) * ('b -> 'd) -> 'a -> 'd * 'c val || : ('a -> 'b) * ('a -> 'b) -> 'a -> 'b val -- : ('a -> 'b * 'c) * ('c -> 'd * 'e) -> 'a -> ('b * 'd) * 'e @@ -25,6 +25,7 @@ sig include BASIC_SCAN val fail: 'a -> 'b + val fail_with: ('a -> string) -> 'a -> 'b val succeed: 'a -> 'b -> 'a * 'b val one: ('a -> bool) -> 'a list -> 'a * 'a list val any: ('a -> bool) -> 'a list -> 'a list * 'a list @@ -64,7 +65,7 @@ (** scanners **) exception MORE of string option; (*need more input (use prompt)*) -exception FAIL; (*try alternatives*) +exception FAIL of string option; (*try alternatives (reason of failure)*) exception ABORT of string; (*dead end*) @@ -72,7 +73,7 @@ fun (scan >> f) xs = apfst f (scan xs); -fun (scan1 || scan2) xs = scan1 xs handle FAIL => scan2 xs; +fun (scan1 || scan2) xs = scan1 xs handle FAIL _ => scan2 xs; fun (scan1 -- scan2) xs = let @@ -88,16 +89,17 @@ (* generic scanners *) -fun fail _ = raise FAIL; +fun fail _ = raise FAIL None; +fun fail_with msg_of xs = raise FAIL (Some (msg_of xs)); fun succeed y xs = (y, xs); fun one _ [] = raise MORE None | one pred (x :: xs) = - if pred x then (x, xs) else raise FAIL; + if pred x then (x, xs) else raise FAIL None; fun $$ _ [] = raise MORE None | $$ a (x :: xs) = - if a = x then (x, xs) else raise FAIL; + if a = x then (x, xs) else raise FAIL None; fun any _ [] = raise MORE None | any pred (lst as x :: xs) = @@ -114,7 +116,7 @@ fun max leq scan1 scan2 xs = (case (option scan1 xs, option scan2 xs) of - ((None, _), (None, _)) => raise FAIL + ((None, _), (None, _)) => raise FAIL None (*looses FAIL msg!*) | ((Some tok1, xs'), (None, _)) => (tok1, xs') | ((None, _), (Some tok2, xs')) => (tok2, xs') | ((Some tok1, xs1'), (Some tok2, xs2')) => @@ -140,9 +142,9 @@ (* exception handling *) -fun !! err scan xs = scan xs handle FAIL => raise ABORT (err xs); -fun try scan xs = scan xs handle MORE _ => raise FAIL | ABORT _ => raise FAIL; -fun force scan xs = scan xs handle MORE _ => raise FAIL; +fun !! err scan xs = scan xs handle FAIL msg => raise ABORT (err (xs, msg)); +fun try scan xs = scan xs handle MORE _ => raise FAIL None | ABORT _ => raise FAIL None; +fun force scan xs = scan xs handle MORE _ => raise FAIL None; fun prompt str scan xs = scan xs handle MORE None => raise MORE (Some str); fun error scan xs = scan xs handle ABORT msg => Library.error msg; @@ -251,7 +253,7 @@ else lit eq (if a = no_literal then res else Some (a, cs)) cs; in (case lit lex None chrs of - None => raise FAIL + None => raise FAIL None | Some res => res) end;