diff options
Diffstat (limited to 'src/Language/SimpleShell/Parser/Name.hs')
-rw-r--r-- | src/Language/SimpleShell/Parser/Name.hs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/Language/SimpleShell/Parser/Name.hs b/src/Language/SimpleShell/Parser/Name.hs new file mode 100644 index 0000000..635d987 --- /dev/null +++ b/src/Language/SimpleShell/Parser/Name.hs @@ -0,0 +1,40 @@ +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 |