Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit d8df062

Browse files
committed
Merge remote-tracking branch 'origin' into positioned-try
2 parents ef1472c + 25b87c9 commit d8df062

File tree

2 files changed

+16
-26
lines changed

2 files changed

+16
-26
lines changed

src/SqlSquared/Parser/Tokenizer.purs

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@ import Prelude
1212
import Control.Alt ((<|>))
1313
import Control.Monad.State (get)
1414
import Data.Array as A
15-
import Data.Char as Ch
1615
import Data.Either (Either)
1716
import Data.HugeInt as HI
1817
import Data.HugeNum as HN
1918
import Data.Json.Extended.Signature.Parse as EJP
20-
import Data.Maybe (isJust)
19+
import Data.Set as Set
2120
import Data.String as S
2221
import SqlSquared.Utils ((∘))
2322
import 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 =
176175
digits Array Char
177176
digits = ['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

182181
oneLineComment m. Monad m P.ParserT String m Token
183182
oneLineComment =
@@ -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
206205
quotedIdent =
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

225226
stringLit m. Monad m P.ParserT String m Token
226227
stringLit = LitString <$> EJP.parseStringLiteral
@@ -231,17 +232,6 @@ numLit = Lit ∘ Decimal <$> EJP.parseDecimalLiteral
231232
intLit m. Monad m P.ParserT String m Token
232233
intLit = LitInteger <$> 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-
245235
positioned m. Monad m P.ParserT String m Token P.ParserT String m PositionedToken
246236
positioned 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

test/src/Parse.purs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ select 12
5555
, E.Right """select * from foo LEFT JOIN bar on baz"""
5656
, E.Right """select * from foo RIGHT OUTER JOIN bar on baz"""
5757
, E.Right """select * from foo RIGHT JOIN bar on baz"""
58+
, E.Right """industry"""
5859
]
5960

6061
testSuite e. TestSuite (testOutput Console.TESTOUTPUT | e)

0 commit comments

Comments
 (0)