generalize parser symbols; parser monad

This commit is contained in:
hi 2025-08-10 13:31:20 +00:00
parent 4d7fd8be7c
commit ab8ed1c73c
2 changed files with 38 additions and 24 deletions

View file

@ -13,19 +13,23 @@ import Logic.Statement (Statement(..))
import Control.Applicative (Alternative((<|>), some))
import Data.Char (isAlphaNum)
stmtAtom :: Parser Statement
stmtAtom :: Parser Char Statement
stmtAtom = Atom <$> parse
where
parse = some $ parseIf "statement variable" $ \char -> isAlphaNum char || char == '_'
parse = some $ parseIf "variable name" $ \char -> isAlphaNum char || char == '_'
stmtNot :: Parser Statement
stmtNot :: Parser Char Statement
stmtNot = Not <$> (parseToken "!" *> stmt)
stmtBinary :: Parser Statement
stmtBinary = parseToken "(" *> body <* parseToken ")"
stmtBinary :: Parser Char Statement
stmtBinary = do
parseToken "("
s1 <- stmt
constructor <- parseConnective
s2 <- stmt
parseToken ")"
return $ constructor s1 s2
where
body = (\s1 f s2 -> f s1 s2) <$> stmt <*> parseConnective <*> stmt
parseConnective =
fmap (const And) (parseToken "&")
<|> fmap (const Or) (parseToken "|")
@ -35,7 +39,7 @@ stmtBinary = parseToken "(" *> body <* parseToken ")"
fail = Parser $ \input -> Left $ expected "connective" input
stmt :: Parser Statement
stmt :: Parser Char Statement
stmt = Parser $ \input ->
let
parser =