aboutsummaryrefslogtreecommitdiff
path: root/src/Language/SimpleShell/Parser/Name.hs
diff options
context:
space:
mode:
authorEinhard Leichtfuß <alguien@respiranto.de>2025-05-19 21:17:52 +0200
committerEinhard Leichtfuß <alguien@respiranto.de>2025-05-19 21:17:52 +0200
commit36ae80ba404aef44dcc8d606e4d3b399ee05c6af (patch)
tree861fe5e372828c720b63945d3a8d959f654fb06a /src/Language/SimpleShell/Parser/Name.hs
parent1eef63739d9da401bdd4c89da2cfd8d3d9b7acb6 (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.hs40
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