Skip to content

Commit 8f48c67

Browse files
authored
Support identifiers beginning with keywords (#551)
... as standardized in dhall-lang/dhall-lang#222 Fixes #547 This allows code like this to work: ```haskell $ dhall <<< "let mergedRec = { a = 1 } // { b = 2 } in mergedRec" ``` ... by requiring non-empty whitespace after keywords that are not built-ins
1 parent 43bfdf2 commit 8f48c67

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

src/Dhall/Parser/Token.hs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ import qualified Text.Parser.Token
3434
whitespace :: Parser ()
3535
whitespace = Text.Parser.Combinators.skipMany whitespaceChunk
3636

37+
nonemptyWhitespace :: Parser ()
38+
nonemptyWhitespace = Text.Parser.Combinators.skipSome whitespaceChunk
39+
3740
alpha :: Char -> Bool
3841
alpha c = ('\x41' <= c && c <= '\x5A') || ('\x61' <= c && c <= '\x7A')
3942

@@ -398,32 +401,35 @@ unreserved c =
398401
reserved :: Data.Text.Text -> Parser ()
399402
reserved x = do _ <- Text.Parser.Char.text x; whitespace
400403

404+
keyword :: Data.Text.Text -> Parser ()
405+
keyword x = try (do _ <- Text.Parser.Char.text x; nonemptyWhitespace)
406+
401407
_if :: Parser ()
402-
_if = reserved "if"
408+
_if = keyword "if"
403409

404410
_then :: Parser ()
405-
_then = reserved "then"
411+
_then = keyword "then"
406412

407413
_else :: Parser ()
408-
_else = reserved "else"
414+
_else = keyword "else"
409415

410416
_let :: Parser ()
411-
_let = reserved "let"
417+
_let = keyword "let"
412418

413419
_in :: Parser ()
414-
_in = reserved "in"
420+
_in = keyword "in"
415421

416422
_as :: Parser ()
417-
_as = reserved "as"
423+
_as = keyword "as"
418424

419425
_using :: Parser ()
420-
_using = reserved "using"
426+
_using = keyword "using"
421427

422428
_merge :: Parser ()
423-
_merge = reserved "merge"
429+
_merge = keyword "merge"
424430

425431
_constructors :: Parser ()
426-
_constructors = reserved "constructors"
432+
_constructors = keyword "constructors"
427433

428434
_NaturalFold :: Parser ()
429435
_NaturalFold = reserved "Natural/fold"

0 commit comments

Comments
 (0)