{-|
Module : PP.Lexer
Description : Common behavior for defined lexers
Copyright : (c) 2017 Patrick Champion
License : see LICENSE file
Maintainer : chlablak@gmail.com
Stability : provisional
Portability : portable
-}
module PP.Lexer
( IToken
, OToken(..)
, charLexer
, Lexer(..)
) where
-- |Input token
type IToken = Char
-- |Output token
data OToken
= OToken1 String -- ^Token value
| OToken2 [IToken] String -- ^Token value and name
deriving (Show, Eq, Ord)
-- |String to OToken (char by char lexer)
charLexer :: String -> [OToken]
charLexer = map (\c -> OToken1 [c])
-- |Lexer class
class Lexer config where
-- |Simulate the automaton on the input, for one iteration
simulate :: config -> config
-- |Check if the input is consumed
consumed :: config -> Bool
-- |Get the output tokens
output :: config -> [OToken]
-- |Consume the complete input
consume :: config -> config
consume c = if consumed c then c else consume $ simulate c