838a348d31229339bb4ab9bf97da64d5e692bf75
[ghc-base.git] / Text / ParserCombinators / Parsec / Language.hs
1 -----------------------------------------------------------------------------
2 -- |
3 -- Module      :  Text.ParserCombinators.Parsec.Language
4 -- Copyright   :  (c) Daan Leijen 1999-2001
5 -- License     :  BSD-style (see the file libraries/base/LICENSE)
6 -- 
7 -- Maintainer  :  daan@cs.uu.nl
8 -- Stability   :  provisional
9 -- Portability :  non-portable (uses non-portable module Text.ParserCombinators.Parsec.Token)
10 --
11 -- A helper module that defines some language definitions that can be used
12 -- to instantiate a token parser (see "Text.ParserCombinators.Parsec.Token").
13 -- 
14 -----------------------------------------------------------------------------
15
16 module Text.ParserCombinators.Parsec.Language
17                      ( haskellDef, haskell
18                      , mondrianDef, mondrian
19                    
20                      , emptyDef
21                      , haskellStyle
22                      , javaStyle   
23                      , LanguageDef (..)                
24                      ) where
25 import Text.ParserCombinators.Parsec
26 import Text.ParserCombinators.Parsec.Token 
27
28            
29 -----------------------------------------------------------
30 -- Styles: haskellStyle, javaStyle
31 -----------------------------------------------------------               
32 haskellStyle= emptyDef                      
33                 { commentStart   = "{-"
34                 , commentEnd     = "-}"
35                 , commentLine    = "--"
36                 , nestedComments = True
37                 , identStart     = letter
38                 , identLetter    = alphaNum <|> oneOf "_'"
39                 , opStart        = opLetter haskellStyle
40                 , opLetter       = oneOf ":!#$%&*+./<=>?@\\^|-~"              
41                 , reservedOpNames= []
42                 , reservedNames  = []
43                 , caseSensitive  = True                                   
44                 }         
45                            
46 javaStyle   = emptyDef
47                 { commentStart   = "/*"
48                 , commentEnd     = "*/"
49                 , commentLine    = "//"
50                 , nestedComments = True
51                 , identStart     = letter
52                 , identLetter    = alphaNum <|> oneOf "_'"              
53                 , reservedNames  = []
54                 , reservedOpNames= []   
55                 , caseSensitive  = False                                  
56                 }
57
58 -----------------------------------------------------------
59 -- minimal language definition
60 -----------------------------------------------------------                
61 emptyDef    = LanguageDef 
62                { commentStart   = ""
63                , commentEnd     = ""
64                , commentLine    = ""
65                , nestedComments = True
66                , identStart     = letter <|> char '_'
67                , identLetter    = alphaNum <|> oneOf "_'"
68                , opStart        = opLetter emptyDef
69                , opLetter       = oneOf ":!#$%&*+./<=>?@\\^|-~"
70                , reservedOpNames= []
71                , reservedNames  = []
72                , caseSensitive  = True
73                }
74                 
75
76
77 -----------------------------------------------------------
78 -- Haskell
79 -----------------------------------------------------------               
80 haskell :: TokenParser st
81 haskell      = makeTokenParser haskellDef
82
83 haskellDef   = haskell98Def
84                 { identLetter    = identLetter haskell98Def <|> char '#'
85                 , reservedNames  = reservedNames haskell98Def ++ 
86                                    ["foreign","import","export","primitive"
87                                    ,"_ccall_","_casm_"
88                                    ,"forall"
89                                    ]
90                 }
91                             
92 haskell98Def = haskellStyle
93                 { reservedOpNames= ["::","..","=","\\","|","<-","->","@","~","=>"]
94                 , reservedNames  = ["let","in","case","of","if","then","else",
95                                     "data","type",
96                                     "class","default","deriving","do","import",
97                                     "infix","infixl","infixr","instance","module",
98                                     "newtype","where",
99                                     "primitive"
100                                     -- "as","qualified","hiding"
101                                    ]
102                 }         
103                 
104                 
105 -----------------------------------------------------------
106 -- Mondrian
107 -----------------------------------------------------------               
108 mondrian :: TokenParser st
109 mondrian    = makeTokenParser mondrianDef
110
111 mondrianDef = javaStyle
112                 { reservedNames = [ "case", "class", "default", "extends"
113                                   , "import", "in", "let", "new", "of", "package"
114                                   ]     
115                 , caseSensitive  = True                           
116                 }
117
118