?prevdifflink? - Blame
{-# OPTIONS_GHC -Wall #-} ------------------------------------------------------------------------------- {- | Module : Language.Law.Parser Description : Copyright : (c) Paulo Silva License : LGPL Maintainer : paufil@di.uminho.pt Stability : experimental Portability : portable <description of the module> -} ------------------------------------------------------------------------------- module Language.Law.Parser ( parser, parseLaw ) where import Control.Monad import Language.Law.SyntaxADT import qualified Language.R.Parser as R --import Language.R.SyntaxADT import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Language import qualified Text.ParserCombinators.Parsec.Token as P ------------------------------------------------------------------------------- type LawParser = Parser LawS ------------------------------------------------------------------------------- reservNames :: [String] reservNames = ["EQUIV", "IMPL"] lexer :: P.TokenParser st lexer = P.makeTokenParser $ emptyDef { P.reservedNames = reservNames } ------------------------------------------------------------------------------- reserved :: String -> CharParser st () reserved = P.reserved lexer whiteSpace :: CharParser st () whiteSpace = P.whiteSpace lexer identifier :: CharParser st String identifier = P.identifier lexer ------------------------------------------------------------------------------- parser :: String -> Either ParseError LawS parser = parse mainLawParser "" ------------------------------------------------------------------------------- mainLawParser :: LawParser mainLawParser = do whiteSpace l <- parseLaw eof return l ------------------------------------------------------------------------------- parseLaw :: LawParser parseLaw = parseEquiv <|> parseImpl ------------------------------------------------------------------------------- parseEquiv :: LawParser parseEquiv = do p <- getPosition reserved "EQUIV" ident <- identifier r1 <- R.parseR r2 <- R.parseR return $ EquivS p ident r1 r2 ------------------------------------------------------------------------------- parseImpl :: LawParser parseImpl = do p <- getPosition reserved "IMPL" ident <- identifier r1 <- R.parseR r2 <- R.parseR return $ ImplS p ident r1 r2 ------------------------------------------------------------------------------- |