src/Pure/General/scan.ML
changeset 16512 1fa048f2a590
parent 16002 e0557c452138
child 16803 014090d1e64b
equal deleted inserted replaced
16511:dad516b121cd 16512:1fa048f2a590
   329   | extend_lexicon lexicon chrss =
   329   | extend_lexicon lexicon chrss =
   330       let
   330       let
   331         fun ext (lex, chrs) =
   331         fun ext (lex, chrs) =
   332           let
   332           let
   333             fun add (Branch (d, a, lt, eq, gt)) (chs as c :: cs) =
   333             fun add (Branch (d, a, lt, eq, gt)) (chs as c :: cs) =
   334                   (case String.compare (c, d) of
   334                   (case string_ord (c, d) of
   335                     LESS => Branch (d, a, add lt chs, eq, gt)
   335                     LESS => Branch (d, a, add lt chs, eq, gt)
   336                   | EQUAL => Branch (d, if null cs then chrs else a, lt, add eq cs, gt)
   336                   | EQUAL => Branch (d, if null cs then chrs else a, lt, add eq cs, gt)
   337                   | GREATER => Branch (d, a, lt, eq, add gt chs))
   337                   | GREATER => Branch (d, a, lt, eq, add gt chs))
   338               | add Empty [c] =
   338               | add Empty [c] =
   339                   Branch (c, chrs, Empty, Empty, Empty)
   339                   Branch (c, chrs, Empty, Empty, Empty)
   359 (* is_literal *)
   359 (* is_literal *)
   360 
   360 
   361 fun is_literal Empty _ = false
   361 fun is_literal Empty _ = false
   362   | is_literal _ [] = false
   362   | is_literal _ [] = false
   363   | is_literal (Branch (d, a, lt, eq, gt)) (chs as c :: cs) =
   363   | is_literal (Branch (d, a, lt, eq, gt)) (chs as c :: cs) =
   364       (case String.compare (c, d) of
   364       (case string_ord (c, d) of
   365         LESS => is_literal lt chs
   365         LESS => is_literal lt chs
   366       | EQUAL => a <> no_literal andalso null cs orelse is_literal eq cs
   366       | EQUAL => a <> no_literal andalso null cs orelse is_literal eq cs
   367       | GREATER => is_literal gt chs);
   367       | GREATER => is_literal gt chs);
   368 
   368 
   369 
   369 
   372 fun literal lex chrs =
   372 fun literal lex chrs =
   373   let
   373   let
   374     fun lit Empty res _ = res
   374     fun lit Empty res _ = res
   375       | lit (Branch _) _ [] = raise MORE NONE
   375       | lit (Branch _) _ [] = raise MORE NONE
   376       | lit (Branch (d, a, lt, eq, gt)) res (chs as c :: cs) =
   376       | lit (Branch (d, a, lt, eq, gt)) res (chs as c :: cs) =
   377           (case String.compare (c, d) of
   377           (case string_ord (c, d) of
   378             LESS => lit lt res chs
   378             LESS => lit lt res chs
   379           | EQUAL => lit eq (if a = no_literal then res else SOME (a, cs)) cs
   379           | EQUAL => lit eq (if a = no_literal then res else SOME (a, cs)) cs
   380           | GREATER => lit gt res chs);
   380           | GREATER => lit gt res chs);
   381   in
   381   in
   382     (case lit lex NONE chrs of
   382     (case lit lex NONE chrs of