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 |