aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEinhard Leichtfuß <alguien@respiranto.de>2025-05-20 19:40:53 +0200
committerEinhard Leichtfuß <alguien@respiranto.de>2025-05-20 22:36:30 +0200
commitfd94a9d8a3e4fc86e5128715a2bc68187c872970 (patch)
treeacee31c8049cbcd6b8c73c7e55192eca1203486b
parentb40c163b40615ccd46a80d9119262f9c386bac63 (diff)
Reduce name parsers to nameP
There is no good reason to have different syntax for variable and function names, for example.
-rw-r--r--src/Language/SimpleShell/Parser/Expr.hs6
-rw-r--r--src/Language/SimpleShell/Parser/Function.hs6
-rw-r--r--src/Language/SimpleShell/Parser/Name.hs11
3 files changed, 7 insertions, 16 deletions
diff --git a/src/Language/SimpleShell/Parser/Expr.hs b/src/Language/SimpleShell/Parser/Expr.hs
index 05120ce..1c782bc 100644
--- a/src/Language/SimpleShell/Parser/Expr.hs
+++ b/src/Language/SimpleShell/Parser/Expr.hs
@@ -17,7 +17,7 @@ import Language.SimpleShell.Parser
, lookupVar
, lookupFun
)
-import Language.SimpleShell.Parser.Name (funNameP, varNameP, keyword)
+import Language.SimpleShell.Parser.Name (nameP, keyword)
import Language.SimpleShell.Parser.SimpleType (forceType)
import Control.Monad.Combinators.FailExpr
( Associativity(..)
@@ -70,13 +70,13 @@ literalP
varP :: Parser TypedExpr
varP = do
_ <- char '$'
- x <- varNameP
+ x <- nameP
t <- lookupVar x
return (t, Var x)
funP :: Parser TypedExpr
funP = do
- fname <- funNameP
+ fname <- nameP
(t', ts) <- lookupFun fname
args <- mapM (strongTermP' "Type mismatch with function signature.") ts
return (t', FunCall fname args)
diff --git a/src/Language/SimpleShell/Parser/Function.hs b/src/Language/SimpleShell/Parser/Function.hs
index 29ebbaa..26f5a5c 100644
--- a/src/Language/SimpleShell/Parser/Function.hs
+++ b/src/Language/SimpleShell/Parser/Function.hs
@@ -12,7 +12,7 @@ import Language.SimpleShell.AST.Name (VarName)
import Language.SimpleShell.AST.SimpleType (FunSig, Typed)
import Language.SimpleShell.Parser (Parser, symbol, declareVars)
import Language.SimpleShell.Parser.Expr (strongTermP)
-import Language.SimpleShell.Parser.Name (funNameP, varNameP, keyword)
+import Language.SimpleShell.Parser.Name (nameP, keyword)
import Language.SimpleShell.Parser.SimpleType (simpleTypeP, forceType)
import Control.Applicative ((<|>))
@@ -23,14 +23,14 @@ functionP :: Parser (FunSig, Function)
functionP = do
keyword "function"
t' <- simpleTypeP
- fname <- funNameP
+ fname <- nameP
params <- symbol "(" *> paramP `sepBy` symbol "," <* symbol ")"
let (ts, vars) = unzip params
body <- forceType t' (bodyP params) <|> fail "Function return type mismatch."
return ((t', ts), Function fname vars body)
paramP :: Parser (Typed VarName)
-paramP = (,) <$> simpleTypeP <*> varNameP
+paramP = (,) <$> simpleTypeP <*> nameP
bodyP :: [Typed VarName] -> Parser (Typed Expr)
bodyP params = declareVars params strongTermP
diff --git a/src/Language/SimpleShell/Parser/Name.hs b/src/Language/SimpleShell/Parser/Name.hs
index 635d987..14f4d2e 100644
--- a/src/Language/SimpleShell/Parser/Name.hs
+++ b/src/Language/SimpleShell/Parser/Name.hs
@@ -1,12 +1,10 @@
module Language.SimpleShell.Parser.Name
- ( varNameP
- , funNameP
+ ( nameP
, keyword
)
where
-import Language.SimpleShell.AST.Name (FunName, VarName)
import Language.SimpleShell.Parser (Parser, lexeme)
import Control.Monad (void)
@@ -31,10 +29,3 @@ nameP =
keyword :: Text -> Parser ()
keyword kw =
void $ lexeme $ try $ string kw <* notFollowedBy (satisfy isNameChar)
-
-
-varNameP :: Parser VarName
-varNameP = nameP
-
-funNameP :: Parser FunName
-funNameP = nameP