<div dir="ltr"><div><br></div>Hi,<br><div><br></div><div>I have recently been playing with GHC's Lexer.lexer in the ghc-parser-lib package.</div><div><br></div><div>Given</div><div><br></div><div>   module HelloWorld where<br><br>   main = putStrLn "Hello World!\n"<br></div><div><br></div><div>it produces</div><div><br></div><div>   stack exec -- lexer-exe ./examples/HelloWorld.hs   <br>   Lexing&Parsing: ./examples/HelloWorld.hs<br>   module at (1, 1): module<br>   CONID at (1, 8): CONID<br>   where at (1, 19): where<br>   vocurly at (3, 1): vocurly    <==== { is inserted automatically!!<br>   VARID at (3, 1): VARID<br>   = at (3, 6): =<br>   VARID at (3, 8): VARID<br>   STRING at (3, 17): STRING<br>   ; at (4, 1): ;<br></div><div><br></div><div>By the example above, the lexer automatically inserts an opening brace (i.e. vocurly) right after 'where'. But it does not insert a matching closing brace (i.e., vccurly), which would lead to a failure in parsing a list of tokens produced by the lexer. </div><div><br></div><div>My question is how to use the GHC lexer to produce closing braces as well. </div><div><br></div><div>All my code is available </div><div> - <a href="https://github.com/kwanghoon/hslexer">https://github.com/kwanghoon/hslexer</a></div><div><br></div><div>To save your time, the relevant part of the code is as follows:</div><div><br></div><div>In app/HaskellLexer.hs,</div><div><br></div><div>    singleHaskellToken :: P (Located Token)<br>    singleHaskellToken =<br>      Lexer.lexer False<br>        (\locatedToken -> P (\pstate -> POk pstate locatedToken))<br><br>    tokInfos :: [Terminal Token] -> P (Line, Column, [Terminal Token])<br>    tokInfos s = do<br>      locatedToken <- singleHaskellToken<br>      case locatedToken of<br>        L srcspan ITeof -><br>          let (start_line, start_col, end_line, end_col) = srcSpanToLineCol srcspan in<br>          return (end_line, end_col, s)<br>          <br>        L srcspan tok -><br>          let (start_line, start_col, end_line, end_col) = srcSpanToLineCol srcspan in<br>          tokInfos (Terminal (fromToken tok) start_line start_col (Just tok) : s)<br></div><div><br></div><div>Thanks in advance</div><div><br></div><div>Best regards,</div><div><br></div><div>Kwanghoon</div><div><br></div><div><br></div><div><br></div><div><br></div></div>