src/Tools/Haskell/Haskell.thy
author wenzelm
Sat, 10 Nov 2018 16:32:00 +0100
changeset 69278 30f6e8d2cd96
parent 69248 9f21381600e3
child 69280 e1d01b351724
permissions -rw-r--r--
more Haskell operations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     1
(*  Title:      Tools/Haskell/Haskell.thy
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
     3
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
     4
Support for Isabelle tools in Haskell.
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     5
*)
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     6
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     7
theory Haskell
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     8
  imports Pure
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     9
  keywords "generate_haskell_file" "export_haskell_file" :: thy_decl
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
    10
begin
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
    11
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    12
ML_file "haskell.ML"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    13
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    14
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    15
section \<open>Commands\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    16
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
    17
ML \<open>
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
    18
  Outer_Syntax.command \<^command_keyword>\<open>generate_haskell_file\<close> "generate Haskell file"
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    19
    (Parse.position Parse.path -- (\<^keyword>\<open>=\<close> |-- Parse.input Parse.embedded)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    20
      >> Haskell.generate_file_cmd);
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    21
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    22
  Outer_Syntax.command \<^command_keyword>\<open>export_haskell_file\<close> "export Haskell file"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    23
    (Parse.name -- (\<^keyword>\<open>=\<close> |-- Parse.input Parse.embedded)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    24
      >> Haskell.export_file_cmd);
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    25
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    26
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    27
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    28
section \<open>Source modules\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    29
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    30
generate_haskell_file "Library.hs" = \<open>
69226
68f5dc2275ac tuned whitespace;
wenzelm
parents: 69225
diff changeset
    31
{-  Title:      Tools/Haskell/Library.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    32
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    33
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    34
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    35
Basic library of Isabelle idioms.
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    36
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    37
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    38
module Isabelle.Library (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    39
  (|>), (|->), (#>), (#->),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    40
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    41
  the, the_default,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    42
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    43
  fold, fold_rev, single, map_index, get_index,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    44
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    45
  quote, trim_line)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    46
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    47
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    48
import Data.Maybe
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    49
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    50
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    51
{- functions -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    52
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    53
(|>) :: a -> (a -> b) -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    54
x |> f = f x
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    55
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    56
(|->) :: (a, b) -> (a -> b -> c) -> c
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    57
(x, y) |-> f = f x y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    58
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    59
(#>) :: (a -> b) -> (b -> c) -> a -> c
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    60
(f #> g) x = x |> f |> g
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    61
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    62
(#->) :: (a -> (c, b)) -> (c -> b -> d) -> a -> d
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    63
(f #-> g) x  = x |> f |-> g
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    64
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    65
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    66
{- options -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    67
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    68
the :: Maybe a -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    69
the (Just x) = x
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    70
the Nothing = error "the Nothing"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    71
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    72
the_default :: a -> Maybe a -> a
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    73
the_default x Nothing = x
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    74
the_default _ (Just y) = y
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    75
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    76
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    77
{- lists -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    78
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    79
fold :: (a -> b -> b) -> [a] -> b -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    80
fold _ [] y = y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    81
fold f (x : xs) y = fold f xs (f x y)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    82
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    83
fold_rev :: (a -> b -> b) -> [a] -> b -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    84
fold_rev _ [] y = y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    85
fold_rev f (x : xs) y = f x (fold_rev f xs y)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    86
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    87
single :: a -> [a]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    88
single x = [x]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    89
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    90
map_index :: ((Int, a) -> b) -> [a] -> [b]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    91
map_index f = map_aux 0
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    92
  where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    93
    map_aux _ [] = []
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    94
    map_aux i (x : xs) = f (i, x) : map_aux (i + 1) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    95
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    96
get_index :: (a -> Maybe b) -> [a] -> Maybe (Int, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    97
get_index f = get_aux 0
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    98
  where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    99
    get_aux _ [] = Nothing
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   100
    get_aux i (x : xs) =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   101
      case f x of
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   102
        Nothing -> get_aux (i + 1) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   103
        Just y -> Just (i, y)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   104
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   105
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   106
{- strings -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   107
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   108
quote :: String -> String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   109
quote s = "\"" ++ s ++ "\""
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   110
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   111
trim_line :: String -> String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   112
trim_line line =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   113
  case reverse line of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   114
    '\n' : '\r' : rest -> reverse rest
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   115
    '\n' : rest -> reverse rest
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   116
    _ -> line
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   117
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   118
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   119
generate_haskell_file "Value.hs" = \<open>
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   120
{-  Title:      Haskell/Tools/Value.hs
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   121
    Author:     Makarius
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   122
    LICENSE:    BSD 3-clause (Isabelle)
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   123
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   124
Plain values, represented as string.
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   125
-}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   126
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   127
module Isabelle.Value
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   128
  (print_bool, parse_bool, print_int, parse_int, print_real, parse_real)
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   129
where
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   130
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   131
import Data.Maybe
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   132
import qualified Data.List as List
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   133
import qualified Text.Read as Read
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   134
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   135
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   136
{- bool -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   137
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   138
print_bool :: Bool -> String
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   139
print_bool True = "true"
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   140
print_bool False = "false"
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   141
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   142
parse_bool :: String -> Maybe Bool
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   143
parse_bool "true" = Just True
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   144
parse_bool "false" = Just False
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   145
parse_bool _ = Nothing
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   146
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   147
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   148
{- int -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   149
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   150
print_int :: Int -> String
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   151
print_int = show
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   152
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   153
parse_int :: String -> Maybe Int
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   154
parse_int = Read.readMaybe
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   155
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   156
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   157
{- real -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   158
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   159
print_real :: Double -> String
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   160
print_real x =
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   161
  let s = show x in
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   162
    case span (/= '.') s of
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   163
      (a, '.' : b) | List.all (== '0') b -> a
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   164
      _ -> s
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   165
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   166
parse_real :: String -> Maybe Double
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   167
parse_real = Read.readMaybe
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   168
\<close>
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   169
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   170
generate_haskell_file "Buffer.hs" = \<open>
69226
68f5dc2275ac tuned whitespace;
wenzelm
parents: 69225
diff changeset
   171
{-  Title:      Tools/Haskell/Buffer.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   172
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   173
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   174
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   175
Efficient text buffers.
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   176
-}
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
   177
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   178
module Isabelle.Buffer (T, empty, add, content)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   179
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   180
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   181
newtype T = Buffer [String]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   182
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   183
empty :: T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   184
empty = Buffer []
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   185
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   186
add :: String -> T -> T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   187
add "" buf = buf
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   188
add x (Buffer xs) = Buffer (x : xs)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   189
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   190
content :: T -> String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   191
content (Buffer xs) = concat (reverse xs)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   192
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   193
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   194
generate_haskell_file "Properties.hs" = \<open>
69226
68f5dc2275ac tuned whitespace;
wenzelm
parents: 69225
diff changeset
   195
{-  Title:      Tools/Haskell/Properties.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   196
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   197
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   198
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   199
Property lists.
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   200
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   201
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   202
module Isabelle.Properties (Entry, T, defined, get, put, remove)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   203
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   204
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   205
import qualified Data.List as List
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   206
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   207
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   208
type Entry = (String, String)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   209
type T = [Entry]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   210
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   211
defined :: T -> String -> Bool
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   212
defined props name = any (\(a, _) -> a == name) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   213
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   214
get :: T -> String -> Maybe String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   215
get props name = List.lookup name props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   216
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   217
put :: Entry -> T -> T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   218
put entry props = entry : remove (fst entry) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   219
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   220
remove :: String -> T -> T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   221
remove name props =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   222
  if defined props name then filter (\(a, _) -> a /= name) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   223
  else props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   224
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   225
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   226
generate_haskell_file "Markup.hs" = \<open>
69226
68f5dc2275ac tuned whitespace;
wenzelm
parents: 69225
diff changeset
   227
{-  Title:      Haskell/Tools/Markup.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   228
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   229
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   230
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   231
Quasi-abstract markup elements.
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   232
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   233
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   234
module Isabelle.Markup (
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   235
  T, empty, is_empty, properties,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   236
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   237
  nameN, name, xnameN, xname, kindN,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   238
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   239
  lineN, end_lineN, offsetN, end_offsetN, fileN, idN, positionN, position,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   240
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   241
  markupN, consistentN, unbreakableN, indentN, widthN,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   242
  blockN, block, breakN, break, fbreakN, fbreak, itemN, item,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   243
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   244
  wordsN, words, no_wordsN, no_words,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   245
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   246
  tfreeN, tfree, tvarN, tvar, freeN, free, skolemN, skolem, boundN, bound, varN, var,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   247
  numeralN, numeral, literalN, literal, delimiterN, delimiter, inner_stringN, inner_string,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   248
  inner_cartoucheN, inner_cartouche, inner_commentN, inner_comment,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   249
  token_rangeN, token_range,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   250
  sortingN, sorting, typingN, typing, class_parameterN, class_parameter,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   251
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   252
  antiquotedN, antiquoted, antiquoteN, antiquote,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   253
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   254
  paragraphN, paragraph, text_foldN, text_fold,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   255
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   256
  keyword1N, keyword1, keyword2N, keyword2, keyword3N, keyword3, quasi_keywordN, quasi_keyword,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   257
  improperN, improper, operatorN, operator, stringN, string, alt_stringN, alt_string,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   258
  verbatimN, verbatim, cartoucheN, cartouche, commentN, comment,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   259
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   260
  writelnN, writeln, stateN, state, informationN, information, tracingN, tracing,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   261
  warningN, warning, legacyN, legacy, errorN, error, reportN, report, no_reportN, no_report,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   262
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   263
  intensifyN, intensify,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   264
  Output, no_output)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   265
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   266
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   267
import Prelude hiding (words, error, break)
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   268
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   269
import Isabelle.Library
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   270
import qualified Isabelle.Properties as Properties
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   271
import qualified Isabelle.Value as Value
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   272
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   273
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   274
{- basic markup -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   275
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   276
type T = (String, Properties.T)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   277
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   278
empty :: T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   279
empty = ("", [])
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   280
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   281
is_empty :: T -> Bool
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   282
is_empty ("", _) = True
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   283
is_empty _ = False
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   284
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   285
properties :: Properties.T -> T -> T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   286
properties more_props (elem, props) =
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   287
  (elem, fold_rev Properties.put more_props props)
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   288
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   289
markup_elem name = (name, (name, []) :: T)
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   290
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   291
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   292
{- misc properties -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   293
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   294
nameN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   295
nameN = \<open>Markup.nameN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   296
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   297
name :: String -> T -> T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   298
name a = properties [(nameN, a)]
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   299
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   300
xnameN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   301
xnameN = \<open>Markup.xnameN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   302
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   303
xname :: String -> T -> T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   304
xname a = properties [(xnameN, a)]
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   305
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   306
kindN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   307
kindN = \<open>Markup.kindN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   308
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   309
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   310
{- position -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   311
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   312
lineN, end_lineN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   313
lineN = \<open>Markup.lineN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   314
end_lineN = \<open>Markup.end_lineN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   315
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   316
offsetN, end_offsetN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   317
offsetN = \<open>Markup.offsetN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   318
end_offsetN = \<open>Markup.end_offsetN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   319
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   320
fileN, idN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   321
fileN = \<open>Markup.fileN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   322
idN = \<open>Markup.idN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   323
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   324
positionN :: String; position :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   325
(positionN, position) = markup_elem \<open>Markup.positionN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   326
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   327
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   328
{- pretty printing -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   329
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   330
markupN, consistentN, unbreakableN, indentN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   331
markupN = \<open>Markup.markupN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   332
consistentN = \<open>Markup.consistentN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   333
unbreakableN = \<open>Markup.unbreakableN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   334
indentN = \<open>Markup.indentN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   335
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   336
widthN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   337
widthN = \<open>Markup.widthN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   338
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   339
blockN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   340
blockN = \<open>Markup.blockN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   341
block :: Bool -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   342
block c i =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   343
  (blockN,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   344
    (if c then [(consistentN, Value.print_bool c)] else []) ++
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   345
    (if i /= 0 then [(indentN, Value.print_int i)] else []))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   346
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   347
breakN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   348
breakN = \<open>Markup.breakN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   349
break :: Int -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   350
break w i =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   351
  (breakN,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   352
    (if w /= 0 then [(widthN, Value.print_int w)] else []) ++
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   353
    (if i /= 0 then [(indentN, Value.print_int i)] else []))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   354
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   355
fbreakN :: String; fbreak :: T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   356
(fbreakN, fbreak) = markup_elem \<open>Markup.fbreakN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   357
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   358
itemN :: String; item :: T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   359
(itemN, item) = markup_elem \<open>Markup.itemN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   360
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   361
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   362
{- text properties -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   363
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   364
wordsN :: String; words :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   365
(wordsN, words) = markup_elem \<open>Markup.wordsN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   366
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   367
no_wordsN :: String; no_words :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   368
(no_wordsN, no_words) = markup_elem \<open>Markup.no_wordsN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   369
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   370
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   371
{- inner syntax -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   372
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   373
tfreeN :: String; tfree :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   374
(tfreeN, tfree) = markup_elem \<open>Markup.tfreeN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   375
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   376
tvarN :: String; tvar :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   377
(tvarN, tvar) = markup_elem \<open>Markup.tvarN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   378
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   379
freeN :: String; free :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   380
(freeN, free) = markup_elem \<open>Markup.freeN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   381
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   382
skolemN :: String; skolem :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   383
(skolemN, skolem) = markup_elem \<open>Markup.skolemN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   384
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   385
boundN :: String; bound :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   386
(boundN, bound) = markup_elem \<open>Markup.boundN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   387
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   388
varN :: String; var :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   389
(varN, var) = markup_elem \<open>Markup.varN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   390
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   391
numeralN :: String; numeral :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   392
(numeralN, numeral) = markup_elem \<open>Markup.numeralN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   393
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   394
literalN :: String; literal :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   395
(literalN, literal) = markup_elem \<open>Markup.literalN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   396
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   397
delimiterN :: String; delimiter :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   398
(delimiterN, delimiter) = markup_elem \<open>Markup.delimiterN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   399
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   400
inner_stringN :: String; inner_string :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   401
(inner_stringN, inner_string) = markup_elem \<open>Markup.inner_stringN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   402
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   403
inner_cartoucheN :: String; inner_cartouche :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   404
(inner_cartoucheN, inner_cartouche) = markup_elem \<open>Markup.inner_cartoucheN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   405
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   406
inner_commentN :: String; inner_comment :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   407
(inner_commentN, inner_comment) = markup_elem \<open>Markup.inner_commentN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   408
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   409
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   410
token_rangeN :: String; token_range :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   411
(token_rangeN, token_range) = markup_elem \<open>Markup.token_rangeN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   412
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   413
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   414
sortingN :: String; sorting :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   415
(sortingN, sorting) = markup_elem \<open>Markup.sortingN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   416
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   417
typingN :: String; typing :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   418
(typingN, typing) = markup_elem \<open>Markup.typingN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   419
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   420
class_parameterN :: String; class_parameter :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   421
(class_parameterN, class_parameter) = markup_elem \<open>Markup.class_parameterN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   422
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   423
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   424
{- antiquotations -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   425
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   426
antiquotedN :: String; antiquoted :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   427
(antiquotedN, antiquoted) = markup_elem \<open>Markup.antiquotedN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   428
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   429
antiquoteN :: String; antiquote :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   430
(antiquoteN, antiquote) = markup_elem \<open>Markup.antiquoteN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   431
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   432
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   433
{- text structure -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   434
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   435
paragraphN :: String; paragraph :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   436
(paragraphN, paragraph) = markup_elem \<open>Markup.paragraphN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   437
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   438
text_foldN :: String; text_fold :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   439
(text_foldN, text_fold) = markup_elem \<open>Markup.text_foldN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   440
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   441
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   442
{- outer syntax -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   443
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   444
keyword1N :: String; keyword1 :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   445
(keyword1N, keyword1) = markup_elem \<open>Markup.keyword1N\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   446
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   447
keyword2N :: String; keyword2 :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   448
(keyword2N, keyword2) = markup_elem \<open>Markup.keyword2N\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   449
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   450
keyword3N :: String; keyword3 :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   451
(keyword3N, keyword3) = markup_elem \<open>Markup.keyword3N\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   452
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   453
quasi_keywordN :: String; quasi_keyword :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   454
(quasi_keywordN, quasi_keyword) = markup_elem \<open>Markup.quasi_keywordN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   455
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   456
improperN :: String; improper :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   457
(improperN, improper) = markup_elem \<open>Markup.improperN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   458
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   459
operatorN :: String; operator :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   460
(operatorN, operator) = markup_elem \<open>Markup.operatorN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   461
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   462
stringN :: String; string :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   463
(stringN, string) = markup_elem \<open>Markup.stringN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   464
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   465
alt_stringN :: String; alt_string :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   466
(alt_stringN, alt_string) = markup_elem \<open>Markup.alt_stringN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   467
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   468
verbatimN :: String; verbatim :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   469
(verbatimN, verbatim) = markup_elem \<open>Markup.verbatimN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   470
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   471
cartoucheN :: String; cartouche :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   472
(cartoucheN, cartouche) = markup_elem \<open>Markup.cartoucheN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   473
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   474
commentN :: String; comment :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   475
(commentN, comment) = markup_elem \<open>Markup.commentN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   476
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   477
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   478
{- messages -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   479
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   480
writelnN :: String; writeln :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   481
(writelnN, writeln) = markup_elem \<open>Markup.writelnN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   482
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   483
stateN :: String; state :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   484
(stateN, state) = markup_elem \<open>Markup.stateN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   485
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   486
informationN :: String; information :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   487
(informationN, information) = markup_elem \<open>Markup.informationN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   488
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   489
tracingN :: String; tracing :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   490
(tracingN, tracing) = markup_elem \<open>Markup.tracingN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   491
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   492
warningN :: String; warning :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   493
(warningN, warning) = markup_elem \<open>Markup.warningN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   494
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   495
legacyN :: String; legacy :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   496
(legacyN, legacy) = markup_elem \<open>Markup.legacyN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   497
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   498
errorN :: String; error :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   499
(errorN, error) = markup_elem \<open>Markup.errorN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   500
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   501
reportN :: String; report :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   502
(reportN, report) = markup_elem \<open>Markup.reportN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   503
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   504
no_reportN :: String; no_report :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   505
(no_reportN, no_report) = markup_elem \<open>Markup.no_reportN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   506
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   507
intensifyN :: String; intensify :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   508
(intensifyN, intensify) = markup_elem \<open>Markup.intensifyN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   509
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   510
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   511
{- output -}
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   512
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   513
type Output = (String, String)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   514
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   515
no_output :: Output
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   516
no_output = ("", "")
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
   517
\<close>
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
   518
69278
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   519
generate_haskell_file "File.hs" = \<open>
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   520
{-  Title:      Tools/Haskell/File.hs
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   521
    Author:     Makarius
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   522
    LICENSE:    BSD 3-clause (Isabelle)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   523
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   524
File-system operations
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   525
-}
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   526
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   527
module Isabelle.File (setup, read, write, append) where
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   528
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   529
import Prelude hiding (read)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   530
import System.IO (IO)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   531
import qualified System.IO as IO
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   532
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   533
setup :: IO.Handle -> IO ()
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   534
setup h = do
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   535
  IO.hSetEncoding h IO.utf8
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   536
  IO.hSetNewlineMode h IO.noNewlineTranslation
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   537
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   538
read :: IO.FilePath -> IO String
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   539
read path =
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   540
  IO.withFile path IO.ReadMode (\h ->
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   541
    do setup h; IO.hGetContents h >>= \s -> length s `seq` return s)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   542
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   543
write :: IO.FilePath -> String -> IO ()
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   544
write path s =
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   545
  IO.withFile path IO.WriteMode (\h -> do setup h; IO.hPutStr h s)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   546
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   547
append :: IO.FilePath -> String -> IO ()
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   548
append path s =
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   549
  IO.withFile path IO.AppendMode (\h -> do setup h; IO.hPutStr h s)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   550
\<close>
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   551
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   552
generate_haskell_file "XML.hs" = \<open>
69226
68f5dc2275ac tuned whitespace;
wenzelm
parents: 69225
diff changeset
   553
{-  Title:      Tools/Haskell/XML.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   554
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   555
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   556
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   557
Untyped XML trees and representation of ML values.
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   558
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   559
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   560
module Isabelle.XML (Attributes, Body, Tree(..), wrap_elem, unwrap_elem, content_of)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   561
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   562
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   563
import qualified Data.List as List
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   564
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   565
import Isabelle.Library
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   566
import qualified Isabelle.Properties as Properties
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   567
import qualified Isabelle.Markup as Markup
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   568
import qualified Isabelle.Buffer as Buffer
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   569
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   570
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   571
{- types -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   572
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   573
type Attributes = Properties.T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   574
type Body = [Tree]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   575
data Tree = Elem Markup.T Body | Text String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   576
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   577
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   578
{- wrapped elements -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   579
69236
wenzelm
parents: 69234
diff changeset
   580
wrap_elem (((a, atts), body1), body2) =
wenzelm
parents: 69234
diff changeset
   581
  Elem (\<open>XML.xml_elemN\<close>, (\<open>XML.xml_nameN\<close>, a) : atts) (Elem (\<open>XML.xml_bodyN\<close>, []) body1 : body2)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   582
69236
wenzelm
parents: 69234
diff changeset
   583
unwrap_elem
wenzelm
parents: 69234
diff changeset
   584
  (Elem (\<open>XML.xml_elemN\<close>, (\<open>XML.xml_nameN\<close>, a) : atts) (Elem (\<open>XML.xml_bodyN\<close>, []) body1 : body2)) =
wenzelm
parents: 69234
diff changeset
   585
  Just (((a, atts), body1), body2)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   586
unwrap_elem _ = Nothing
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   587
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   588
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   589
{- text content -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   590
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   591
add_content tree =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   592
  case unwrap_elem tree of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   593
    Just (_, ts) -> fold add_content ts
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   594
    Nothing ->
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   595
      case tree of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   596
        Elem _ ts -> fold add_content ts
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   597
        Text s -> Buffer.add s
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   598
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   599
content_of body = Buffer.empty |> fold add_content body |> Buffer.content
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   600
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   601
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   602
{- string representation -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   603
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   604
encode '<' = "&lt;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   605
encode '>' = "&gt;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   606
encode '&' = "&amp;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   607
encode '\'' = "&apos;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   608
encode '\"' = "&quot;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   609
encode c = [c]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   610
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   611
instance Show Tree where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   612
  show tree =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   613
    Buffer.empty |> show_tree tree |> Buffer.content
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   614
    where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   615
      show_tree (Elem (name, atts) []) =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   616
        Buffer.add "<" #> Buffer.add (show_elem name atts) #> Buffer.add "/>"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   617
      show_tree (Elem (name, atts) ts) =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   618
        Buffer.add "<" #> Buffer.add (show_elem name atts) #> Buffer.add ">" #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   619
        fold show_tree ts #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   620
        Buffer.add "</" #> Buffer.add name #> Buffer.add ">"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   621
      show_tree (Text s) = Buffer.add (show_text s)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   622
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   623
      show_elem name atts =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   624
        unwords (name : map (\(a, x) -> a ++ "=\"" ++ show_text x ++ "\"") atts)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   625
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   626
      show_text = concatMap encode
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   627
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   628
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   629
generate_haskell_file "XML/Encode.hs" = \<open>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   630
{-  Title:      Tools/Haskell/XML/Encode.hs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   631
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   632
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   633
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   634
XML as data representation language.
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   635
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   636
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   637
module Isabelle.XML.Encode (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   638
  A, T, V,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   639
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   640
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   641
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   642
  tree, properties, string, init, bool, unit, pair, triple, list, variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   643
)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   644
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   645
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   646
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   647
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   648
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   649
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   650
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   651
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   652
type A a = a -> String
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   653
type T a = a -> XML.Body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   654
type V a = a -> Maybe ([String], XML.Body)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   655
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   656
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   657
-- atomic values
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   658
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   659
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   660
int_atom = Value.print_int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   661
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   662
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   663
bool_atom False = "0"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   664
bool_atom True = "1"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   665
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   666
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   667
unit_atom () = ""
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   668
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   669
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   670
-- structural nodes
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   671
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   672
node = XML.Elem (":", [])
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   673
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   674
vector = map_index (\(i, x) -> (int_atom i, x))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   675
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   676
tagged (tag, (xs, ts)) = XML.Elem (int_atom tag, vector xs) ts
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   677
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   678
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   679
-- representation of standard types
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   680
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   681
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   682
tree t = [t]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   683
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   684
properties :: T Properties.T
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   685
properties props = [XML.Elem (":", props) []]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   686
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   687
string :: T String
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   688
string "" = []
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   689
string s = [XML.Text s]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   690
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   691
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   692
int = string . int_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   693
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   694
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   695
bool = string . bool_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   696
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   697
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   698
unit = string . unit_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   699
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   700
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   701
pair f g (x, y) = [node (f x), node (g y)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   702
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   703
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   704
triple f g h (x, y, z) = [node (f x), node (g y), node (h z)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   705
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   706
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   707
list f xs = map (node . f) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   708
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   709
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   710
variant fs x = [tagged (the (get_index (\f -> f x) fs))]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   711
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   712
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   713
generate_haskell_file "XML/Decode.hs" = \<open>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   714
{-  Title:      Tools/Haskell/XML/Decode.hs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   715
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   716
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   717
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   718
XML as data representation language.
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   719
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   720
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   721
module Isabelle.XML.Decode (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   722
  A, T, V,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   723
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   724
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   725
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   726
  tree, properties, string, init, bool, unit, pair, triple, list, variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   727
)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   728
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   729
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   730
import Data.List ((!!))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   731
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   732
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   733
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   734
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   735
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   736
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   737
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   738
type A a = String -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   739
type T a = XML.Body -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   740
type V a = ([String], XML.Body) -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   741
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   742
err_atom = error "Malformed XML atom"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   743
err_body = error "Malformed XML body"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   744
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   745
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   746
{- atomic values -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   747
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   748
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   749
int_atom s =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   750
  case Value.parse_int s of
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   751
    Just i -> i
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   752
    Nothing -> err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   753
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   754
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   755
bool_atom "0" = False
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   756
bool_atom "1" = True
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   757
bool_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   758
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   759
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   760
unit_atom "" = ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   761
unit_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   762
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   763
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   764
{- structural nodes -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   765
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   766
node (XML.Elem (":", []) ts) = ts
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   767
node _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   768
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   769
vector atts =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   770
  map_index (\(i, (a, x)) -> if int_atom a == i then x else err_atom) atts
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   771
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   772
tagged (XML.Elem (name, atts) ts) = (int_atom name, (vector atts, ts))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   773
tagged _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   774
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   775
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   776
{- representation of standard types -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   777
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   778
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   779
tree [t] = t
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   780
tree _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   781
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   782
properties :: T Properties.T
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   783
properties [XML.Elem (":", props) []] = props
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   784
properties _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   785
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   786
string :: T String
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   787
string [] = ""
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   788
string [XML.Text s] = s
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   789
string _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   790
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   791
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   792
int = int_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   793
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   794
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   795
bool = bool_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   796
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   797
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   798
unit = unit_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   799
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   800
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   801
pair f g [t1, t2] = (f (node t1), g (node t2))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   802
pair _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   803
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   804
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   805
triple f g h [t1, t2, t3] = (f (node t1), g (node t2), h (node t3))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   806
triple _ _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   807
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   808
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   809
list f ts = map (f . node) ts
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   810
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   811
option :: T a -> T (Maybe a)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   812
option _ [] = Nothing
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   813
option f [t] = Just (f (node t))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   814
option _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   815
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   816
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   817
variant fs [t] = (fs !! tag) (xs, ts)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   818
  where (tag, (xs, ts)) = tagged t
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   819
variant _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   820
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   821
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   822
generate_haskell_file "Pretty.hs" = \<open>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   823
{-  Title:      Tools/Haskell/Pretty.hs
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   824
    Author:     Makarius
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   825
    LICENSE:    BSD 3-clause (Isabelle)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   826
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   827
Generic pretty printing module.
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   828
-}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   829
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   830
module Isabelle.Pretty (
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   831
  T, symbolic, formatted, unformatted,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   832
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   833
  str, brk_indent, brk, fbrk, breaks, fbreaks, blk, block, strs, markup, mark, mark_str, marks_str,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   834
  item, text_fold, keyword1, keyword2, text, paragraph, para, quote, cartouche, separate,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   835
  commas, enclose, enum, list, str_list, big_list)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   836
where
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   837
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   838
import Isabelle.Library hiding (quote)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   839
import qualified Data.List as List
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   840
import qualified Isabelle.Buffer as Buffer
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   841
import qualified Isabelle.Markup as Markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   842
import qualified Isabelle.XML as XML
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   843
import qualified Isabelle.YXML as YXML
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   844
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   845
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   846
data T =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   847
    Block Markup.T Bool Int [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   848
  | Break Int Int
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   849
  | Str String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   850
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   851
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   852
{- output -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   853
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   854
output_spaces n = replicate n ' '
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   855
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   856
symbolic_text "" = []
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   857
symbolic_text s = [XML.Text s]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   858
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   859
symbolic_markup markup body =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   860
  if Markup.is_empty markup then body
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   861
  else [XML.Elem markup body]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   862
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   863
symbolic :: T -> XML.Body
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   864
symbolic (Block markup consistent indent prts) =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   865
  concatMap symbolic prts
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   866
  |> symbolic_markup block_markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   867
  |> symbolic_markup markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   868
  where block_markup = if null prts then Markup.empty else Markup.block consistent indent
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   869
symbolic (Break wd ind) = [XML.Elem (Markup.break wd ind) (symbolic_text (output_spaces wd))]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   870
symbolic (Str s) = symbolic_text s
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   871
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   872
formatted :: T -> String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   873
formatted = YXML.string_of_body . symbolic
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   874
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   875
unformatted :: T -> String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   876
unformatted prt = Buffer.empty |> out prt |> Buffer.content
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   877
  where
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   878
    out (Block markup _ _ prts) =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   879
      let (bg, en) = YXML.output_markup markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   880
      in Buffer.add bg #> fold out prts #> Buffer.add en
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   881
    out (Break _ wd) = Buffer.add (output_spaces wd)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   882
    out (Str s) = Buffer.add s
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   883
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   884
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   885
{- derived operations to create formatting expressions -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   886
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   887
force_nat n | n < 0 = 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   888
force_nat n = n
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   889
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   890
str :: String -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   891
str = Str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   892
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   893
brk_indent :: Int -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   894
brk_indent wd ind = Break (force_nat wd) ind
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   895
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   896
brk :: Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   897
brk wd = brk_indent wd 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   898
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   899
fbrk :: T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   900
fbrk = str "\n"
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   901
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   902
breaks, fbreaks :: [T] -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   903
breaks = List.intersperse (brk 1)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   904
fbreaks = List.intersperse fbrk
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   905
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   906
blk :: (Int, [T]) -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   907
blk (indent, es) = Block Markup.empty False (force_nat indent) es
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   908
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   909
block :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   910
block prts = blk (2, prts)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   911
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   912
strs :: [String] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   913
strs = block . breaks . map str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   914
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   915
markup :: Markup.T -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   916
markup m = Block m False 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   917
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   918
mark :: Markup.T -> T -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   919
mark m prt = if m == Markup.empty then prt else markup m [prt]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   920
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   921
mark_str :: (Markup.T, String) -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   922
mark_str (m, s) = mark m (str s)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   923
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   924
marks_str :: ([Markup.T], String) -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   925
marks_str (ms, s) = fold_rev mark ms (str s)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   926
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   927
item :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   928
item = markup Markup.item
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   929
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   930
text_fold :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   931
text_fold = markup Markup.text_fold
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   932
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   933
keyword1, keyword2 :: String -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   934
keyword1 name = mark_str (Markup.keyword1, name)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   935
keyword2 name = mark_str (Markup.keyword2, name)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   936
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   937
text :: String -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   938
text = breaks . map str . words
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   939
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   940
paragraph :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   941
paragraph = markup Markup.paragraph
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   942
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   943
para :: String -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   944
para = paragraph . text
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   945
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   946
quote :: T -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   947
quote prt = blk (1, [str "\"", prt, str "\""])
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   948
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   949
cartouche :: T -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   950
cartouche prt = blk (1, [str "\92<open>", prt, str "\92<close>"])
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   951
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   952
separate :: String -> [T] -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   953
separate sep = List.intercalate [str sep, brk 1] . map single
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   954
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   955
commas :: [T] -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   956
commas = separate ","
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   957
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   958
enclose :: String -> String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   959
enclose lpar rpar prts = block (str lpar : prts ++ [str rpar])
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   960
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   961
enum :: String -> String -> String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   962
enum sep lpar rpar = enclose lpar rpar . separate sep
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   963
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   964
list :: String -> String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   965
list = enum ","
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   966
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   967
str_list :: String -> String -> [String] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   968
str_list lpar rpar = list lpar rpar . map str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   969
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   970
big_list :: String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   971
big_list name prts = block (fbreaks (str name : prts))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   972
\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   973
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   974
generate_haskell_file "YXML.hs" = \<open>
69226
68f5dc2275ac tuned whitespace;
wenzelm
parents: 69225
diff changeset
   975
{-  Title:      Tools/Haskell/YXML.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   976
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   977
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   978
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   979
Efficient text representation of XML trees.  Suitable for direct
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   980
inlining into plain text.
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   981
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   982
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   983
module Isabelle.YXML (charX, charY, strX, strY, detect, output_markup,
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   984
  buffer_body, buffer, string_of_body, string_of, parse_body, parse)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   985
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   986
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   987
import qualified Data.Char as Char
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   988
import qualified Data.List as List
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
   989
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   990
import Isabelle.Library
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   991
import qualified Isabelle.Markup as Markup
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   992
import qualified Isabelle.XML as XML
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   993
import qualified Isabelle.Buffer as Buffer
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   994
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   995
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   996
{- markers -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   997
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   998
charX, charY :: Char
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   999
charX = Char.chr 5
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1000
charY = Char.chr 6
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1001
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1002
strX, strY, strXY, strXYX :: String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1003
strX = [charX]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1004
strY = [charY]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1005
strXY = strX ++ strY
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1006
strXYX = strXY ++ strX
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1007
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1008
detect :: String -> Bool
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1009
detect = any (\c -> c == charX || c == charY)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1010
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1011
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1012
{- output -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1013
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1014
output_markup :: Markup.T -> Markup.Output
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1015
output_markup markup@(name, atts) =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1016
  if Markup.is_empty markup then Markup.no_output
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1017
  else (strXY ++ name ++ concatMap (\(a, x) -> strY ++ a ++ "=" ++ x) atts ++ strX, strXYX)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1018
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1019
buffer_attrib (a, x) =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1020
  Buffer.add strY #> Buffer.add a #> Buffer.add "=" #> Buffer.add x
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1021
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1022
buffer_body :: XML.Body -> Buffer.T -> Buffer.T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1023
buffer_body = fold buffer
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1024
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1025
buffer :: XML.Tree -> Buffer.T -> Buffer.T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1026
buffer (XML.Elem (name, atts) ts) =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1027
  Buffer.add strXY #> Buffer.add name #> fold buffer_attrib atts #> Buffer.add strX #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1028
  buffer_body ts #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1029
  Buffer.add strXYX
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1030
buffer (XML.Text s) = Buffer.add s
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1031
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1032
string_of_body :: XML.Body -> String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1033
string_of_body body = Buffer.empty |> buffer_body body |> Buffer.content
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1034
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1035
string_of :: XML.Tree -> String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1036
string_of = string_of_body . single
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1037
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1038
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1039
{- parse -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1040
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1041
-- split: fields or non-empty tokens
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1042
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1043
split :: Bool -> Char -> String -> [String]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1044
split _ _ [] = []
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1045
split fields sep str = splitting str
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1046
  where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1047
    splitting rest =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1048
      case span (/= sep) rest of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1049
        (_, []) -> cons rest []
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1050
        (prfx, _ : rest') -> cons prfx (splitting rest')
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1051
    cons item = if fields || not (null item) then (:) item else id
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1052
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1053
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1054
-- structural errors
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1055
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1056
err msg = error ("Malformed YXML: " ++ msg)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1057
err_attribute = err "bad attribute"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1058
err_element = err "bad element"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1059
err_unbalanced "" = err "unbalanced element"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1060
err_unbalanced name = err ("unbalanced element " ++ quote name)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1061
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1062
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1063
-- stack operations
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1064
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1065
add x ((elem, body) : pending) = (elem, x : body) : pending
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1066
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1067
push "" _ _ = err_element
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1068
push name atts pending = ((name, atts), []) : pending
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1069
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1070
pop ((("", _), _) : _) = err_unbalanced ""
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1071
pop ((markup, body) : pending) = add (XML.Elem markup (reverse body)) pending
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1072
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1073
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1074
-- parsing
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1075
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1076
parse_attrib s =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1077
  case List.elemIndex '=' s of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1078
    Just i | i > 0 -> (take i s, drop (i + 1) s)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1079
    _ -> err_attribute
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1080
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1081
parse_chunk ["", ""] = pop
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1082
parse_chunk ("" : name : atts) = push name (map parse_attrib atts)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1083
parse_chunk txts = fold (add . XML.Text) txts
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1084
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1085
parse_body :: String -> XML.Body
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1086
parse_body source =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1087
  case fold parse_chunk chunks [(("", []), [])] of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1088
    [(("", _), result)] -> reverse result
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1089
    ((name, _), _) : _ -> err_unbalanced name
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1090
  where chunks = split False charX source |> map (split True charY)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1091
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1092
parse :: String -> XML.Tree
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1093
parse source =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1094
  case parse_body source of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1095
    [result] -> result
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1096
    [] -> XML.Text ""
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1097
    _ -> err "multiple results"
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
  1098
\<close>
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
  1099
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1100
generate_haskell_file "Term.hs" = \<open>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1101
{-  Title:      Tools/Haskell/Term.hs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1102
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1103
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1104
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1105
Lambda terms, types, sorts.
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1106
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1107
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1108
module Isabelle.Term (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1109
  Indexname,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1110
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1111
  Sort, dummyS,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1112
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1113
  Typ(..), dummyT, Term(..))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1114
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1115
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1116
type Indexname = (String, Int)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1117
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1118
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1119
type Sort = [String]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1120
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1121
dummyS :: Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1122
dummyS = [""]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1123
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1124
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1125
data Typ =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1126
    Type (String, [Typ])
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1127
  | TFree (String, Sort)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1128
  | TVar (Indexname, Sort)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1129
  deriving Show
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1130
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1131
dummyT :: Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1132
dummyT = Type (\<open>\<^type_name>\<open>dummy\<close>\<close>, [])
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1133
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1134
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1135
data Term =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1136
    Const (String, Typ)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1137
  | Free (String, Typ)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1138
  | Var (Indexname, Typ)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1139
  | Bound Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1140
  | Abs (String, Typ, Term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1141
  | App (Term, Term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1142
  deriving Show
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1143
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1144
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1145
generate_haskell_file "Term_XML/Encode.hs" = \<open>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1146
{-  Title:      Tools/Haskell/Term_XML/Encode.hs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1147
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1148
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1149
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1150
XML data representation of lambda terms.
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1151
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1152
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1153
{-# LANGUAGE LambdaCase #-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1154
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1155
module Isabelle.Term_XML.Encode (sort, typ, term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1156
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1157
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1158
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1159
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1160
import Isabelle.XML.Encode
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1161
import Isabelle.Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1162
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1163
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1164
sort :: T Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1165
sort = list string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1166
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1167
typ :: T Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1168
typ ty =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1169
  ty |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1170
   [\case { Type (a, b) -> Just ([a], list typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1171
    \case { TFree (a, b) -> Just ([a], sort b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1172
    \case { TVar ((a, b), c) -> Just ([a, int_atom b], sort c); _ -> Nothing }]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1173
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1174
term :: T Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1175
term t =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1176
  t |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1177
   [\case { Const (a, b) -> Just ([a], typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1178
    \case { Free (a, b) -> Just ([a], typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1179
    \case { Var ((a, b), c) -> Just ([a, int_atom b], typ c); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1180
    \case { Bound a -> Just ([int_atom a], []); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1181
    \case { Abs (a, b, c) -> Just ([a], pair typ term (b, c)); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1182
    \case { App a -> Just ([], pair term term a); _ -> Nothing }]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1183
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1184
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1185
generate_haskell_file "Term_XML/Decode.hs" = \<open>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1186
{-  Title:      Tools/Haskell/Term_XML/Decode.hs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1187
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1188
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1189
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1190
XML data representation of lambda terms.
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1191
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1192
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1193
module Isabelle.Term_XML.Decode (sort, typ, term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1194
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1195
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1196
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1197
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1198
import Isabelle.XML.Decode
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1199
import Isabelle.Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1200
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1201
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1202
sort :: T Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1203
sort = list string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1204
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1205
typ :: T Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1206
typ ty =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1207
  ty |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1208
  [\([a], b) -> Type (a, list typ b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1209
   \([a], b) -> TFree (a, sort b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1210
   \([a, b], c) -> TVar ((a, int_atom b), sort c)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1211
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1212
term :: T Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1213
term t =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1214
  t |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1215
   [\([a], b) -> Const (a, typ b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1216
    \([a], b) -> Free (a, typ b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1217
    \([a, b], c) -> Var ((a, int_atom b), typ c),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1218
    \([a], []) -> Bound (int_atom a),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1219
    \([a], b) -> let (c, d) = pair typ term b in Abs (a, c, d),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1220
    \([], a) -> App (pair term term a)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1221
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1222
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
  1223
end