summaryrefslogtreecommitdiff
path: root/src/PGF/CId.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/PGF/CId.hs')
-rw-r--r--src/PGF/CId.hs33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/PGF/CId.hs b/src/PGF/CId.hs
index 161529308..99325975e 100644
--- a/src/PGF/CId.hs
+++ b/src/PGF/CId.hs
@@ -1,10 +1,17 @@
-module PGF.CId (CId(..), wildCId, mkCId, prCId) where
+module PGF.CId (CId(..),
+ mkCId, readCId, prCId,
+ wildCId,
+ pCId, pIdent) where
+
+import Control.Monad
+import qualified Data.ByteString.Char8 as BS
+import Data.Char
+import qualified Text.ParserCombinators.ReadP as RP
-import Data.ByteString.Char8 as BS
-- | An abstract data type that represents
-- function identifier in PGF.
-newtype CId = CId BS.ByteString deriving (Eq,Ord,Show)
+newtype CId = CId BS.ByteString deriving (Eq,Ord)
wildCId :: CId
wildCId = CId (BS.singleton '_')
@@ -13,6 +20,26 @@ wildCId = CId (BS.singleton '_')
mkCId :: String -> CId
mkCId s = CId (BS.pack s)
+readCId :: String -> Maybe CId
+readCId s = case [x | (x,cs) <- RP.readP_to_S pCId s, all isSpace cs] of
+ [x] -> Just x
+ _ -> Nothing
+
-- | Renders the identifier as 'String'
prCId :: CId -> String
prCId (CId x) = BS.unpack x
+
+instance Show CId where
+ showsPrec _ = showString . prCId
+
+instance Read CId where
+ readsPrec _ = RP.readP_to_S pCId
+
+pCId :: RP.ReadP CId
+pCId = fmap mkCId pIdent
+
+pIdent :: RP.ReadP String
+pIdent = liftM2 (:) (RP.satisfy isIdentFirst) (RP.munch isIdentRest)
+ where
+ isIdentFirst c = c == '_' || isLetter c
+ isIdentRest c = c == '_' || c == '\'' || isAlphaNum c \ No newline at end of file