Line No. | Rev | Author | Line |
---|---|---|---|
1 | 1 | paulosilva | |
2 | {-# OPTIONS_GHC -Wall #-} | ||
3 | |||
4 | ------------------------------------------------------------------------------- | ||
5 | |||
6 | {- | | ||
7 | Module : Language.Law.Parser | ||
8 | Description : | ||
9 | Copyright : (c) Paulo Silva | ||
10 | License : LGPL | ||
11 | |||
12 | Maintainer : paufil@di.uminho.pt | ||
13 | Stability : experimental | ||
14 | Portability : portable | ||
15 | |||
16 | <description of the module> | ||
17 | -} | ||
18 | |||
19 | ------------------------------------------------------------------------------- | ||
20 | |||
21 | module Language.Law.Parser ( | ||
22 | parser, | ||
23 | parseLaw | ||
24 | ) where | ||
25 | |||
26 | import Control.Monad | ||
27 | import Language.Law.SyntaxADT | ||
28 | import qualified Language.R.Parser as R | ||
29 | --import Language.R.SyntaxADT | ||
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 LawParser = Parser LawS | ||
37 | |||
38 | ------------------------------------------------------------------------------- | ||
39 | |||
40 | reservNames :: [String] | ||
41 | reservNames = ["EQUIV", "IMPL"] | ||
42 | |||
43 | lexer :: P.TokenParser st | ||
44 | lexer = P.makeTokenParser $ emptyDef { P.reservedNames = reservNames } | ||
45 | |||
46 | ------------------------------------------------------------------------------- | ||
47 | |||
48 | reserved :: String -> CharParser st () | ||
49 | reserved = P.reserved lexer | ||
50 | |||
51 | whiteSpace :: CharParser st () | ||
52 | whiteSpace = P.whiteSpace lexer | ||
53 | |||
54 | identifier :: CharParser st String | ||
55 | identifier = P.identifier lexer | ||
56 | |||
57 | ------------------------------------------------------------------------------- | ||
58 | |||
59 | parser :: String -> Either ParseError LawS | ||
60 | parser = parse mainLawParser "" | ||
61 | |||
62 | ------------------------------------------------------------------------------- | ||
63 | |||
64 | mainLawParser :: LawParser | ||
65 | mainLawParser = do | ||
66 | whiteSpace | ||
67 | l <- parseLaw | ||
68 | eof | ||
69 | return l | ||
70 | |||
71 | ------------------------------------------------------------------------------- | ||
72 | |||
73 | parseLaw :: LawParser | ||
74 | parseLaw = | ||
75 | parseEquiv <|> | ||
76 | parseImpl | ||
77 | |||
78 | ------------------------------------------------------------------------------- | ||
79 | |||
80 | parseEquiv :: LawParser | ||
81 | parseEquiv = do | ||
82 | p <- getPosition | ||
83 | reserved "EQUIV" | ||
84 | ident <- identifier | ||
85 | r1 <- R.parseR | ||
86 | r2 <- R.parseR | ||
87 | return $ EquivS p ident r1 r2 | ||
88 | |||
89 | ------------------------------------------------------------------------------- | ||
90 | |||
91 | parseImpl :: LawParser | ||
92 | parseImpl = do | ||
93 | p <- getPosition | ||
94 | reserved "IMPL" | ||
95 | ident <- identifier | ||
96 | r1 <- R.parseR | ||
97 | r2 <- R.parseR | ||
98 | return $ ImplS p ident r1 r2 | ||
99 | |||
100 | ------------------------------------------------------------------------------- | ||
101 | |||
102 | |||
103 | |||
104 |