Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

56 lines (44 sloc) 1.765 kb
{-# LANGUAGE FlexibleContexts, NoMonomorphismRestriction #-}
{-# OPTIONS_GHC -Wall #-}
-- | Lexer/Parsec interface
module Text.Parsec.LTok
( tok
, anyIdent
, number
, stringlit
, Parser
) where
import Language.Lua.Annotated.Lexer (LTok, AlexPosn(..))
import Language.Lua.Token
import Text.Parsec hiding (satisfy, string)
type Parser = Parsec [LTok] ()
-- | This parser succeeds whenever the given predicate returns true when called with
-- parsed `LTok`. Same as 'Text.Parsec.Char.satisfy'.
satisfy :: (Stream [LTok] m LTok) => (LTok -> Bool) -> ParsecT [LTok] u m LToken
satisfy f = tokenPrim show nextPos tokeq
where
tokeq :: LTok -> Maybe LToken
tokeq t = if f t then Just (fst t) else Nothing
satisfy' :: (Stream [LTok] m LTok) => (LTok -> Maybe a) -> ParsecT [LTok] u m a
satisfy' = tokenPrim show nextPos
nextPos :: SourcePos -> LTok -> [LTok] -> SourcePos
nextPos pos _ ((_, AlexPn _ l c):_) = setSourceColumn (setSourceLine pos l) c
nextPos pos _ [] = pos
-- | Parses given `LToken`.
tok :: (Stream [LTok] m LTok) => LToken -> ParsecT [LTok] u m LToken
tok t = satisfy (\(t', _) -> t' == t) <?> show t
-- | Parses a `LTokIdent`.
anyIdent :: Monad m => ParsecT [LTok] u m String
anyIdent = satisfy' p <?> "ident"
where p (t, _) = case t of LTokIdent i -> Just i
_ -> Nothing
-- | Parses a `LTokNum`.
number :: Monad m => ParsecT [LTok] u m String
number = satisfy' p <?> "number"
where p (t, _) = case t of LTokNum n -> Just n
_ -> Nothing
-- | Parses a `LTokSLit`.
stringlit :: Monad m => ParsecT [LTok] u m String
stringlit = satisfy' p <?> "string"
where p (t, _) = case t of LTokSLit s -> Just s
_ -> Nothing
Jump to Line
Something went wrong with that request. Please try again.