14 lines
439 B
Haskell
14 lines
439 B
Haskell
{-# LANGUAGE FlexibleContexts #-}
|
|
import Text.Parsec
|
|
|
|
toRPN = parse impl "expression" . filter (/= ' ')
|
|
where
|
|
impl = chainl1 disj (op2 "=>")
|
|
disj = chainl1 conj (op2 "|" <|> op2 "^")
|
|
conj = chainl1 term (op2 "&")
|
|
term = string "(" *> impl <* string ")" <|>
|
|
op1 "!" <*> term <|>
|
|
many1 alphaNum
|
|
op1 s = (\x -> unwords [x, s]) <$ string s
|
|
op2 s = (\x y -> unwords [x, y, s]) <$ string s
|