diff options
author | Einhard Leichtfuß <alguien@respiranto.de> | 2025-05-19 21:17:52 +0200 |
---|---|---|
committer | Einhard Leichtfuß <alguien@respiranto.de> | 2025-05-19 21:17:52 +0200 |
commit | 36ae80ba404aef44dcc8d606e4d3b399ee05c6af (patch) | |
tree | 861fe5e372828c720b63945d3a8d959f654fb06a /src/Language/SimpleShell/Parser/Name.hs | |
parent | 1eef63739d9da401bdd4c89da2cfd8d3d9b7acb6 (diff) |
Add function parser
Also, we now define and use proper symbol and keyword parsers.
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 |