Subversion

Galculator

?curdirlinks? -

Blame information for rev 7

Line No. Rev Author Line
1 1 paulosilva  
2 {-# LANGUAGE FlexibleContexts #-}
3 {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Language.Command.Parser
9 Description :  Command line parser.
10 Copyright   :  (c) Paulo Silva
11 License     :  LGPL
12  
13 Maintainer  :  paufil@di.uminho.pt
14 Stability   :  experimental
15 Portability :  portable
16  
17 -}
18  
19 -------------------------------------------------------------------------------
20  
21 module Language.Command.Parser (
22   parser
23  ) where
24  
25 import Control.GalcError
26 import Control.Monad.Error
27 7 paulosilva import qualified Language.Step.Parser as S
28 1 paulosilva import Language.Command.Syntax
29 import qualified Language.Derivation.Parser as D
30 import qualified Language.Law.Parser as L
31 import qualified Language.R.Parser as R
32 import Text.ParserCombinators.Parsec
33 import Text.ParserCombinators.Parsec.Language
34 import qualified Text.ParserCombinators.Parsec.Token as P
35  
36 -------------------------------------------------------------------------------
37  
38 type CmdParser = Parser Command
39  
40 -------------------------------------------------------------------------------
41  
42 reservNames :: [String]
43 reservNames = commands
44  
45 -------------------------------------------------------------------------------
46  
47 lexer :: P.TokenParser st
48 lexer = P.makeTokenParser $ emptyDef { P.reservedNames = reservNames }
49  
50 -------------------------------------------------------------------------------
51  
52 reserved :: String -> CharParser st ()
53 reserved = P.reserved lexer
54  
55 whiteSpace :: CharParser st ()
56 whiteSpace = P.whiteSpace lexer
57  
58 identifier :: CharParser st String
59 identifier = P.identifier lexer
60  
61 -------------------------------------------------------------------------------
62  
63 parser :: MonadError GalcError m => String -> m Command
64 parser = either2error (ParsingError . show) . parse mainCmdParser ""
65  
66 -------------------------------------------------------------------------------
67  
68 mainCmdParser :: CmdParser
69 mainCmdParser = do
70   whiteSpace
71   t <- parseCmd
72   eof
73   return t
74  
75 -------------------------------------------------------------------------------
76  
77 parseCmd :: CmdParser
78 parseCmd =
79   parseAbort       <|>
80   parseAssume      <|>
81   parseAuto        <|>
82   parseBrowse      <|>
83   parseCombin      <|>
84   parseDefine      <|>
85   parseDerive      <|>
86   parseHelp        <|>
87   parseHint        <|>
88   parseInfo        <|>
89   parseLoad        <|>
90   parseModules     <|>
91   parseProve       <|>
92   parseQuit        <|>
93   parseReload      <|>
94   parseRestart     <|>
95   parseRules       <|>
96   parseSave        <|>
97   parseShow        <|>
98   parseType        <|>
99   parseUndo        <|>
100   parseUnload
101  
102 -------------------------------------------------------------------------------
103  
104 parseAbort :: CmdParser
105 parseAbort = do
106   reserved "abort"
107   return Abort
108  
109 -------------------------------------------------------------------------------
110  
111 parseAssume :: CmdParser
112 parseAssume = do
113   reserved "assume"
114   l <- L.parseLaw
115   return $ Assume l
116  
117 -------------------------------------------------------------------------------
118  
119 parseAuto :: CmdParser
120 parseAuto = do
121   reserved "auto"
122   return Auto
123  
124 -------------------------------------------------------------------------------
125  
126 parseBrowse :: CmdParser
127 parseBrowse = do
128   reserved "browse"
129   ident <- identifier
130   return $ Browse ident
131  
132 -------------------------------------------------------------------------------
133  
134 parseCombin :: CmdParser
135 parseCombin = do
136 7 paulosilva   comb <- S.parseStep
137 1 paulosilva   return $ Comb comb
138  
139 -------------------------------------------------------------------------------
140  
141 parseDefine :: CmdParser
142 parseDefine = do
143   reserved "define"
144   r <- R.parseR
145   return $ Define r
146  
147 -------------------------------------------------------------------------------
148  
149 parseDerive :: CmdParser
150 parseDerive = do
151   reserved "derive"
152   drv <- D.parseDeriv
153   return $ Derive drv
154  
155 -------------------------------------------------------------------------------
156  
157 parseHelp :: CmdParser
158 parseHelp = do
159   reserved "help"
160   return Help
161  
162 -------------------------------------------------------------------------------
163  
164 parseHint :: CmdParser
165 parseHint = do
166   reserved "hint"
167   return Hint
168  
169 -------------------------------------------------------------------------------
170  
171 parseInfo :: CmdParser
172 parseInfo = do
173   reserved "info"
174   ident <- identifier
175   return $ Info ident
176  
177 -------------------------------------------------------------------------------
178  
179 parseLoad :: CmdParser
180 parseLoad = do
181   reserved "load"
182   ident <- identifier
183   return $ Load ident
184  
185 -------------------------------------------------------------------------------
186  
187 parseModules :: CmdParser
188 parseModules = do
189   reserved "modules"
190   return Modules
191  
192 -------------------------------------------------------------------------------
193  
194 parseProve :: CmdParser
195 parseProve = do
196   reserved "prove"
197   l <- L.parseLaw
198   return $ Prove l
199  
200 -------------------------------------------------------------------------------
201  
202 parseQuit :: CmdParser
203 parseQuit = do
204   reserved "quit"
205   return Quit
206  
207 -------------------------------------------------------------------------------
208  
209 parseReload :: CmdParser
210 parseReload = do
211   reserved "reload"
212   return Reload
213  
214 -------------------------------------------------------------------------------
215  
216 parseRestart :: CmdParser
217 parseRestart = do
218   reserved "restart"
219   return Restart
220  
221 -------------------------------------------------------------------------------
222  
223 parseRules :: CmdParser
224 parseRules = do
225   reserved "rules"
226   return Rules
227  
228 -------------------------------------------------------------------------------
229  
230 parseSave :: CmdParser
231 parseSave = do
232   reserved "save"
233   return Save
234  
235 -------------------------------------------------------------------------------
236  
237 parseShow :: CmdParser
238 parseShow = do
239   reserved "show"
240   return Show
241  
242 -------------------------------------------------------------------------------
243  
244 parseType :: CmdParser
245 parseType = do
246   reserved "type"
247   expr <- R.parseR
248   return $ Type expr
249  
250 -------------------------------------------------------------------------------
251  
252 parseUndo :: CmdParser
253 parseUndo = do
254   reserved "undo"
255   return $ Undo Nothing
256  
257 -------------------------------------------------------------------------------
258  
259 parseUnload :: CmdParser
260 parseUnload = do
261   reserved "unload"
262   ident <- identifier
263   return $ Unload ident
264  
265 -------------------------------------------------------------------------------

Theme by Vikram Singh | Powered by WebSVN v2.3.3