src/Pure/ML/ml_parse.ML
author wenzelm
Sun, 28 Feb 2016 21:20:51 +0100
changeset 62459 7a5d88dd8cc9
parent 62354 fdd6989cc8a0
permissions -rw-r--r--
support only polyml-5.3.0 and polyml-5.6;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/ML/ml_parse.ML
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     3
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     4
Minimal parsing for SML -- fixing integer numerals.
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     5
*)
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     6
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     7
signature ML_PARSE =
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
     8
sig
30672
beaadd5af500 more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
wenzelm
parents: 30636
diff changeset
     9
  val global_context: use_context
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    10
end;
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    11
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    12
structure ML_Parse: ML_PARSE =
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    13
struct
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    14
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    15
(** error handling **)
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    16
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    17
fun !!! scan =
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    18
  let
48911
5debc3e4fa81 tuned messages: end-of-input rarely means physical end-of-file from the past;
wenzelm
parents: 43948
diff changeset
    19
    fun get_pos [] = " (end-of-input)"
48992
0518bf89c777 renamed Position.str_of to Position.here;
wenzelm
parents: 48911
diff changeset
    20
      | get_pos (tok :: _) = Position.here (ML_Lex.pos_of tok);
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    21
43947
9b00f09f7721 defer evaluation of Scan.message, for improved performance in the frequent situation where failure is handled later (e.g. via ||);
wenzelm
parents: 30682
diff changeset
    22
    fun err (toks, NONE) = (fn () => "SML syntax error" ^ get_pos toks)
9b00f09f7721 defer evaluation of Scan.message, for improved performance in the frequent situation where failure is handled later (e.g. via ||);
wenzelm
parents: 30682
diff changeset
    23
      | err (toks, SOME msg) = (fn () => "SML syntax error" ^ get_pos toks ^ ": " ^ msg ());
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    24
  in Scan.!! err scan end;
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    25
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    26
fun bad_input x =
30682
dcb233670c98 eliminated non-canonical alias structure T = ML_Lex;
wenzelm
parents: 30672
diff changeset
    27
  (Scan.some (fn tok => (case ML_Lex.kind_of tok of ML_Lex.Error msg => SOME msg | _ => NONE)) :|--
43947
9b00f09f7721 defer evaluation of Scan.message, for improved performance in the frequent situation where failure is handled later (e.g. via ||);
wenzelm
parents: 30682
diff changeset
    28
    (fn msg => Scan.fail_with (K (fn () => msg)))) x;
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    29
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    30
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    31
(** basic parsers **)
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    32
27817
78cae5cca09e renamed ML_Lex.val_of to content_of;
wenzelm
parents: 24594
diff changeset
    33
fun $$$ x =
30682
dcb233670c98 eliminated non-canonical alias structure T = ML_Lex;
wenzelm
parents: 30672
diff changeset
    34
  Scan.one (fn tok => ML_Lex.kind_of tok = ML_Lex.Keyword andalso ML_Lex.content_of tok = x)
dcb233670c98 eliminated non-canonical alias structure T = ML_Lex;
wenzelm
parents: 30672
diff changeset
    35
    >> ML_Lex.content_of;
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    36
30682
dcb233670c98 eliminated non-canonical alias structure T = ML_Lex;
wenzelm
parents: 30672
diff changeset
    37
val int = Scan.one (fn tok => ML_Lex.kind_of tok = ML_Lex.Int) >> ML_Lex.content_of;
dcb233670c98 eliminated non-canonical alias structure T = ML_Lex;
wenzelm
parents: 30672
diff changeset
    38
dcb233670c98 eliminated non-canonical alias structure T = ML_Lex;
wenzelm
parents: 30672
diff changeset
    39
val regular = Scan.one ML_Lex.is_regular >> ML_Lex.content_of;
dcb233670c98 eliminated non-canonical alias structure T = ML_Lex;
wenzelm
parents: 30672
diff changeset
    40
val improper = Scan.one ML_Lex.is_improper >> ML_Lex.content_of;
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    41
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    42
val blanks = Scan.repeat improper >> implode;
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    43
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    44
30672
beaadd5af500 more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
wenzelm
parents: 30636
diff changeset
    45
(* global use_context *)
beaadd5af500 more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
wenzelm
parents: 30636
diff changeset
    46
beaadd5af500 more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
wenzelm
parents: 30636
diff changeset
    47
val global_context: use_context =
62354
fdd6989cc8a0 SML/NJ is no longer supported;
wenzelm
parents: 58864
diff changeset
    48
 {name_space = ML_Name_Space.global,
48992
0518bf89c777 renamed Position.str_of to Position.here;
wenzelm
parents: 48911
diff changeset
    49
  str_of_pos = Position.here oo Position.line_file,
30672
beaadd5af500 more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
wenzelm
parents: 30636
diff changeset
    50
  print = writeln,
beaadd5af500 more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
wenzelm
parents: 30636
diff changeset
    51
  error = error};
beaadd5af500 more systematic type use_context, with particular values ML_Parse.global_context and ML_Context.local_context;
wenzelm
parents: 30636
diff changeset
    52
24594
6689effe75d1 Minimal parsing for SML -- fixing integer numerals.
wenzelm
parents:
diff changeset
    53
end;