module Language.SimpleShell.Parser.Name ( varNameP , funNameP , keyword ) where import Language.SimpleShell.AST.Name (FunName, VarName) import Language.SimpleShell.Parser (Parser, lexeme) import Control.Monad (void) import Data.Text (Text, cons) import Data.Char (isAlpha, isAlphaNum) import Text.Megaparsec (takeWhileP, satisfy, notFollowedBy, try) import Text.Megaparsec.Char (string) isNameStartChar :: Char -> Bool isNameStartChar c = isAlpha c || c == '_' isNameChar :: Char -> Bool isNameChar c = isAlphaNum c || c == '_' nameP :: Parser Text nameP = lexeme $ cons <$> satisfy isNameStartChar <*> takeWhileP Nothing isNameChar keyword :: Text -> Parser () keyword kw = void $ lexeme $ try $ string kw <* notFollowedBy (satisfy isNameChar) varNameP :: Parser VarName varNameP = nameP funNameP :: Parser FunName funNameP = nameP