1 -----------------------------------------------------------------------------
3 -- Module : Text.Parsec.Language
4 -- Copyright : (c) Daan Leijen 1999-2001, (c) Paolo Martini 2007
5 -- License : BSD-style (see the LICENSE file)
7 -- Maintainer : derek.a.elkins@gmail.com
8 -- Stability : provisional
9 -- Portability : non-portable (uses non-portable module Text.Parsec.Token)
11 -- A helper module that defines some language definitions that can be used
12 -- to instantiate a token parser (see "Text.Parsec.Token").
14 -----------------------------------------------------------------------------
16 module Text.Parsec.Language
18 , mondrianDef, mondrian
27 import Text.Parsec.Token
29 -----------------------------------------------------------
30 -- Styles: haskellStyle, javaStyle
31 -----------------------------------------------------------
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.
37 haskellStyle :: LanguageDef st
38 haskellStyle = emptyDef
42 , nestedComments = True
44 , identLetter = alphaNum <|> oneOf "_'"
45 , opStart = opLetter haskellStyle
46 , opLetter = oneOf ":!#$%&*+./<=>?@\\^|-~"
49 , caseSensitive = True
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.
56 javaStyle :: LanguageDef st
61 , nestedComments = True
63 , identLetter = alphaNum <|> oneOf "_'"
66 , caseSensitive = False
69 -----------------------------------------------------------
70 -- minimal language definition
71 --------------------------------------------------------
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.
79 emptyDef :: LanguageDef st
80 emptyDef = LanguageDef
84 , nestedComments = True
85 , identStart = letter <|> char '_'
86 , identLetter = alphaNum <|> oneOf "_'"
87 , opStart = opLetter emptyDef
88 , opLetter = oneOf ":!#$%&*+./<=>?@\\^|-~"
91 , caseSensitive = True
96 -----------------------------------------------------------
98 -----------------------------------------------------------
100 -- | A lexer for the haskell language.
102 haskell :: TokenParser st
103 haskell = makeTokenParser haskellDef
105 -- | The language definition for the Haskell language.
107 haskellDef :: LanguageDef st
108 haskellDef = haskell98Def
109 { identLetter = identLetter haskell98Def <|> char '#'
110 , reservedNames = reservedNames haskell98Def ++
111 ["foreign","import","export","primitive"
117 -- | The language definition for the language Haskell98.
119 haskell98Def :: LanguageDef st
120 haskell98Def = haskellStyle
121 { reservedOpNames= ["::","..","=","\\","|","<-","->","@","~","=>"]
122 , reservedNames = ["let","in","case","of","if","then","else",
124 "class","default","deriving","do","import",
125 "infix","infixl","infixr","instance","module",
128 -- "as","qualified","hiding"
133 -----------------------------------------------------------
135 -----------------------------------------------------------
137 -- | A lexer for the mondrian language.
139 mondrian :: TokenParser st
140 mondrian = makeTokenParser mondrianDef
142 -- | The language definition for the language Mondrian.
144 mondrianDef :: LanguageDef st
145 mondrianDef = javaStyle
146 { reservedNames = [ "case", "class", "default", "extends"
147 , "import", "in", "let", "new", "of", "package"
149 , caseSensitive = True