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.Type.Parser
9 Description :  Parser of the type 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.Type.Parser (
22   parser,
23   parseType
24  ) where
25  
26 import Control.GalcError
27 import Control.Monad.Error
28 import Data.Existential
29 import Language.Type.Syntax
30 import Text.ParserCombinators.Parsec
31 import Text.ParserCombinators.Parsec.Language
32 import qualified Text.ParserCombinators.Parsec.Token as P
33  
34 -------------------------------------------------------------------------------
35  
36 type TypeParser = Parser TypeBox
37  
38 -------------------------------------------------------------------------------
39  
40 reservNames :: [String]
41 reservNames = [
42   "TVar", "One", "Bool", "Char", "String", "Int", "Float", "Prod",
43   "Either", "Maybe", "List", "Set", "Map", "Fun", "Rel", "Ord", "GC"
44  ]
45  
46 -------------------------------------------------------------------------------
47  
48 lexer :: P.TokenParser st
49 lexer = P.makeTokenParser $ emptyDef { P.reservedNames = reservNames }
50  
51 -------------------------------------------------------------------------------
52  
53 reserved :: String -> CharParser st ()
54 reserved = P.reserved lexer
55  
56 whiteSpace :: CharParser st ()
57 whiteSpace = P.whiteSpace lexer
58  
59 parens :: CharParser st TypeBox -> CharParser st TypeBox
60 parens = P.parens lexer
61  
62 identifier :: CharParser st String
63 identifier = P.identifier lexer
64  
65 -------------------------------------------------------------------------------
66  
67 parser :: MonadError GalcError m => String -> m TypeBox
68 parser = either2error (ParsingError . show) . parse mainTypeParser ""
69  
70 -------------------------------------------------------------------------------
71  
72 mainTypeParser :: TypeParser
73 mainTypeParser = do
74   whiteSpace
75   t <- parseType
76   eof
77   return t
78  
79 -------------------------------------------------------------------------------
80  
81 parseType :: TypeParser
82 parseType =
83   parens parseType <|>
84   parseTVar <|>
85   parseOne <|>
86   parseBool <|>
87   parseChar <|>
88   parseString <|>
89   parseInt <|>
90   parseFloat <|>
91   parseProd <|>
92   parseEither <|>
93   parseMaybe <|>
94   parseList <|>
95   parseSet <|>
96   parseMap <|>
97   parseFun <|>
98   parseRel <|>
99   parseOrd <|>
100   parseGC
101  
102 -------------------------------------------------------------------------------
103  
104 parseTVar :: TypeParser
105 parseTVar = do
106   reserved "TVar"
107   tid <- identifier
108   return $ Hide $ TVar tid
109  
110 -------------------------------------------------------------------------------
111  
112 parseOne :: TypeParser
113 parseOne = do
114   reserved "One"
115   return $ Hide One
116  
117 -------------------------------------------------------------------------------
118  
119 parseBool :: TypeParser
120 parseBool = do
121   reserved "Bool"
122   return $ Hide Bool
123  
124 -------------------------------------------------------------------------------
125  
126 parseChar :: TypeParser
127 parseChar = do
128   reserved "Char"
129   return $ Hide Char
130  
131 -------------------------------------------------------------------------------
132  
133 parseString :: TypeParser
134 parseString = do
135   reserved "String"
136   return $ Hide String
137  
138 -------------------------------------------------------------------------------
139  
140 parseInt :: TypeParser
141 parseInt = do
142   reserved "Int"
143   return $ Hide Int
144  
145 -------------------------------------------------------------------------------
146  
147 parseFloat :: TypeParser
148 parseFloat = do
149   reserved "Float"
150   return $ Hide Float
151  
152 -------------------------------------------------------------------------------
153  
154 parseProd :: TypeParser
155 parseProd = do
156   reserved "Prod"
157   Hide t1 <- parseType
158   Hide t2 <- parseType
159   return $ Hide (Prod t1 t2)
160  
161 -------------------------------------------------------------------------------
162  
163 parseEither :: TypeParser
164 parseEither = do
165   reserved "Either"
166   Hide t1 <- parseType
167   Hide t2 <- parseType
168   return $ Hide (Either t1 t2)
169  
170 -------------------------------------------------------------------------------
171  
172 parseMaybe :: TypeParser
173 parseMaybe = do
174   reserved "Maybe"
175   Hide t1 <- parseType
176   return $ Hide (Maybe t1)
177  
178 -------------------------------------------------------------------------------
179  
180 parseList :: TypeParser
181 parseList = do
182   reserved "List"
183   Hide t1 <- parseType
184   return $ Hide (List t1)
185  
186 -------------------------------------------------------------------------------
187  
188 parseSet :: TypeParser
189 parseSet = do
190   reserved "Set"
191   Hide t1 <- parseType
192   return $ Hide (Set t1)
193  
194 -------------------------------------------------------------------------------
195  
196 parseMap :: TypeParser
197 parseMap = do
198   reserved "Map"
199   Hide t1 <- parseType
200   Hide t2 <- parseType
201   return $ Hide (Map t1 t2)
202  
203 -------------------------------------------------------------------------------
204  
205 parseFun :: TypeParser
206 parseFun = do
207   reserved "Fun"
208   Hide t1 <- parseType
209   Hide t2 <- parseType
210   return $ Hide (Fun t1 t2)
211  
212 -------------------------------------------------------------------------------
213  
214 parseRel :: TypeParser
215 parseRel = do
216   reserved "Rel"
217   Hide t1 <- parseType
218   Hide t2 <- parseType
219   return $ Hide (Rel t1 t2)
220  
221 -------------------------------------------------------------------------------
222  
223 parseOrd :: TypeParser
224 parseOrd = do
225   reserved "Ord"
226   Hide t1 <- parseType
227   return $ Hide (Ord t1)
228  
229 -------------------------------------------------------------------------------
230  
231 parseGC :: TypeParser
232 parseGC = do
233   reserved "GC"
234   Hide t1 <- parseType
235   Hide t2 <- parseType
236   return $ Hide (GC t1 t2)
237  
238 -------------------------------------------------------------------------------

Theme by Vikram Singh | Powered by WebSVN v2.3.3