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 |