s3e: fix build break
[calu.git] / 3a_asm / Text / Parsec / Language.hs
1 -----------------------------------------------------------------------------
2 -- |
3 -- Module      :  Text.Parsec.Language
4 -- Copyright   :  (c) Daan Leijen 1999-2001, (c) Paolo Martini 2007
5 -- License     :  BSD-style (see the LICENSE file)
6 -- 
7 -- Maintainer  :  derek.a.elkins@gmail.com
8 -- Stability   :  provisional
9 -- Portability :  non-portable (uses non-portable module Text.Parsec.Token)
10 --
11 -- A helper module that defines some language definitions that can be used
12 -- to instantiate a token parser (see "Text.Parsec.Token").
13 -- 
14 -----------------------------------------------------------------------------
15
16 module Text.Parsec.Language
17     ( haskellDef, haskell
18     , mondrianDef, mondrian
19     , emptyDef
20     , haskellStyle
21     , javaStyle
22     , LanguageDef
23     , GenLanguageDef
24     ) where
25
26 import Text.Parsec
27 import Text.Parsec.Token
28
29 -----------------------------------------------------------
30 -- Styles: haskellStyle, javaStyle
31 -----------------------------------------------------------
32
33 -- | This is a minimal token definition for Haskell style languages. It
34 -- defines the style of comments, valid identifiers and case
35 -- sensitivity. It does not define any reserved words or operators.
36
37 haskellStyle :: LanguageDef st
38 haskellStyle = emptyDef
39                 { commentStart   = "{-"
40                 , commentEnd     = "-}"
41                 , commentLine    = "--"
42                 , nestedComments = True
43                 , identStart     = letter
44                 , identLetter    = alphaNum <|> oneOf "_'"
45                 , opStart        = opLetter haskellStyle
46                 , opLetter       = oneOf ":!#$%&*+./<=>?@\\^|-~"
47                 , reservedOpNames= []
48                 , reservedNames  = []
49                 , caseSensitive  = True
50                 }
51
52 -- | This is a minimal token definition for Java style languages. It
53 -- defines the style of comments, valid identifiers and case
54 -- sensitivity. It does not define any reserved words or operators.
55
56 javaStyle  :: LanguageDef st
57 javaStyle   = emptyDef
58                 { commentStart   = "/*"
59                 , commentEnd     = "*/"
60                 , commentLine    = "//"
61                 , nestedComments = True
62                 , identStart     = letter
63                 , identLetter    = alphaNum <|> oneOf "_'"
64                 , reservedNames  = []
65                 , reservedOpNames= []
66                 , caseSensitive  = False
67                 }
68
69 -----------------------------------------------------------
70 -- minimal language definition
71 --------------------------------------------------------
72
73 -- TODO: This seems wrong
74 -- < This is the most minimal token definition. It is recommended to use
75 -- this definition as the basis for other definitions. @emptyDef@ has
76 -- no reserved names or operators, is case sensitive and doesn't accept
77 -- comments, identifiers or operators.
78
79 emptyDef   :: LanguageDef st
80 emptyDef    = LanguageDef
81                { commentStart   = ""
82                , commentEnd     = ""
83                , commentLine    = ""
84                , nestedComments = True
85                , identStart     = letter <|> char '_'
86                , identLetter    = alphaNum <|> oneOf "_'"
87                , opStart        = opLetter emptyDef
88                , opLetter       = oneOf ":!#$%&*+./<=>?@\\^|-~"
89                , reservedOpNames= []
90                , reservedNames  = []
91                , caseSensitive  = True
92                }
93
94
95
96 -----------------------------------------------------------
97 -- Haskell
98 -----------------------------------------------------------
99
100 -- | A lexer for the haskell language.
101
102 haskell :: TokenParser st
103 haskell      = makeTokenParser haskellDef
104
105 -- | The language definition for the Haskell language.
106
107 haskellDef  :: LanguageDef st
108 haskellDef   = haskell98Def
109                 { identLetter    = identLetter haskell98Def <|> char '#'
110                 , reservedNames  = reservedNames haskell98Def ++
111                                    ["foreign","import","export","primitive"
112                                    ,"_ccall_","_casm_"
113                                    ,"forall"
114                                    ]
115                 }
116
117 -- | The language definition for the language Haskell98.
118
119 haskell98Def :: LanguageDef st
120 haskell98Def = haskellStyle
121                 { reservedOpNames= ["::","..","=","\\","|","<-","->","@","~","=>"]
122                 , reservedNames  = ["let","in","case","of","if","then","else",
123                                     "data","type",
124                                     "class","default","deriving","do","import",
125                                     "infix","infixl","infixr","instance","module",
126                                     "newtype","where",
127                                     "primitive"
128                                     -- "as","qualified","hiding"
129                                    ]
130                 }
131
132
133 -----------------------------------------------------------
134 -- Mondrian
135 -----------------------------------------------------------
136
137 -- | A lexer for the mondrian language.
138
139 mondrian :: TokenParser st
140 mondrian    = makeTokenParser mondrianDef
141
142 -- | The language definition for the language Mondrian.
143
144 mondrianDef :: LanguageDef st
145 mondrianDef = javaStyle
146                 { reservedNames = [ "case", "class", "default", "extends"
147                                   , "import", "in", "let", "new", "of", "package"
148                                   ]
149                 , caseSensitive  = True
150                 }