@@ -16,14 +16,11 @@
1616
1717module Language.PureScript.Parser.Common where
1818
19−import Data.Char (isSpace)
19+import Data.Functor.Identity
2020import Control.Applicative
2121import Control.Monad
22−import Control.Monad.State
2322import Language.PureScript.Parser.State
24−import qualified Data.Map as M
2523import qualified Text.Parsec as P
26−import qualified Text.Parsec.Pos as P
2724import qualified Text.Parsec.Token as PT
2825
2926import Language.PureScript.Names
@@ -77,7 +74,7 @@ reservedNames = [ "case"
7774
7875builtInOperators :: [String]
7976builtInOperators = [ "~", "-", "<=", ">=", "<", ">", "*", "/", "%", "++", "+", "<<", ">>>", ">>"
80− , "==", "!=", "&&", "||", "&", "^", "|", "!!", "!" ]
77+ , "==", "!=", "&&", "||", "&", "^", "|", "!!", "!", ":" ]
8178
8279reservedOpNames :: [String]
8380reservedOpNames = builtInOperators ++ [ "->" ]
@@ -92,11 +89,12 @@ identLetter :: P.Parsec String u Char
9289identLetter = P.alphaNum <|> P.oneOf "_'"
9390
9491opStart :: P.Parsec String u Char
95−opStart = P.oneOf "!#$%&*+/<=>?@^|~"
92+opStart = P.oneOf "!#$%&*+/<=>?@^|~:"
9693
9794opLetter :: P.Parsec String u Char
9895opLetter = P.oneOf ":#$%&*+./<=>?@^|"
9996
97+langDef :: PT.GenLanguageDef String u Identity
10098langDef = PT.LanguageDef
10199 { PT.reservedNames = reservedNames
102100 , PT.reservedOpNames = reservedOpNames
@@ -111,36 +109,80 @@ langDef = PT.LanguageDef
111109 , PT.caseSensitive = True
112110 }
113111
112+tokenParser :: PT.GenTokenParser String u Identity
114113tokenParser = PT.makeTokenParser langDef
115114
116−lexeme = PT.lexeme tokenParser
117−identifier = PT.identifier tokenParser
118−reserved = PT.reserved tokenParser
119−reservedOp = PT.reservedOp tokenParser
120−operator = PT.operator tokenParser
121−stringLiteral = PT.stringLiteral tokenParser
122−whiteSpace = PT.whiteSpace tokenParser
123−squares = PT.squares tokenParser
124−semi = PT.semi tokenParser
125−comma = PT.comma tokenParser
126−colon = PT.colon tokenParser
127−dot = PT.dot tokenParser
128−natural = PT.natural tokenParser
115+lexeme :: P.Parsec String u a -> P.Parsec String u a
116+lexeme = PT.lexeme tokenParser
129117
118+identifier :: P.Parsec String u String
119+identifier = PT.identifier tokenParser
120+
121+reserved :: String -> P.Parsec String u ()
122+reserved = PT.reserved tokenParser
123+
124+reservedOp :: String -> P.Parsec String u ()
125+reservedOp = PT.reservedOp tokenParser
126+
127+operator :: P.Parsec String u String
128+operator = PT.operator tokenParser
129+
130+stringLiteral :: P.Parsec String u String
131+stringLiteral = PT.stringLiteral tokenParser
132+
133+whiteSpace :: P.Parsec String u ()
134+whiteSpace = PT.whiteSpace tokenParser
135+
136+semi :: P.Parsec String u String
137+semi = PT.semi tokenParser
138+
139+colon :: P.Parsec String u String
140+colon = PT.colon tokenParser
141+
142+dot :: P.Parsec String u String
143+dot = PT.dot tokenParser
144+
145+comma :: P.Parsec String u String
146+comma = PT.comma tokenParser
147+
148+tick :: P.Parsec String u Char
149+tick = lexeme $ P.char '`'
150+
151+pipe :: P.Parsec String u Char
152+pipe = lexeme $ P.char '|'
153+
154+natural :: P.Parsec String u Integer
155+natural = PT.natural tokenParser
156+
157+squares :: P.Parsec String ParseState a -> P.Parsec String ParseState a
158+squares = P.between (lexeme $ P.char '[') (lexeme $ indented *> P.char ']') . (indented *>)
159+
160+parens :: P.Parsec String ParseState a -> P.Parsec String ParseState a
130161parens = P.between (lexeme $ P.char '(') (lexeme $ indented *> P.char ')') . (indented *>)
162+
163+braces :: P.Parsec String ParseState a -> P.Parsec String ParseState a
131164braces = P.between (lexeme $ P.char '{') (lexeme $ indented *> P.char '}') . (indented *>)
165+
166+angles :: P.Parsec String ParseState a -> P.Parsec String ParseState a
132167angles = P.between (lexeme $ P.char '<') (lexeme $ indented *> P.char '>') . (indented *>)
133168
169+sepBy :: P.Parsec String ParseState a -> P.Parsec String ParseState sep -> P.Parsec String ParseState [a]
134170sepBy p s = P.sepBy (indented *> p) (indented *> s)
171+
172+sepBy1 :: P.Parsec String ParseState a -> P.Parsec String ParseState sep -> P.Parsec String ParseState [a]
135173sepBy1 p s = P.sepBy1 (indented *> p) (indented *> s)
136174
137−semiSep = flip sepBy semi
138−semiSep1 = flip sepBy1 semi
139−commaSep = flip sepBy comma
140−commaSep1 = flip sepBy1 comma
175+semiSep :: P.Parsec String ParseState a -> P.Parsec String ParseState [a]
176+semiSep = flip sepBy semi
141177
142−tick = lexeme $ P.char '`'
143−pipe = lexeme $ P.char '|'
178+semiSep1 :: P.Parsec String ParseState a -> P.Parsec String ParseState [a]
179+semiSep1 = flip sepBy1 semi
180+
181+commaSep :: P.Parsec String ParseState a -> P.Parsec String ParseState [a]
182+commaSep = flip sepBy comma
183+
184+commaSep1 :: P.Parsec String ParseState a -> P.Parsec String ParseState [a]
185+commaSep1 = flip sepBy1 comma
144186
145187properName :: P.Parsec String u ProperName
146188properName = lexeme $ ProperName <$> P.try ((:) <$> P.upper <*> many (PT.identLetter langDef) P.<?> "name")