Subversion

Galculator

?curdirlinks? -

Blame information for rev 1

Line No. Rev Author Line
1 1 paulosilva  
2 {-# LANGUAGE FlexibleContexts #-}
3 {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Language.Module.Parser
9 Description :  
10 Copyright   :  (c) Paulo Silva
11 License     :  LGPL
12  
13 Maintainer  :  paufil@di.uminho.pt
14 Stability   :  experimental
15 Portability :  portable
16  
17 <description of the module>
18 -}
19  
20 -------------------------------------------------------------------------------
21  
22 module Language.Module.Parser (
23   parser
24  ) where
25  
26 import Control.GalcError
27 import Control.Monad.Error
28 import Language.Law.Parser hiding (parser)
29 import Language.Law.SyntaxADT
30 import qualified Language.Law.SyntaxADT as L
31 import Language.Module.SyntaxADT
32 import Language.R.Parser hiding (parser)
33 import Language.R.SyntaxADT
34 import Text.ParserCombinators.Parsec
35 import Text.ParserCombinators.Parsec.Char
36 import Text.ParserCombinators.Parsec.Language
37 import qualified Text.ParserCombinators.Parsec.Token as P
38  
39 -------------------------------------------------------------------------------
40  
41 type ModuleParser = Parser ModuleS
42  
43 -------------------------------------------------------------------------------
44  
45 reservNames :: [String]
46 reservNames = ["module"]
47  
48 -------------------------------------------------------------------------------
49  
50 lexer :: P.TokenParser st
51 lexer = P.makeTokenParser $ haskellStyle { P.reservedNames = reservNames }
52  
53 -------------------------------------------------------------------------------
54  
55 reserved :: String -> CharParser st ()
56 reserved = P.reserved lexer
57  
58 whiteSpace :: CharParser st ()
59 whiteSpace = P.whiteSpace lexer
60  
61 {-
62 parens :: CharParser st Module -> CharParser st Module
63 parens = P.parens lexer
64 -}
65  
66 identifier :: CharParser st String
67 identifier = P.identifier lexer
68  
69 semi :: CharParser st String
70 semi = P.semi lexer
71  
72 -------------------------------------------------------------------------------
73  
74 parser :: MonadError GalcError m => String -> m ModuleS
75 parser = either2error (ParsingError . show) . parse mainModuleParser ""
76  
77 -------------------------------------------------------------------------------
78  
79 mainModuleParser :: ModuleParser
80 mainModuleParser = do
81   whiteSpace
82   m <- parseModule
83   eof
84   return m
85  
86 -------------------------------------------------------------------------------
87  
88 data Union = L LawS | G S | D S
89  
90 parseModule :: ModuleParser
91 parseModule = do
92   reserved "module"
93   ident <- identifier
94   lst <- ((do l <- parseLaw
95               return $ L l)
96           <|>
97           (do g <- parseGDef
98               return $ G g)
99           <|>
100           (do d <- parseDEF
101               return $ D d)) `sepEndBy` semi
102   let (lws,gcs',defs) = union2List lst
103   return $ ModuleS { nameS = ident,
104                      lawsS = lws,
105                      gcsS = gcs',
106                      definitionsS = defs }
107  
108 -------------------------------------------------------------------------------
109  
110 union2List :: [Union] -> ([LawS],[S],[S])
111 union2List = foldl aux ([],[],[])
112   where aux (law,gc,def) (L law') = (law':law, gc, def)
113         aux (law,gc,def) (G gc') = (law, gc':gc, def)
114         aux (law,gc,def) (D def') = (law, gc, def':def)
115  
116 -------------------------------------------------------------------------------
117  

Theme by Vikram Singh | Powered by WebSVN v2.3.3