module Rule where
import IO
import Term ( Term(Node), Identifier )
import qualified Term
import Text.PrettyPrint.HughesPJ ( fsep, render, text )
data Rule = Rule
{ name :: Identifier
, parameters :: [ Term ]
, rhs :: Term
}
instance Show Rule where show = render . output
instance Read Rule where readsPrec = parsec_reader
instance Output Rule where
output r =
fsep [ output ( Node (name r) (parameters r) ), text "=",
output ( rhs r ), text ";" ]
instance Input Rule where
input = do
t <- input
(nm, ps) <-
case t of
Term.Node nm args ->
if Term.isVariable nm
then return (nm, args)
else fail $ show nm ++ " is not a function identifier"
_ -> fail $ "the term " ++ show t ++ " is not a valid left-hand side of a rule"
Term.symbol "="
r <- input
Term.symbol ";"
return $ Rule { name = nm, parameters = ps, rhs = r }