Lexer.hs revision 2eb84fc82d3ffa9116bc471fda3742bd9e5a24bb
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder
c63ebf815c8a874525cf18670ad74847f7fc7b26Christian Maeder{- HetCATS/CASL/Lexer.hs
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder $Id$
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder Authors: Christian Maeder
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder Year: 2002
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder scanner for CASL tokens and extensions to parsec
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder http://www.cs.uu.nl/~daan/parsec.html)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder -- extended with "consumeNothing"
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder http://www.cofi.info/Documents/CASL/Summary/
c9a7e6af169a2adfb92f42331cd578065ed83a2bChristian Maeder from 25 March 2001
c9a7e6af169a2adfb92f42331cd578065ed83a2bChristian Maeder C.4 Lexical Syntax
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder-}
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maedermodule Common.Lexer where
a1ed34933c266ce85066acb0d7b20c90cb8eb213Christian Maeder
c0c2380bced8159ff0297ece14eba948bd236471Christian Maederimport Data.Char (digitToInt)
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettichimport Common.Id (Token(..), place)
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian Maederimport Control.Monad (MonadPlus (mplus), liftM2)
ad270004874ce1d0697fb30d7309f180553bb315Christian Maederimport Common.Lib.Parsec
4d56f2fa72e4aec20eb827c11ed49c8cbb7014bdChristian Maeder
4cb215739e9ab13447fa21162482ebe485b47455Christian Maeder-- ----------------------------------------------
8ef75f1cc0437656bf622cec5ac9e8ea221da8f2Christian Maeder-- no-bracket-signs
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich-- ----------------------------------------------
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedersignChars :: String
74eed04be26f549d2f7ca35c370e1c03879b28b1Christian MaedersignChars = "!#$&*+-./:<=>?@\\^|~" ++ "�����������������"
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
3e8b136f23ed57d40ee617f49bcac37830b58cabChristian Maeder-- "\161\162\163\167\169\172\176\177\178\179\181\182\183\185\191\215\247"
ef9e8535c168d3f774d9e74368a2317a9eda5826Christian Maeder-- \172 neg \183 middle dot \215 times
3e8b136f23ed57d40ee617f49bcac37830b58cabChristian Maeder
ef9e8535c168d3f774d9e74368a2317a9eda5826Christian MaederscanAnySigns :: GenParser Char st String
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederscanAnySigns = many1 (oneOf signChars <?> "casl sign") <?> "signs"
e593b89bfd4952698dc37feced21cefe869d87a2Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- ----------------------------------------------
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder-- casl letters
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maeder-- ----------------------------------------------
1aee4aaddde105264c1faf394d88e302c05094ffChristian MaedercaslLetters :: String
1aee4aaddde105264c1faf394d88e302c05094ffChristian MaedercaslLetters = ['A'..'Z'] ++ ['a'..'z'] ++
51d769d55d88dfa88bdf54bee78d8fa85a2deba8Christian Maeder "����������������������������������������������������������"
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maeder-- see http://www.htmlhelp.com/reference/charset/ starting from \192
51d769d55d88dfa88bdf54bee78d8fa85a2deba8Christian Maeder-- \208 ETH \215 times \222 THORN \240 eth \247 divide \254 thorn
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
1aee4aaddde105264c1faf394d88e302c05094ffChristian MaedercaslLetter :: GenParser Char st Char
c3053d57f642ca507cdf79512e604437c4546cb9Christian MaedercaslLetter = oneOf caslLetters <?> "casl letter"
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maederprime :: GenParser Char st Char
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maederprime = char '\'' -- also used for quoted chars
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder
05a62e84edac8c64de04f8349dee418598d216b9Christian MaederscanLPD :: GenParser Char st Char
1cd4f6541984962658add5cfaa9f28a93879881bChristian MaederscanLPD = caslLetter <|> digit <|> prime <?> "casl char"
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder-- ----------------------------------------------
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder-- Monad/Functor extensions
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder-- ----------------------------------------------
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maederbind :: (Monad m) => (a -> b -> c) -> m a -> m b -> m c
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maederbind f p q = do { x <- p; y <- q; return (f x y) }
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
d54cd08a4cfa26256c38d8ed12c343adbfe1a0e3Christian Maederinfixl <<
23b4e542dca35852f58d1fb3f7d9078c1de5ab06Christian Maeder
b5da047a9a875dec3f968b6c0df96af326f90fa9Alexis Tsogias(<<) :: (Monad m) => m a -> m b -> m a
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder(<<) = bind const
6a2dad705deefd1b7a7e09b84fd2d75f2213be47Christian Maeder
a7c27282e71cf4505026645f96d4f5cb8a284e32Christian Maederinfixr 5 <:>
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder
014dc30f64ec25e4790cca987d4d1e6635430510Christian Maeder(<:>) :: (Monad m) => m a -> m [a] -> m [a]
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich(<:>) = liftM2 (:)
6aea82c63ba1d2efc0329bc784a14e521469ec20Christian Maeder
4ba08bfca0cc8d9da65397b8dfd2654fdb4c0e62Christian Maederinfixr 5 <++>
feca1d35123d8c31aee238c9ce79947b0bf65494Christian Maeder
431d34c7007a787331c4e5ec997badb0f8190fc7Christian Maeder(<++>) :: (Monad m, MonadPlus p) => m (p a) -> m (p a) -> m (p a)
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder(<++>) = liftM2 mplus
2a2c652d2445d76e28ca75da2a5392f8cf870820Christian Maeder
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder-- Functor extension
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maedersingle :: (Functor f, Monad m) => f a -> f (m a)
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maedersingle = fmap return
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder
23ffcc44ca8612feccbd8fda63fa5be7ab5f9dc3Christian Maederflat :: (Functor f) => f [[a]] -> f [a]
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maederflat = fmap concat
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- ----------------------------------------------
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- ParsecCombinator extension
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- ----------------------------------------------
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederfollowedWith :: GenParser tok st a -> GenParser tok st b -> GenParser tok st a
9e748851c150e1022fb952bab3315e869aaf0214Christian Maederp `followedWith` q = try (p << lookAhead q)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederbegDoEnd :: (Monad f, Functor f) => f a -> f [a] -> f a -> f [a]
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederbegDoEnd open p close = open <:> p <++> single close
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederenclosedBy :: (Monad f, Functor f) => f [a] -> f a -> f [a]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederp `enclosedBy` q = begDoEnd q p q
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
a5e5b8c3e5c11177e5034ef2423813a5d28979edChristian MaedercheckWith :: (Show a) => GenParser tok st a -> (a -> Bool)
bc8cbf12aa172bf5673b92a9e7a0151d4aa4c315Christian Maeder -> GenParser tok st a
2d130d212db7208777ca896a7ecad619a8944971Christian Maederp `checkWith` f = do x <- p
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder if f x then return x else
51d769d55d88dfa88bdf54bee78d8fa85a2deba8Christian Maeder consumeNothing >> unexpected (show x)
a5e5b8c3e5c11177e5034ef2423813a5d28979edChristian Maeder
a42fbfe7becf0eae2d624123eb0db73a794593f0Christian MaederseparatedBy :: GenParser tok st a -> GenParser tok st b
a42fbfe7becf0eae2d624123eb0db73a794593f0Christian Maeder -> GenParser tok st ([a], [b])
b363eb04791e7f735633b9b4088502c2bc50ebfcChristian Maederp `separatedBy` s = do r <- p
a42fbfe7becf0eae2d624123eb0db73a794593f0Christian Maeder option ([r], [])
1cd4f6541984962658add5cfaa9f28a93879881bChristian Maeder (do t <- s
1cd4f6541984962658add5cfaa9f28a93879881bChristian Maeder (es, ts) <- separatedBy p s
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder return (r:es, t:ts))
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder-- ----------------------------------------------
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder-- casl words
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder-- ----------------------------------------------
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
4017ebc0f692820736d796af3110c3b3018c108aChristian MaederscanLetterWord :: GenParser Char st String
a9b59eb2ce961014974276cdae0e9df4419bd212Christian MaederscanLetterWord = caslLetter <:> many scanLPD <?> "letter word"
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedersingleUnderline :: GenParser Char st Char
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedersingleUnderline = char '_' `followedWith` scanLPD
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederscanUnderlineWord :: GenParser Char st String
a3c6d8e0670bf2aa71bc8e2a3b1f45d56dd65e4cChristian MaederscanUnderlineWord = singleUnderline <:> many1 scanLPD <?> "underline word"
dc679edd4ca027663212afdf00926ae2ce19b555Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederscanAnyWords, casl_words :: GenParser Char st String
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederscanAnyWords = flat (scanLetterWord <:> many scanUnderlineWord) <?> "words"
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maedercasl_words = scanAnyWords
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederscanDot :: GenParser Char st Char
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederscanDot = char '.' `followedWith` caslLetter
4017ebc0f692820736d796af3110c3b3018c108aChristian Maeder
b568982efd0997d877286faa592d81b03c8c67b8Christian MaederscanDotWords :: GenParser Char st String
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederscanDotWords = scanDot <:> scanAnyWords <?> "dot-words"
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder-- ----------------------------------------------
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- casl escape chars for quoted chars and literal strings
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- ----------------------------------------------
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder-- see ParsecToken.number
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maedervalue :: Int -> String -> Int
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maedervalue base s = foldl (\x d -> base*x + (digitToInt d)) 0 s
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaedersimpleEscape :: GenParser Char st String
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaedersimpleEscape = single (oneOf "'\"\\ntrvbfa?")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederdecEscape :: GenParser Char st String
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederdecEscape = count 3 digit `checkWith` \s -> value 10 s <= 255
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederhexEscape :: GenParser Char st String
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederhexEscape = char 'x' <:> count 2 hexDigit -- cannot be too big
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederoctEscape :: GenParser Char st String
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederoctEscape = char 'o' <:>
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder count 3 octDigit `checkWith` \s -> value 8 s <= 255
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
3e8b136f23ed57d40ee617f49bcac37830b58cabChristian MaederescapeChar :: GenParser Char st String
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian MaederescapeChar = char '\\' <:>
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder (simpleEscape <|> decEscape <|> hexEscape <|> octEscape)
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder
e6d5dbbc3308f05197868806e0b860f4f53875f1Christian Maeder-- ----------------------------------------------
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder-- chars for quoted chars and literal strings
e4f4d096e5e6d60dd91c746d0e833d0ac7a29c50Christian Maeder-- ----------------------------------------------
eb74267cf39e4e95f9eeb5c765f4c8dac33971b4Christian Maeder
eb74267cf39e4e95f9eeb5c765f4c8dac33971b4Christian Maederprintable :: GenParser Char st String
e4f4d096e5e6d60dd91c746d0e833d0ac7a29c50Christian Maederprintable = single (satisfy (\c -> (c /= '\'') && (c /= '"')
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder && (c /= '\\') && (c > '\026')))
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian MaedercaslChar :: GenParser Char st String
8d178ae08a52d61379e6b8074f61646499bc88bbChristian MaedercaslChar = escapeChar <|> printable
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
6cd33d6101fb1b93baa6d86fac158af18a115108Christian MaederscanQuotedChar :: GenParser Char st String
6cd33d6101fb1b93baa6d86fac158af18a115108Christian MaederscanQuotedChar = (caslChar <|> (char '"' >> return "\\\""))
6cd33d6101fb1b93baa6d86fac158af18a115108Christian Maeder `enclosedBy` prime <?> "quoted char"
6cd33d6101fb1b93baa6d86fac158af18a115108Christian Maeder
6cd33d6101fb1b93baa6d86fac158af18a115108Christian Maeder-- convert '"' to '\"' and "'" to "\'" (no support for ''')
b2ac5a92cf36382e8deea5661c1964566caf72b3Christian Maeder
59138b404f12352d103eeffbeaeb3957b90e75fdChristian MaederscanString :: GenParser Char st String
b2ac5a92cf36382e8deea5661c1964566caf72b3Christian MaederscanString = flat (many (caslChar <|> (char '\'' >> return "\\\'")))
b2ac5a92cf36382e8deea5661c1964566caf72b3Christian Maeder `enclosedBy` char '"' <?> "literal string"
6cd33d6101fb1b93baa6d86fac158af18a115108Christian Maeder
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder-- ----------------------------------------------
10883d13973c46cac98964b66ace7a52b2d059abChristian Maeder-- digit, number, fraction, float
c9a7e6af169a2adfb92f42331cd578065ed83a2bChristian Maeder-- ----------------------------------------------
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
456238178f89e5a3de2988ee6c8af924297d52d9Christian MaedergetNumber :: GenParser Char st String
0e5b095a19790411e5352fa7cf57cb0388e70472Christian MaedergetNumber = many1 digit
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederscanFloat :: GenParser Char st String
f1a913f880e409e7327b5deae95738b5448379a1Christian MaederscanFloat = getNumber <++> (option ""
f1a913f880e409e7327b5deae95738b5448379a1Christian Maeder (char '.' <:> getNumber)
f1a913f880e409e7327b5deae95738b5448379a1Christian Maeder <++> option ""
f1a913f880e409e7327b5deae95738b5448379a1Christian Maeder (char 'E' <:> option "" (single (oneOf "+-"))
f1a913f880e409e7327b5deae95738b5448379a1Christian Maeder <++> getNumber))
c9a7e6af169a2adfb92f42331cd578065ed83a2bChristian Maeder
456238178f89e5a3de2988ee6c8af924297d52d9Christian MaederscanDigit :: GenParser Char st String
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederscanDigit = single digit
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
93f5b72fdb9ee734caa750b43dd79bbb590dcd73Christian Maeder-- ----------------------------------------------
93f5b72fdb9ee734caa750b43dd79bbb590dcd73Christian Maeder-- nested comment outs
93f5b72fdb9ee734caa750b43dd79bbb590dcd73Christian Maeder-- ----------------------------------------------
93f5b72fdb9ee734caa750b43dd79bbb590dcd73Christian Maeder
328a85c807f2a95c3f147d10b05927eaf862ebebChristian MaedernotEndText :: Char -> GenParser Char st Char
a6db617ca58eb6a0587b6366e913107dfecb71b5Heng JiangnotEndText c = try (char c << notFollowedBy (char '%'))
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett
254df6f22d01eacf7c57b85729e0445747b630d9Christian MaedernestCommentOut :: GenParser Char st Char
4ba08bfca0cc8d9da65397b8dfd2654fdb4c0e62Christian MaedernestCommentOut = try (string "%[") >>
bff4b3f816be4c1e1d8ded76f1d5af786839e1a9Christian Maeder many (noneOf "]%"
5b818f10e11fc79def1fdd5c8a080d64a6438d87Christian Maeder <|> notEndText ']'
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers <|> nestCommentOut
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder <|> char '%')
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maeder >> char ']' >> char '%'
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- ----------------------------------------------
d6697ad2479099b816203fd2c36f593c72c73c76Christian Maeder-- skip whitespaces and nested comment out
54ea981a0503c396c2923a1c06421c6235baf27fChristian Maeder-- ----------------------------------------------
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maeder
3e8b136f23ed57d40ee617f49bcac37830b58cabChristian MaederwhiteChars :: String
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix ReckerswhiteChars = "\n\r\t\v\f \160" -- non breaking space
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
9e748851c150e1022fb952bab3315e869aaf0214Christian Maederskip, whiteSpace :: GenParser Char st ()
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederskip = skipMany(oneOf (whiteChars)
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder <|> nestCommentOut <?> "") >> return ()
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian MaederwhiteSpace = skip
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maederlexeme :: GenParser Char st a -> GenParser Char st a
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maederlexeme p = p << skip
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maeder
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maedersymbol :: String -> GenParser Char st String
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maedersymbol s = lexeme (string s)
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maeder
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maeder-- only skip to an annotation if it's on the same or next line
aded505f9b42cc38975559c2a5d175ae95de436bChristian MaederskipSmart :: GenParser Char st ()
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian MaederskipSmart = do p <- getPosition
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder try (do skip
a14767aeac3e78ed100f5b75e210ba563ee10dbaChristian Maeder q <- getPosition
a14767aeac3e78ed100f5b75e210ba563ee10dbaChristian Maeder if sourceLine q <= sourceLine p + 1 then return ()
a14767aeac3e78ed100f5b75e210ba563ee10dbaChristian Maeder else notFollowedBy (char '%') >> return ()
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder )
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maeder <|> return ()
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
54ea981a0503c396c2923a1c06421c6235baf27fChristian Maeder-- ----------------------------------------------
54ea981a0503c396c2923a1c06421c6235baf27fChristian Maeder-- keywords WORDS or NO-BRACKET-SIGNS
54ea981a0503c396c2923a1c06421c6235baf27fChristian Maeder-- ----------------------------------------------
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
aded505f9b42cc38975559c2a5d175ae95de436bChristian MaederkeyWord :: GenParser Char st a -> GenParser Char st a
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederkeyWord p = try(p << notFollowedBy scanLPD)
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian MaederkeySign :: GenParser Char st a -> GenParser Char st a
aded505f9b42cc38975559c2a5d175ae95de436bChristian MaederkeySign p = try(p << notFollowedBy (oneOf signChars))
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian Maeder
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maederreserved :: [String] -> GenParser Char st String -> GenParser Char st String
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maeder-- "try" to avoid reading keywords
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maederreserved l p = try (p `checkWith` \r -> r `notElem` l)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
254df6f22d01eacf7c57b85729e0445747b630d9Christian Maeder-- ----------------------------------------------
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder-- lexical tokens with position
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder-- ----------------------------------------------
254df6f22d01eacf7c57b85729e0445747b630d9Christian MaederconvToPos :: SourcePos -> SourcePos
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederconvToPos = id
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
254df6f22d01eacf7c57b85729e0445747b630d9Christian MaederpToken :: GenParser Char st String -> GenParser Char st Token
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederpToken parser = bind (flip Token) getPosition (parser << skipSmart)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
aded505f9b42cc38975559c2a5d175ae95de436bChristian MaederpluralKeyword :: String -> GenParser Char st Token
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederpluralKeyword s = pToken (keyWord (string s <++> option "" (string "s")))
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
ac34194a668399bb8ef238da77c3a09e93fb253bChristian Maeder-- check for keywords (depending on lexem class)
4fc9de0da898448f1d3597ebbd8c04a066464c21Christian MaedertoKey :: String -> GenParser Char st String
aded505f9b42cc38975559c2a5d175ae95de436bChristian MaedertoKey s = let p = string s in
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder if last s `elem` "[]{}(),;" then p
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian Maeder else if last s `elem` signChars then keySign p
4fc9de0da898448f1d3597ebbd8c04a066464c21Christian Maeder else keyWord p
df5eb1b8e587946c9d072f4ee6ac7d001719b034Christian Maeder
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian MaederasSeparator :: String -> GenParser Char st Token
456238178f89e5a3de2988ee6c8af924297d52d9Christian MaederasSeparator = pToken . string
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
986d3f255182539098a97ac86da9eeee5b7a72e3Christian MaedercommaT, semiT :: GenParser Char st Token
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaedercommaT = asSeparator ","
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian MaedersemiT = asSeparator ";"
01e278bdd7dce13b9303ed3d79683d83c89d09f9Liam O'Reilly
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederoBraceT, cBraceT :: GenParser Char st Token
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik LueckeoBraceT = asSeparator "{"
8c812cd83569e973f10cf69a342424ceabc07af9Christian MaedercBraceT = asSeparator "}"
8c812cd83569e973f10cf69a342424ceabc07af9Christian Maeder
8c812cd83569e973f10cf69a342424ceabc07af9Christian MaederoBracketT, cBracketT, oParenT, cParenT :: GenParser Char st Token
1535e1d8c82db5f7e2402261983c4c2ef39f4f39Mihai CodescuoBracketT = asSeparator "["
31d6d9286988dc31639d105841296759aeb743e0Jonathan von SchroedercBracketT = asSeparator "]"
1535e1d8c82db5f7e2402261983c4c2ef39f4f39Mihai CodescuoParenT = asSeparator "("
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von SchroedercParenT = asSeparator ")"
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von Schroeder
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von Schroederbraces :: GenParser Char st a -> GenParser Char st a
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von Schroederbraces p = oBraceT >> p << cBraceT
05a206508bc898f87fe6ab6e069814df3c29d303Dominik Luecke
05a206508bc898f87fe6ab6e069814df3c29d303Dominik LueckecommaSep1 :: GenParser Char st a -> GenParser Char st [a]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedercommaSep1 p = fmap fst $ separatedBy p commaT
d54cd08a4cfa26256c38d8ed12c343adbfe1a0e3Christian Maeder
d54cd08a4cfa26256c38d8ed12c343adbfe1a0e3Christian MaederplaceS :: GenParser Char st String
d54cd08a4cfa26256c38d8ed12c343adbfe1a0e3Christian MaederplaceS = string place
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian MaederplaceT :: GenParser Char st Token
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederplaceT = pToken (try (placeS) <?> place)
8c812cd83569e973f10cf69a342424ceabc07af9Christian Maeder
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder