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