GlobalAnnotations.hs revision 1a38107941725211e7c3f051f7a8f5e12199f03a
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder{-# LANGUAGE DeriveDataTypeable #-}
c63ebf815c8a874525cf18670ad74847f7fc7b26Christian Maeder{- |
456238178f89e5a3de2988ee6c8af924297d52d9Christian MaederModule : $Header$
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederDescription : data structures for global annotations
456238178f89e5a3de2988ee6c8af924297d52d9Christian MaederCopyright : (c) Klaus Luettich, Christian Maeder and Uni Bremen 2002-2006
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederLicense : GPLv2 or higher, see LICENSE.txt
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederMaintainer : Christian.Maeder@dfki.de
43b4c41fbb07705c9df321221ab9cb9832460407Christian MaederStability : experimental
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederPortability : portable
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian MaederData structures for global annotations
c9a7e6af169a2adfb92f42331cd578065ed83a2bChristian Maeder-}
c9a7e6af169a2adfb92f42331cd578065ed83a2bChristian Maeder
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maedermodule Common.GlobalAnnotations where
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport Data.Data
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified Data.Map as Map
a1ed34933c266ce85066acb0d7b20c90cb8eb213Christian Maeder
c0c2380bced8159ff0297ece14eba948bd236471Christian Maederimport qualified Common.Lib.Rel as Rel
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettichimport Common.AS_Annotation
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian Maederimport Common.Id
ad270004874ce1d0697fb30d7309f180553bb315Christian Maederimport Common.IRI (IRI)
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | all global annotations and a field for pretty printing stuff
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maederdata GlobalAnnos = GA
3e8b136f23ed57d40ee617f49bcac37830b58cabChristian Maeder { prec_annos :: PrecedenceGraph -- ^ precedences
ef9e8535c168d3f774d9e74368a2317a9eda5826Christian Maeder , assoc_annos :: AssocMap -- ^ associativity
bab2d88d650448628730ed3b65c9f99c52500e8cChristian Maeder , display_annos :: DisplayMap -- ^ display annotations
3e8b136f23ed57d40ee617f49bcac37830b58cabChristian Maeder , literal_annos :: LiteralAnnos -- ^ literal annotations
ef9e8535c168d3f774d9e74368a2317a9eda5826Christian Maeder , literal_map :: LiteralMap -- ^ redundant literal map
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder , prefix_map :: PrefixMap -- ^ abbreviated IRI prefixes
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder } deriving (Show, Eq, Typeable, Data)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder-- | empty (or initial) global annotations
3dde4051c307b609159a097f08a05108fdd036efJonathan von SchroederemptyGlobalAnnos :: GlobalAnnos
3dde4051c307b609159a097f08a05108fdd036efJonathan von SchroederemptyGlobalAnnos = GA
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder { prec_annos = Rel.empty
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder , assoc_annos = Map.empty
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder , display_annos = Map.empty
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder , literal_annos = emptyLiteralAnnos
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder , literal_map = Map.empty
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder , prefix_map = Map.empty }
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder-- | literal annotations for string, lists, number and floating
825a1e4ca1e768de4b4883c65a6cb1dce6aa0002Christian Maederdata LiteralAnnos = LA
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder { string_lit :: Maybe (Id, Id)
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder , list_lit :: Map.Map Id (Id, Id)
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder , number_lit :: Maybe Id
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder , float_lit :: Maybe (Id, Id)
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder } deriving (Show, Eq, Typeable, Data)
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder-- | empty literal annotations
456238178f89e5a3de2988ee6c8af924297d52d9Christian MaederemptyLiteralAnnos :: LiteralAnnos
4b4a0b61b72cf8478a5d4d5002bca9f699401363Christian MaederemptyLiteralAnnos = LA
4b4a0b61b72cf8478a5d4d5002bca9f699401363Christian Maeder { string_lit = Nothing
308834907a120fd8771e18292ed2ca9cd767c12dChristian Maeder , list_lit = Map.empty
bab2d88d650448628730ed3b65c9f99c52500e8cChristian Maeder , number_lit = Nothing
9f226cec9f978edaba67aee4c4e04e3d3b994b87Daniel Calegari , float_lit = Nothing }
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder
6a2dad705deefd1b7a7e09b84fd2d75f2213be47Christian Maeder-- | ids to be displayed according to a format
a7c27282e71cf4505026645f96d4f5cb8a284e32Christian Maedertype DisplayMap = Map.Map Id (Map.Map Display_format [Token])
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder
014dc30f64ec25e4790cca987d4d1e6635430510Christian Maeder-- | a redundant map for 'LiteralAnnos'
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettichtype LiteralMap = Map.Map Id LiteralType
6aea82c63ba1d2efc0329bc784a14e521469ec20Christian Maeder
4ba08bfca0cc8d9da65397b8dfd2654fdb4c0e62Christian Maeder-- | a map for expansion of abbreviated/simple IRI to full IRI
feca1d35123d8c31aee238c9ce79947b0bf65494Christian Maedertype PrefixMap = Map.Map String IRI
431d34c7007a787331c4e5ec997badb0f8190fc7Christian Maeder
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder-- | description of the type of a literal for a given 'Id' in 'LiteralMap'
f5c0884429b01e74c6e658ded921fb2e16dfb478Christian Maederdata LiteralType =
db675e8302ddb0d6528088ce68f5e98a00e890e3Christian Maeder StringCons Id -- ^ refer to the 'Id' of the null string
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder | StringNull
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder | ListCons Id Id -- ^ brackets (as 'Id') and 'Id' of matching empty list
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder | ListNull Id -- ^ brackets (as 'Id') for the empty list
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder | Number
23ffcc44ca8612feccbd8fda63fa5be7ab5f9dc3Christian Maeder | Fraction
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder | Floating
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder | NoLiteral -- ^ and error value for a 'getLiteralType'
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder deriving (Show, Eq, Typeable, Data)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | the 'LiteralType' of an 'Id' (possibly 'NoLiteral')
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedergetLiteralType :: GlobalAnnos -> Id -> LiteralType
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedergetLiteralType ga i =
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder Map.findWithDefault NoLiteral i $ literal_map ga
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder-- | a map of associative ids
a3c6d8e0670bf2aa71bc8e2a3b1f45d56dd65e4cChristian Maedertype AssocMap = Map.Map Id AssocEither
dc679edd4ca027663212afdf00926ae2ce19b555Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | check if 'Id' has a given associativity
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederisAssoc :: AssocEither -> AssocMap -> Id -> Bool
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederisAssoc ae amap i =
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder case Map.lookup i amap of
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Nothing -> False
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Just ae' -> ae' == ae
4017ebc0f692820736d796af3110c3b3018c108aChristian Maeder
b568982efd0997d877286faa592d81b03c8c67b8Christian Maeder-- | a binary relation over ids as precedence graph
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maedertype PrecedenceGraph = Rel.Rel Id
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder-- | return precedence relation of two ids
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederprecRel :: PrecedenceGraph -- ^ Graph describing the precedences
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Id -- ^ x oID (y iid z) -- outer id
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Id -- ^ x oid (y iID z) -- inner id
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder -> PrecRel
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder{- a 'Lower' corresponds to %prec {out_id} < {in_id}
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaederBothDirections means <> was given (or derived by transitive closure) -}
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaederprecRel pg out_id in_id =
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder case (Rel.member in_id out_id pg, Rel.member out_id in_id pg) of
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder (False, True) -> Lower
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder (True, False) -> Higher
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder (True, True) -> BothDirections
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder (False, False) -> NoDirection
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder-- | lookup of an display [string] in the GlobalAnnos record
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederlookupDisplay :: GlobalAnnos -> Display_format -> Id -> Maybe [Token]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederlookupDisplay ga df i = case Map.lookup i (display_annos ga) of
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Nothing -> Nothing
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Just df_map -> case Map.lookup df df_map of
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Nothing -> Nothing
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder r@(Just disp_toks) -> if null disp_toks then Nothing else r
3e8b136f23ed57d40ee617f49bcac37830b58cabChristian Maeder