src/Pure/System/bash_syntax.ML
author wenzelm
Thu, 14 Dec 2017 14:27:37 +0100
changeset 67200 d49727160f0a
parent 64904 14c760e0e1cf
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64304
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/System/bash_syntax.ML
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     3
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     4
Syntax for GNU bash (see also Pure/System/bash.ML).
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     5
*)
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     6
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     7
signature BASH_SYNTAX =
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     8
sig
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
     9
  val string: string -> string
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    10
  val strings: string list -> string
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    11
end;
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    12
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    13
structure Bash_Syntax: BASH_SYNTAX =
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    14
struct
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    15
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    16
fun string "" = "\"\""
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    17
  | string str =
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    18
      str |> translate_string (fn ch =>
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    19
        let val c = ord ch in
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    20
          (case ch of
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    21
            "\t" => "$'\\t'"
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    22
          | "\n" => "$'\\n'"
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    23
          | "\f" => "$'\\f'"
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    24
          | "\r" => "$'\\r'"
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    25
          | _ =>
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    26
              if Symbol.is_ascii_letter ch orelse Symbol.is_ascii_digit ch orelse
67200
wenzelm
parents: 64904
diff changeset
    27
                exists_string (fn c => c = ch) "+,-./:_" then ch
64304
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    28
              else if c < 16 then "$'\\x0" ^ Int.fmt StringCvt.HEX c ^ "'"
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    29
              else if c < 32 orelse c >= 127 then "$'\\x" ^ Int.fmt StringCvt.HEX c ^ "'"
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    30
              else "\\" ^ ch)
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    31
        end);
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    32
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    33
val strings = space_implode " " o map string;
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    34
96bc94c87a81 clarified modules;
wenzelm
parents:
diff changeset
    35
end;