/
Language.purs
118 lines (106 loc) · 4.71 KB
/
Language.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
module Text.Parsing.Parser.Language
( haskellDef
, haskell
, emptyDef
, haskellStyle
, javaStyle
)
where
import Prelude
import Control.Alt ((<|>))
import Text.Parsing.Parser (ParserT)
import Text.Parsing.Parser.String (char, oneOf)
import Text.Parsing.Parser.Token (LanguageDef, TokenParser, GenLanguageDef(..), unGenLanguageDef, makeTokenParser, alphaNum, letter)
-----------------------------------------------------------
-- Styles: haskellStyle, javaStyle
-----------------------------------------------------------
-- | This is a minimal token definition for Haskell style languages. It
-- | defines the style of comments, valid identifiers and case
-- | sensitivity. It does not define any reserved words or operators.
haskellStyle :: LanguageDef
haskellStyle = LanguageDef (unGenLanguageDef emptyDef)
{ commentStart = "{-"
, commentEnd = "-}"
, commentLine = "--"
, nestedComments = true
, identStart = letter
, identLetter = alphaNum <|> oneOf ['_', '\'']
, opStart = op'
, opLetter = op'
, reservedOpNames = []
, reservedNames = []
, caseSensitive = true
}
where
op' :: forall m . (Monad m) => ParserT String m Char
op' = oneOf [':', '!', '#', '$', '%', '&', '*', '+', '.', '/', '<', '=', '>', '?', '@', '\\', '^', '|', '-', '~']
-- | This is a minimal token definition for Java style languages. It
-- | defines the style of comments, valid identifiers and case
-- | sensitivity. It does not define any reserved words or operators.
javaStyle :: LanguageDef
javaStyle = LanguageDef (unGenLanguageDef emptyDef)
{ commentStart = "/*"
, commentEnd = "*/"
, commentLine = "//"
, nestedComments = true
, identStart = letter <|> oneOf ['_', '$']
, identLetter = alphaNum <|> oneOf ['_', '$']
, reservedNames = []
, reservedOpNames = []
, caseSensitive = false
}
-----------------------------------------------------------
-- minimal language definition
--------------------------------------------------------
-- | This is the most minimal token definition. It is recommended to use
-- | this definition as the basis for other definitions. `emptyDef` has
-- | no reserved names or operators, is case sensitive and doesn't accept
-- | comments, identifiers or operators.
emptyDef :: LanguageDef
emptyDef = LanguageDef
{ commentStart: ""
, commentEnd: ""
, commentLine: ""
, nestedComments: true
, identStart: letter <|> char '_'
, identLetter: alphaNum <|> oneOf ['_', '\'']
, opStart: op'
, opLetter: op'
, reservedOpNames: []
, reservedNames: []
, caseSensitive: true
}
where
op' :: forall m . (Monad m) => ParserT String m Char
op' = oneOf [':', '!', '#', '$', '%', '&', '*', '+', '.', '/', '<', '=', '>', '?', '@', '\\', '^', '|', '-', '~']
-- -----------------------------------------------------------
-- -- Haskell
-- -----------------------------------------------------------
-- | A lexer for the haskell language.
haskell :: TokenParser
haskell = makeTokenParser haskellDef
-- | The language definition for the Haskell language.
haskellDef :: LanguageDef
haskellDef =
case haskell98Def of
(LanguageDef def) -> LanguageDef def
{ identLetter = def.identLetter <|> char '#'
, reservedNames = def.reservedNames <>
["foreign","import","export","primitive"
,"_ccall_","_casm_"
,"forall"
]
}
-- | The language definition for the language Haskell98.
haskell98Def :: LanguageDef
haskell98Def = LanguageDef (unGenLanguageDef haskellStyle)
{ reservedOpNames = ["::","..","=","\\","|","<-","->","@","~","=>"]
, reservedNames = [ "let","in","case","of","if","then","else"
, "data","type"
, "class","default","deriving","do","import"
, "infix","infixl","infixr","instance","module"
, "newtype","where"
, "primitive"
-- "as","qualified","hiding"
]
}