From 340d408024980bddac83971dbef7d6a17c407382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sun, 19 Jan 2025 20:01:05 +0100 Subject: Export declaration --- src/Parser.hs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'src/Parser.hs') diff --git a/src/Parser.hs b/src/Parser.hs index e23b277..00f6f3e 100644 --- a/src/Parser.hs +++ b/src/Parser.hs @@ -43,8 +43,8 @@ parseTestDefinition = label "test definition" $ toplevel ToplevelTest $ do wsymbol "test" lexeme $ TL.toStrict <$> takeWhileP (Just "test name") (/=':') -parseDefinition :: TestParser Toplevel -parseDefinition = label "symbol definition" $ toplevel ToplevelDefinition $ do +parseDefinition :: TestParser ( VarName, SomeExpr ) +parseDefinition = label "symbol definition" $ do def <- localState $ L.indentBlock scn $ do wsymbol "def" name <- varName @@ -94,6 +94,19 @@ parseDefinition = label "symbol definition" $ toplevel ToplevelDefinition $ do replaceArgs (SomeExpr e) = SomeExpr (go unif e) e -> e +parseExport :: TestParser [ Toplevel ] +parseExport = label "export declaration" $ toplevel id $ do + wsymbol "export" + choice + [ do + def@( name, _ ) <- parseDefinition + return [ ToplevelDefinition def, ToplevelExport name ] + , do + names <- listOf varName + void eol + return $ map ToplevelExport names + ] + parseTestModule :: FilePath -> TestParser Module parseTestModule absPath = do moduleName <- choice @@ -110,9 +123,10 @@ parseTestModule absPath = do , do return $ [ T.pack $ takeBaseName absPath ] ] - toplevels <- many $ choice - [ parseTestDefinition - , parseDefinition + toplevels <- fmap concat $ many $ choice + [ (: []) <$> parseTestDefinition + , (: []) <$> toplevel ToplevelDefinition parseDefinition + , parseExport ] let moduleTests = catMaybes $ map (\case ToplevelTest x -> Just x; _ -> Nothing) toplevels moduleDefinitions = catMaybes $ map (\case ToplevelDefinition x -> Just x; _ -> Nothing) toplevels -- cgit v1.2.3