@@ -12,12 +12,11 @@ import Prelude
1212import Control.Alt ((<|>))
1313import Control.Monad.State (get )
1414import Data.Array as A
15- import Data.Char as Ch
1615import Data.Either (Either )
1716import Data.HugeInt as HI
1817import Data.HugeNum as HN
1918import Data.Json.Extended.Signature.Parse as EJP
20- import Data.Maybe ( isJust )
19+ import Data.Set as Set
2120import Data.String as S
2221import SqlSquared.Utils ((∘))
2322import Text.Parsing.Parser as P
@@ -118,8 +117,8 @@ operators =
118117 , " %"
119118 ]
120119
121- keywords ∷ Array String
122- keywords =
120+ keywords ∷ Set.Set String
121+ keywords = Set .fromFoldable
123122 [ " where"
124123 , " when"
125124 , " values"
@@ -176,8 +175,8 @@ keywords =
176175digits ∷ Array Char
177176digits = [' 0' ,' 1' ,' 2' ,' 3' ,' 4' ,' 5' ,' 6' ,' 7' ,' 8' ,' 9' ]
178177
179- ident ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
180- ident = map Identifier $ PC .try quotedIdent <|> PC .try notQuotedIdent
178+ identOrKeyword ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
179+ identOrKeyword = PC .try quotedIdent <|> notQuotedIdentOrKeyword
181180
182181oneLineComment ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
183182oneLineComment =
@@ -202,25 +201,27 @@ multiLineComment = do
202201 _ →
203202 collectBeforeComment $ acc <> S .fromCharArray [ c ]
204203
205- quotedIdent ∷ ∀ m . Monad m ⇒ P.ParserT String m String
204+ quotedIdent ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
206205quotedIdent =
207- PC .between (PS .string " `" ) (PS .string " `" )
206+ map Identifier
207+ $ PC .between (PS .string " `" ) (PS .string " `" )
208208 $ map S .fromCharArray
209209 $ A .some identChar
210210 where
211211 identChar = identEscape <|> identLetter
212212 identLetter = PS .satisfy (not ∘ eq ' `' )
213213 identEscape = PS .string " \\ `" $> ' `'
214214
215- notQuotedIdent ∷ ∀ m . Monad m ⇒ P.ParserT String m String
216- notQuotedIdent = do
215+ notQuotedIdentOrKeyword ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
216+ notQuotedIdentOrKeyword = do
217217 first ← PT .letter
218218 other ← A .many (PT .alphaNum <|> PS .char ' _' )
219219 let
220220 str = S .fromCharArray $ A .cons first other
221- if isJust $ A .elemIndex (S .toLower str) keywords
222- then P .fail " unexpected keyword"
223- else pure str
221+ low = S .toLower str
222+ pure if Set .member low keywords
223+ then Kw low
224+ else Identifier str
224225
225226stringLit ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
226227stringLit = Lit ∘ String <$> EJP .parseStringLiteral
@@ -231,17 +232,6 @@ numLit = Lit ∘ Decimal <$> EJP.parseDecimalLiteral
231232intLit ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
232233intLit = Lit ∘ Integer <$> EJP .parseHugeIntLiteral
233234
234- keyword ∷ ∀ m . Monad m ⇒ P.ParserT String m Token
235- keyword = map Kw $ PC .choice $ map (PC .try ∘ parseKeyword) keywords
236-
237- parseKeyword ∷ ∀ m . Monad m ⇒ String → P.ParserT String m String
238- parseKeyword s =
239- map S .fromCharArray $ A .foldM foldFn [ ] $ S .toCharArray s
240- where
241- foldFn acc ch = do
242- c ← PC .try $ PS .oneOf [ Ch .toUpper ch, Ch .toLower ch ]
243- pure $ A .snoc acc c
244-
245235positioned ∷ ∀ m . Monad m ⇒ P.ParserT String m Token → P.ParserT String m PositionedToken
246236positioned m = do
247237 P.ParseState _ position _ ← get
@@ -254,8 +244,7 @@ tokens = do
254244 [ skipped oneLineComment
255245 , skipped multiLineComment
256246 , skipped op
257- , skipped keyword
258- , skipped ident
247+ , skipped identOrKeyword
259248 , skipped numLit
260249 , skipped intLit
261250 , skipped stringLit
0 commit comments