Subversion

Galculator

?curdirlinks? - Rev 7

?prevdifflink? - Blame



{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -Wall #-}
 
-------------------------------------------------------------------------------
 
{- |
Module      :  Language.Command.Parser
Description :  Command line parser.
Copyright   :  (c) Paulo Silva
License     :  LGPL
 
Maintainer  :  paufil@di.uminho.pt
Stability   :  experimental
Portability :  portable
 
-}


-------------------------------------------------------------------------------

module Language.Command.Parser (
  parser
 ) where

import Control.GalcError
import Control.Monad.Error
import qualified Language.Step.Parser as S
import Language.Command.Syntax
import qualified Language.Derivation.Parser as D
import qualified Language.Law.Parser as L
import qualified Language.R.Parser as R
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Language
import qualified Text.ParserCombinators.Parsec.Token as P

-------------------------------------------------------------------------------

type CmdParser = Parser Command

-------------------------------------------------------------------------------

reservNames :: [String]
reservNames = commands

-------------------------------------------------------------------------------

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 :: MonadError GalcError m => String -> m Command
parser = either2error (ParsingError . show) . parse mainCmdParser ""

-------------------------------------------------------------------------------

mainCmdParser :: CmdParser
mainCmdParser = do
  whiteSpace
  t <- parseCmd
  eof
  return t

-------------------------------------------------------------------------------

parseCmd :: CmdParser
parseCmd =
  parseAbort       <|>
  parseAssume      <|>
  parseAuto        <|>
  parseBrowse      <|>
  parseCombin      <|>
  parseDefine      <|>
  parseDerive      <|>
  parseHelp        <|>
  parseHint        <|>
  parseInfo        <|>
  parseLoad        <|>
  parseModules     <|>
  parseProve       <|>
  parseQuit        <|>
  parseReload      <|>
  parseRestart     <|>
  parseRules       <|>
  parseSave        <|>
  parseShow        <|>
  parseType        <|>
  parseUndo        <|>
  parseUnload

-------------------------------------------------------------------------------

parseAbort :: CmdParser
parseAbort = do
  reserved "abort"
  return Abort

-------------------------------------------------------------------------------

parseAssume :: CmdParser
parseAssume = do
  reserved "assume"
  l <- L.parseLaw
  return $ Assume l

-------------------------------------------------------------------------------

parseAuto :: CmdParser
parseAuto = do
  reserved "auto"
  return Auto

-------------------------------------------------------------------------------

parseBrowse :: CmdParser
parseBrowse = do
  reserved "browse"
  ident <- identifier
  return $ Browse ident

-------------------------------------------------------------------------------

parseCombin :: CmdParser
parseCombin = do
  comb <- S.parseStep
  return $ Comb comb

-------------------------------------------------------------------------------

parseDefine :: CmdParser
parseDefine = do
  reserved "define"
  r <- R.parseR
  return $ Define r

-------------------------------------------------------------------------------

parseDerive :: CmdParser
parseDerive = do
  reserved "derive"
  drv <- D.parseDeriv
  return $ Derive drv

-------------------------------------------------------------------------------

parseHelp :: CmdParser
parseHelp = do
  reserved "help"
  return Help

-------------------------------------------------------------------------------

parseHint :: CmdParser
parseHint = do
  reserved "hint"
  return Hint

-------------------------------------------------------------------------------

parseInfo :: CmdParser
parseInfo = do
  reserved "info"
  ident <- identifier
  return $ Info ident

-------------------------------------------------------------------------------

parseLoad :: CmdParser
parseLoad = do
  reserved "load"
  ident <- identifier
  return $ Load ident

-------------------------------------------------------------------------------

parseModules :: CmdParser
parseModules = do
  reserved "modules"
  return Modules

-------------------------------------------------------------------------------

parseProve :: CmdParser
parseProve = do
  reserved "prove"
  l <- L.parseLaw
  return $ Prove l

-------------------------------------------------------------------------------

parseQuit :: CmdParser
parseQuit = do
  reserved "quit"
  return Quit

-------------------------------------------------------------------------------

parseReload :: CmdParser
parseReload = do
  reserved "reload"
  return Reload

-------------------------------------------------------------------------------

parseRestart :: CmdParser
parseRestart = do
  reserved "restart"
  return Restart

-------------------------------------------------------------------------------

parseRules :: CmdParser
parseRules = do
  reserved "rules"
  return Rules

-------------------------------------------------------------------------------

parseSave :: CmdParser
parseSave = do
  reserved "save"
  return Save

-------------------------------------------------------------------------------

parseShow :: CmdParser
parseShow = do
  reserved "show"
  return Show

-------------------------------------------------------------------------------

parseType :: CmdParser
parseType = do
  reserved "type"
  expr <- R.parseR
  return $ Type expr

-------------------------------------------------------------------------------

parseUndo :: CmdParser
parseUndo = do
  reserved "undo"
  return $ Undo Nothing

-------------------------------------------------------------------------------

parseUnload :: CmdParser
parseUnload = do
  reserved "unload"
  ident <- identifier
  return $ Unload ident

-------------------------------------------------------------------------------
 

Theme by Vikram Singh | Powered by WebSVN v2.3.3