src/Tools/Haskell/XML/Decode.hs
author wenzelm
Mon, 12 Nov 2018 15:36:55 +0100
changeset 69290 fb77612d11eb
parent 69280 e1d01b351724
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     1
{- generated by Isabelle -}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     2
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     3
{-  Title:      Tools/Haskell/XML/Decode.hs
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     4
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     5
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     6
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     7
XML as data representation language.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69240
diff changeset
     8
e1d01b351724 more formal references;
wenzelm
parents: 69240
diff changeset
     9
See also "$ISABELLE_HOME/src/Pure/PIDE/xml.ML".
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    10
-}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    11
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    12
module Isabelle.XML.Decode (
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    13
  A, T, V,
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    14
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    15
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    16
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    17
  tree, properties, string, init, bool, unit, pair, triple, list, variant
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    18
)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    19
where
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    20
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    21
import Data.List ((!!))
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    22
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    23
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    24
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    25
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    26
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    27
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    28
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    29
type A a = String -> a
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    30
type T a = XML.Body -> a
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    31
type V a = ([String], XML.Body) -> a
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    32
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    33
err_atom = error "Malformed XML atom"
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    34
err_body = error "Malformed XML body"
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    35
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    36
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    37
{- atomic values -}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    38
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    39
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    40
int_atom s =
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    41
  case Value.parse_int s of
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    42
    Just i -> i
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    43
    Nothing -> err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    44
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    45
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    46
bool_atom "0" = False
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    47
bool_atom "1" = True
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    48
bool_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    49
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    50
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    51
unit_atom "" = ()
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    52
unit_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    53
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    54
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    55
{- structural nodes -}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    56
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69280
diff changeset
    57
node (XML.Elem ((":", []), ts)) = ts
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    58
node _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    59
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    60
vector atts =
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    61
  map_index (\(i, (a, x)) -> if int_atom a == i then x else err_atom) atts
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    62
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69280
diff changeset
    63
tagged (XML.Elem ((name, atts), ts)) = (int_atom name, (vector atts, ts))
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    64
tagged _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    65
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    66
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    67
{- representation of standard types -}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    68
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    69
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    70
tree [t] = t
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    71
tree _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    72
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    73
properties :: T Properties.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69280
diff changeset
    74
properties [XML.Elem ((":", props), [])] = props
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    75
properties _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    76
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    77
string :: T String
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    78
string [] = ""
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    79
string [XML.Text s] = s
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    80
string _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    81
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    82
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    83
int = int_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    84
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    85
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    86
bool = bool_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    87
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    88
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    89
unit = unit_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    90
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    91
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    92
pair f g [t1, t2] = (f (node t1), g (node t2))
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    93
pair _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    94
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    95
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    96
triple f g h [t1, t2, t3] = (f (node t1), g (node t2), h (node t3))
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    97
triple _ _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    98
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    99
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   100
list f ts = map (f . node) ts
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   101
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   102
option :: T a -> T (Maybe a)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   103
option _ [] = Nothing
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   104
option f [t] = Just (f (node t))
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   105
option _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   106
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   107
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   108
variant fs [t] = (fs !! tag) (xs, ts)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   109
  where (tag, (xs, ts)) = tagged t
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
   110
variant _ _ = err_body