Refactor parser to decorate with void

This commit is contained in:
Patrick Aldis 2026-03-03 10:29:22 +00:00
parent e7340f9a4d
commit 902fb4e0b5

View File

@ -1,3 +1,5 @@
{-# LANGUAGE MultilineStrings #-}
module Datalog.Parser module Datalog.Parser
( parseTerm ( parseTerm
, parseAtom , parseAtom
@ -14,6 +16,7 @@ import Data.Void (Void)
import Text.Megaparsec import Text.Megaparsec
import Text.Megaparsec.Char import Text.Megaparsec.Char
import Text.Megaparsec.Char.Lexer qualified as L import Text.Megaparsec.Char.Lexer qualified as L
import Text.Pretty.Simple
type Parser = Parsec Void Text type Parser = Parsec Void Text
@ -58,14 +61,44 @@ parseFact :: Parser Rule
parseFact = do parseFact = do
headAtom <- parseAtom headAtom <- parseAtom
period period
return (headAtom :- []) return (Rule () headAtom [])
parseRule :: Parser Rule parseRule :: Parser Rule
parseRule = try parseFact <|> do parseRule = try parseFact <|> do
headAtom <- parseAtom <* symbol ":-" headAtom <- parseAtom <* symbol ":-"
bodyAtoms <- parseQuery bodyAtoms <- parseQuery
period period
return (headAtom :- bodyAtoms) return (Rule () headAtom bodyAtoms)
parseProgram :: Parser Program parseProgram :: Parser Program
parseProgram = Program () <$> many parseRule parseProgram = Program () <$> many parseRule
annotateSrcLoc :: Functor f => Parser (f a) -> Parser (f SrcLoc)
annotateSrcLoc p = do
s <- getSourcePos
res <- p
f <- getSourcePos
pure (SrcLoc s f <$ res)
data SrcLoc = SrcLoc
{ start :: SourcePos
, end :: SourcePos
} deriving Show
test = do
let r = runParser parseProgram "???" prog
pPrint @IO r
prog = """
odd(X,Y) :- r(X,Y).
odd(X,Y) :- even(X,Z), r(Z,Y).
even(X,Y) :- odd(X,Z), r(Z,Y).
r(0,1).
r(1,2).
r(2,3).
r(3,4).
r(4,5).
r(X,Y) :- r(Y,X).
"""