generalize parser symbols; parser monad
This commit is contained in:
parent
4d7fd8be7c
commit
ab8ed1c73c
2 changed files with 38 additions and 24 deletions
|
@ -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 =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue