diff --git a/datalog/src/Datalog/Parser.hs b/datalog/src/Datalog/Parser.hs index 56f8bdf..dac730f 100644 --- a/datalog/src/Datalog/Parser.hs +++ b/datalog/src/Datalog/Parser.hs @@ -1,4 +1,5 @@ {-# LANGUAGE MultilineStrings #-} +{-# LANGUAGE BlockArguments #-} module Datalog.Parser ( parseTerm, @@ -71,9 +72,31 @@ parseRule = bodyAtoms <- parseQuery period return (Rule () headAtom bodyAtoms) +parseRule' :: Parser (Rule' SrcLoc) +parseRule' = _ -parseProgram :: Parser Program -parseProgram = Program () <$> many parseRule +-- parseProgram :: Parser Program +parseProgram :: Parser (Program' SrcLoc) +parseProgram = do + -- annotateSrcLoc $ + s <- getSourcePos + c <- many parseRule' + e <- getSourcePos + -- Program _ <$> many parseRule + pure $ Program (SrcLoc s e) c + +parseProgram' :: Parser (Program' SrcLoc) +parseProgram' = parseThingWithSub (many parseRule') Program + +parseThingWithSub :: (Parser c) -> (SrcLoc -> c -> f SrcLoc) -> Parser (f SrcLoc) +parseThingWithSub parseSub f = do + -- annotateSrcLoc $ + s <- getSourcePos + -- c <- many parseRule' + c <- parseSub + e <- getSourcePos + -- Program _ <$> many parseRule + pure $ f (SrcLoc s e) c annotateSrcLoc :: (Functor f) => Parser (f a) -> Parser (f SrcLoc) annotateSrcLoc p = do