Subversion

Galculator

?curdirlinks? -

Blame information for rev 5

Line No. Rev Author Line
1 1 paulosilva  
2 {-# LANGUAGE FlexibleContexts #-}
3 {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Language.R.Parser
9 Description :  Parser of the expression representation.
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.R.Parser (
22   parser,
23   parseR,
24   parseGDef,
25   parseDEF
26  ) where
27  
28 import Control.GalcError
29 import Control.Monad.Error
30 import Language.R.SyntaxADT
31 import qualified Language.Type.Parser as T
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 RParser = Parser S
39  
40 -------------------------------------------------------------------------------
41  
42 reservNames :: [String]
43 reservNames = [
44   "BOT", "TOP", "NEG", "MEET", "JOIN", "ID", "CONV", "COMP", "SPLIT",
45   "ORD", "FUN", "LEFTSEC", "RIGHTSEC", "APPLY", "DEF", "Var",
46   "PROD", "EITHER", "MAYBE", "LIST", "SET", "MAP", "FId", "FComp",
47   "OId", "OComp", "OConv", "OProd", "OJoin", "OMeet", "OMax", "OMin",
48   "GDef", "GId", "GComp", "GConv", "GLAdj", "GUAdj", "GLOrd", "GUOrd"
49  ]
50  
51 -------------------------------------------------------------------------------
52  
53 lexer :: P.TokenParser st
54 lexer = P.makeTokenParser $ emptyDef { P.reservedNames = reservNames }
55  
56 -------------------------------------------------------------------------------
57  
58 reserved :: String -> CharParser st ()
59 reserved = P.reserved lexer
60  
61 whiteSpace :: CharParser st ()
62 whiteSpace = P.whiteSpace lexer
63  
64 parens :: CharParser st S  -> CharParser st S
65 parens = P.parens lexer
66  
67 identifier :: CharParser st String
68 identifier = P.identifier lexer
69  
70 -------------------------------------------------------------------------------
71  
72 parser :: MonadError GalcError m => String -> m S
73 parser = either2error (ParsingError . show) . parse mainRParser ""
74  
75 -------------------------------------------------------------------------------
76  
77 mainRParser :: RParser
78 mainRParser = do
79   whiteSpace
80   r <- parseR
81   eof
82   return r
83  
84 -------------------------------------------------------------------------------
85  
86 parseR :: RParser
87 parseR =
88   parens parseR <|>
89   parseREF      <|>
90   parseBOT      <|>
91   parseTOP      <|>
92   parseNEG      <|>
93   parseMEET     <|>
94   parseJOIN     <|>
95   parseID       <|>
96   parseCONV     <|>
97   parseCOMP     <|>
98   parseSPLIT    <|>
99   parseORD      <|>
100   parseFUN      <|>
101   parseLEFTSEC  <|>
102   parseRIGHTSEC <|>
103   parseAPPLY    <|>
104   parseDEF      <|>
105   parseVar      <|>
106   parsePROD     <|>
107   parseEITHER   <|>
108   parseMAYBE    <|>
109   parseLIST     <|>
110   parseSET      <|>
111   parseMAP      <|>
112 5 paulosilva   parseREYNOLDS <|>
113 1 paulosilva   parseFId      <|>
114   parseFComp    <|>
115   parseOId      <|>
116   parseOComp    <|>
117   parseOConv    <|>
118   parseOProd    <|>
119   parseOJoin    <|>
120   parseOMeet    <|>
121   parseOMax     <|>
122   parseOMin     <|>
123   parseGDef     <|>
124   parseGId      <|>
125   parseGComp    <|>
126   parseGConv    <|>
127   parseGLAdj    <|>
128   parseGUAdj    <|>
129   parseGLOrd    <|>
130   parseGUOrd
131  
132 -------------------------------------------------------------------------------
133  
134 parseREF :: RParser
135 parseREF = do
136   p <- getPosition
137   reserved "REF"
138   ident <- identifier
139   return $ RefS p ident
140  
141 -------------------------------------------------------------------------------
142  
143 parseBOT :: RParser
144 parseBOT = do
145   p <- getPosition
146   reserved "BOT"
147   return $ BotS p
148  
149 -------------------------------------------------------------------------------
150  
151 parseTOP :: RParser
152 parseTOP = do
153   p <- getPosition
154   reserved "TOP"
155   return $ TopS p
156  
157 -------------------------------------------------------------------------------
158  
159 parseNEG :: RParser
160 parseNEG = do
161   p <- getPosition
162   reserved "NEG"
163   r <- parseR
164   return $ NegS p r
165  
166 -------------------------------------------------------------------------------
167  
168 parseMEET :: RParser
169 parseMEET = do
170   p <- getPosition
171   reserved "MEET"
172   r1 <- parseR
173   r2 <- parseR
174   return $ MeetS p r1 r2
175  
176 -------------------------------------------------------------------------------
177  
178 parseJOIN :: RParser
179 parseJOIN = do
180   p <- getPosition
181   reserved "JOIN"
182   r1 <- parseR
183   r2 <- parseR
184   return $ JoinS p r1 r2
185  
186 -------------------------------------------------------------------------------
187  
188 parseID :: RParser
189 parseID = do
190   p <- getPosition
191   reserved "ID"
192   return $ IdS p
193  
194 -------------------------------------------------------------------------------
195  
196 parseCONV :: RParser
197 parseCONV = do
198   p <- getPosition
199   reserved "CONV"
200   r <- parseR
201   return $ ConvS p r
202  
203 -------------------------------------------------------------------------------
204  
205 parseCOMP :: RParser
206 parseCOMP = do
207   p <- getPosition
208   reserved "COMP"
209   r1 <- parseR
210   r2 <- parseR
211   return $ CompS p r1 r2
212  
213 -------------------------------------------------------------------------------
214  
215 parseSPLIT :: RParser
216 parseSPLIT = do
217   p <- getPosition
218   reserved "SPLIT"
219   r1 <- parseR
220   r2 <- parseR
221   return $ SplitS p r1 r2
222  
223 -------------------------------------------------------------------------------
224  
225 parseORD :: RParser
226 parseORD = do
227   p <- getPosition
228   reserved "ORD"
229   r <- parseR
230   return $ OrdS p r
231  
232 -------------------------------------------------------------------------------
233  
234 parseFUN :: RParser
235 parseFUN = do
236   p <- getPosition
237   reserved "FUN"
238   r <- parseR
239   return $ FunS p r
240  
241 -------------------------------------------------------------------------------
242  
243 parseLEFTSEC :: RParser
244 parseLEFTSEC = do
245   p <- getPosition
246   reserved "LEFTSEC"
247   r1 <- parseR
248   r2 <- parseR
249   return $ LeftsecS p r1 r2
250  
251 -------------------------------------------------------------------------------
252  
253 parseRIGHTSEC :: RParser
254 parseRIGHTSEC = do
255   p <- getPosition
256   reserved "RIGHTSEC"
257   r1 <- parseR
258   r2 <- parseR
259   return $ RightsecS p r1 r2
260  
261 -------------------------------------------------------------------------------
262  
263 parseAPPLY :: RParser
264 parseAPPLY = do
265   p <- getPosition
266   reserved "APPLY"
267   r1 <- parseR
268   r2 <- parseR
269   return $ ApplyS p r1 r2
270  
271 -------------------------------------------------------------------------------
272  
273 parseDEF :: RParser
274 parseDEF = do
275   p <- getPosition
276   reserved "DEF"
277   n <- identifier
278   t <- T.parseType
279   return $ DefS p n t
280  
281 -------------------------------------------------------------------------------
282  
283 parseVar :: RParser
284 parseVar = do
285   p <- getPosition
286   reserved "Var"
287   n <- identifier
288   return $ VarS p n
289  
290 -------------------------------------------------------------------------------
291  
292 parsePROD :: RParser
293 parsePROD = do
294   p <- getPosition
295   reserved "PROD"
296   r1 <- parseR
297   r2 <- parseR
298   return $ ProdS p r1 r2
299  
300 -------------------------------------------------------------------------------
301  
302 parseEITHER :: RParser
303 parseEITHER = do
304   p <- getPosition
305   reserved "EITHER"
306   r1 <- parseR
307   r2 <- parseR
308   return $ EitherS p r1 r2
309  
310 -------------------------------------------------------------------------------
311  
312 parseMAYBE :: RParser
313 parseMAYBE = do
314   p <- getPosition
315   reserved "MAYBE"
316   r <- parseR
317   return $ MaybeS p r
318  
319 -------------------------------------------------------------------------------
320  
321 parseLIST :: RParser
322 parseLIST = do
323   p <- getPosition
324   reserved "LIST"
325   r <- parseR
326   return $ ListS p r
327  
328 -------------------------------------------------------------------------------
329  
330 parseSET :: RParser
331 parseSET = do
332   p <- getPosition
333   reserved "SET"
334   r <- parseR
335   return $ SetS p r
336  
337 -------------------------------------------------------------------------------
338  
339 parseMAP :: RParser
340 parseMAP = do
341   p <- getPosition
342   reserved "MAP"
343   r <- parseR
344   return $ MapS p r
345  
346 -------------------------------------------------------------------------------
347  
348 5 paulosilva parseREYNOLDS :: RParser
349 parseREYNOLDS = do
350   p <- getPosition
351   reserved "REYNOLDS"
352   r1 <- parseR
353   r2 <- parseR
354   return $ ReynoldsS p r1 r2
355  
356 -------------------------------------------------------------------------------
357  
358 1 paulosilva parseFId :: RParser
359 parseFId = do
360   p <- getPosition
361   reserved "FId"
362   return $ FIdS p
363  
364 -------------------------------------------------------------------------------
365  
366 parseFComp :: RParser
367 parseFComp = do
368   p <- getPosition
369   reserved "FComp"
370   r1 <- parseR
371   r2 <- parseR
372   return $ FCompS p r1 r2
373  
374 -------------------------------------------------------------------------------
375  
376 parseOId :: RParser
377 parseOId = do
378   p <- getPosition
379   reserved "OId"
380   return $ OIdS p
381  
382 -------------------------------------------------------------------------------
383  
384 parseOComp :: RParser
385 parseOComp = do
386   p <- getPosition
387   reserved "OComp"
388   r1 <- parseR
389   r2 <- parseR
390   return $ OCompS p r1 r2
391  
392 -------------------------------------------------------------------------------
393  
394 parseOConv :: RParser
395 parseOConv = do
396   p <- getPosition
397   reserved "OConv"
398   r <- parseR
399   return $ OConvS p r
400  
401 -------------------------------------------------------------------------------
402  
403 parseOProd :: RParser
404 parseOProd = do
405   p <- getPosition
406   reserved "OProd"
407   r <- parseR
408   return $ OProdS p r
409  
410 -------------------------------------------------------------------------------
411  
412 parseOJoin :: RParser
413 parseOJoin = do
414   p <- getPosition
415   reserved "OJoin"
416   r <- parseR
417   return $ OJoinS p r
418  
419 -------------------------------------------------------------------------------
420  
421 parseOMeet :: RParser
422 parseOMeet = do
423   p <- getPosition
424   reserved "OMeet"
425   r <- parseR
426   return $ OMeetS p r
427  
428 -------------------------------------------------------------------------------
429  
430 parseOMax :: RParser
431 parseOMax = do
432   p <- getPosition
433   reserved "OMax"
434   r <- parseR
435   return $ OMaxS p r
436  
437 -------------------------------------------------------------------------------
438  
439 parseOMin :: RParser
440 parseOMin = do
441   p <- getPosition
442   reserved "OMin"
443   r <- parseR
444   return $ OMinS p r
445  
446 -------------------------------------------------------------------------------
447  
448 parseGDef :: RParser
449 parseGDef = do
450   p <- getPosition
451   reserved "GDef"
452   n <- identifier
453   f1 <- parseR
454   f2 <- parseR
455   o1 <- parseR
456   o2 <- parseR
457   return $ GDefS p n f1 f2 o1 o2
458  
459 -------------------------------------------------------------------------------
460  
461 parseGId :: RParser
462 parseGId = do
463   p <- getPosition
464   reserved "GId"
465   return $ GIdS p
466  
467 -------------------------------------------------------------------------------
468  
469 parseGComp :: RParser
470 parseGComp = do
471   p <- getPosition
472   reserved "GComp"
473   r1 <- parseR
474   r2 <- parseR
475   return $ GCompS p r1 r2
476  
477 -------------------------------------------------------------------------------
478  
479 parseGConv :: RParser
480 parseGConv = do
481   p <- getPosition
482   reserved "GConv"
483   r <- parseR
484   return $ GConvS p r
485  
486 -------------------------------------------------------------------------------
487  
488 parseGLAdj :: RParser
489 parseGLAdj = do
490   p <- getPosition
491   reserved "GLAdj"
492   r <- parseR
493   return $ GLAdjS p r
494  
495 -------------------------------------------------------------------------------
496  
497 parseGUAdj :: RParser
498 parseGUAdj = do
499   p <- getPosition
500   reserved "GUAdj"
501   r <- parseR
502   return $ GUAdjS p r
503  
504 -------------------------------------------------------------------------------
505  
506 parseGLOrd :: RParser
507 parseGLOrd = do
508   p <- getPosition
509   reserved "GLOrd"
510   r <- parseR
511   return $ GLOrdS p r
512  
513 -------------------------------------------------------------------------------
514  
515 parseGUOrd :: RParser
516 parseGUOrd = do
517   p <- getPosition
518   reserved "GUOrd"
519   r <- parseR
520   return $ GUOrdS p r
521  
522 -------------------------------------------------------------------------------
523  

Theme by Vikram Singh | Powered by WebSVN v2.3.3