{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-} module Language.SimpleShell.Parser ( lexeme , symbol , commentFirstChars ) where import Control.Monad (void) import Data.Text (Text) import Text.Megaparsec (MonadParsec) import Text.Megaparsec.Char (space1) import qualified Text.Megaparsec.Char.Lexer as L ( lexeme , symbol , space , skipLineComment , skipBlockComment ) -- Must be kept in sync with 'commentFirstChars'. sc :: (MonadParsec e Text m) => m () sc = L.space space1 (L.skipLineComment "//") (L.skipBlockComment "/*" "*/") -- | List of all characters that may start a comment. commentFirstChars :: [Char] commentFirstChars = "/" lexeme :: (MonadParsec e Text m) => m a -> m a lexeme = L.lexeme sc symbol :: (MonadParsec e Text m) => Text -> m () symbol = void . L.symbol sc