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.Derivation.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 -}
18  
19 -------------------------------------------------------------------------------
20  
21 module Language.Derivation.Parser (
22   parser,
23   parseDeriv
24  ) where
25  
26 import Control.GalcError
27 import Control.Monad.Error
28 import Language.Derivation.Syntax
29 import Text.ParserCombinators.Parsec
30 import Text.ParserCombinators.Parsec.Language
31 import qualified Text.ParserCombinators.Parsec.Token as P
32  
33 -------------------------------------------------------------------------------
34  
35 type DerivParser = Parser Derivation
36  
37 -------------------------------------------------------------------------------
38  
39 reservNames :: [String]
40 reservNames = derivations
41  
42 -------------------------------------------------------------------------------
43  
44 lexer :: P.TokenParser st
45 lexer = P.makeTokenParser $ emptyDef { P.reservedNames = reservNames }
46  
47 -------------------------------------------------------------------------------
48  
49 reserved :: String -> CharParser st ()
50 reserved = P.reserved lexer
51  
52 whiteSpace :: CharParser st ()
53 whiteSpace = P.whiteSpace lexer
54  
55 identifier :: CharParser st String
56 identifier = P.identifier lexer
57  
58 -------------------------------------------------------------------------------
59  
60 parser :: MonadError GalcError m => String -> m Derivation
61 parser = either2error (ParsingError . show) . parse mainDerivParser ""
62  
63 -------------------------------------------------------------------------------
64  
65 mainDerivParser :: DerivParser
66 mainDerivParser = do
67   whiteSpace
68   t <- parseDeriv
69   eof
70   return t
71  
72 -------------------------------------------------------------------------------
73  
74 parseDeriv :: DerivParser
75 parseDeriv =
76   parseInv  <|>
77   parseShunt <|>
78   parseDistrLow <|>
79   parseDistrUp <|>
80   parseMonotUp <|>
81   parseMonotLow <|>
82   parseTopPreserv <|>
83   parseBotPreserv <|>
84   parseCancUp <|>
85   parseCancLow <|>
86   parseFree <|>
87   parseApply
88  
89 -------------------------------------------------------------------------------
90  
91 parseInv :: DerivParser
92 parseInv = do
93   reserved "inv"
94   drv <- parseDeriv
95   return $ Inv drv
96  
97 -------------------------------------------------------------------------------
98  
99 parseShunt :: DerivParser
100 parseShunt = do
101   reserved "shunt"
102   ident <- identifier
103   return $ Shunt ident
104  
105 -------------------------------------------------------------------------------
106  
107 parseDistrLow :: DerivParser
108 parseDistrLow = do
109   reserved "distr_low"
110   ident <- identifier
111   return $ DistrLow ident
112  
113 -------------------------------------------------------------------------------
114  
115 parseDistrUp :: DerivParser
116 parseDistrUp = do
117   reserved "distr_up"
118   ident <- identifier
119   return $ DistrUp ident
120  
121 -------------------------------------------------------------------------------
122  
123 parseMonotUp :: DerivParser
124 parseMonotUp = do
125   reserved "monot_up"
126   ident <- identifier
127   return $ MonotUp ident
128  
129 -------------------------------------------------------------------------------
130  
131 parseMonotLow :: DerivParser
132 parseMonotLow = do
133   reserved "monot_low"
134   ident <- identifier
135   return $ MonotLow ident
136  
137 -------------------------------------------------------------------------------
138  
139 parseTopPreserv :: DerivParser
140 parseTopPreserv = do
141   reserved "top_preserving"
142   ident <- identifier
143   return $ TopPreserv ident
144  
145 -------------------------------------------------------------------------------
146  
147 parseBotPreserv :: DerivParser
148 parseBotPreserv = do
149   reserved "bot_preserving"
150   ident <- identifier
151   return $ BotPreserv ident
152  
153 -------------------------------------------------------------------------------
154  
155 parseCancUp :: DerivParser
156 parseCancUp = do
157   reserved "canc_up"
158   ident <- identifier
159   return $ CancUp ident
160  
161 -------------------------------------------------------------------------------
162  
163 parseCancLow :: DerivParser
164 parseCancLow = do
165   reserved "canc_low"
166   ident <- identifier
167   return $ CancLow ident
168  
169 -------------------------------------------------------------------------------
170  
171 parseFree :: DerivParser
172 parseFree = do
173   reserved "free"
174   ident <- identifier
175   return $ Free ident
176  
177 -------------------------------------------------------------------------------
178  
179 parseApply  :: DerivParser
180 parseApply  = do
181   reserved "apply"
182   ident <- identifier
183   return $ Apply ident
184  
185 -------------------------------------------------------------------------------
186  
187  

Theme by Vikram Singh | Powered by WebSVN v2.3.3