diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-04-05 10:31:55 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-04-05 12:27:55 +0200 |
| commit | ad00b4534582c5ce94243f7dda3b76d7c0bba021 (patch) | |
| tree | 8045950f66d6ccf709c7d44ed33ec135e9f23425 /src | |
| parent | 8b61b194f2f4759689844ab57f2ca7a4b912c468 (diff) | |
Parse data constructors
Diffstat (limited to 'src')
| -rw-r--r-- | src/Parser/Expr.hs | 18 | ||||
| -rw-r--r-- | src/Parser/Statement.hs | 2 |
2 files changed, 18 insertions, 2 deletions
diff --git a/src/Parser/Expr.hs b/src/Parser/Expr.hs index b9b5f01..585f727 100644 --- a/src/Parser/Expr.hs +++ b/src/Parser/Expr.hs @@ -5,11 +5,13 @@ module Parser.Expr ( varName, newVarName, addVarName, + constrName, someExpr, typedExpr, literal, variable, + constructor, stringExpansion, @@ -83,6 +85,13 @@ addVarName off (TypedVarName name) = do Nothing -> return () modify $ \s -> s { testVars = ( name, ( LocalVarName name, ExprTypePrim @a Proxy )) : testVars s } +constrName :: TestParser VarName +constrName = label "contructor name" $ do + lexeme $ try $ do + lead <- upperChar + rest <- takeWhileP Nothing (\x -> isAlphaNum x || x == '_') + return $ VarName $ TL.toStrict $ TL.fromChunks $ T.singleton lead : TL.toChunks rest + someExpansion :: TestParser SomeExpr someExpansion = do void $ char '$' @@ -370,10 +379,17 @@ variable = label "variable" $ do e <- lookupVarExpr off sline name recordSelector e <|> return e +constructor :: TestParser SomeExpr +constructor = label "constructor" $ do + off <- stateOffset <$> getParserState + sline <- getSourceLine + name <- constrName + lookupVarExpr off sline name + functionCall :: TestParser SomeExpr functionCall = do sline <- getSourceLine - variable >>= \case + (variable <|> constructor) >>= \case SomeExpr e'@(FunVariable argTypes _ _) -> do let check = checkFunctionArguments argTypes args <- functionArguments check someExpr literal (\poff -> lookupVarExpr poff sline . VarName) diff --git a/src/Parser/Statement.hs b/src/Parser/Statement.hs index 0e6314b..7876542 100644 --- a/src/Parser/Statement.hs +++ b/src/Parser/Statement.hs @@ -309,7 +309,7 @@ instance ExprType a => ParamType (ExprParam a) where type ParamRep (ExprParam a) = Expr a parseParam _ = do off <- stateOffset <$> getParserState - SomeExpr e <- literal <|> variable <|> between (symbol "(") (symbol ")") someExpr + SomeExpr e <- literal <|> variable <|> constructor <|> between (symbol "(") (symbol ")") someExpr unifyExpr off Proxy e showParamType _ = "<" ++ T.unpack (textExprType @a Proxy) ++ ">" paramExpr = fmap ExprParam |