From 36ae80ba404aef44dcc8d606e4d3b399ee05c6af Mon Sep 17 00:00:00 2001 From: Einhard Leichtfuß Date: Mon, 19 May 2025 21:17:52 +0200 Subject: Add function parser Also, we now define and use proper symbol and keyword parsers. --- src/Language/SimpleShell/Parser/Name.hs | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/Language/SimpleShell/Parser/Name.hs (limited to 'src/Language/SimpleShell/Parser/Name.hs') 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 -- cgit v1.2.3