[Haskell-cafe] Question on Lexing Haskell syntax
Oleg Grenrus
oleg.grenrus at iki.fi
Wed Nov 1 00:51:04 UTC 2023
In C, AFAIU you can (and probably should) defer `typedef` usage
recognition to a separate "renamer/ name resolution" pass. In Haskell we
are forced to do name resolution after parsing, as we don't need to
declare stuff before use. Even so, separate pass is usually a good idea
anyway, you are better equipped to produce good error messages. In fact
GHC does even more: it defers the unbound names reporting to the type
checking phase, so it can give the types to unbound variables, like:
Prelude> x : "foo"
<interactive>:2:1: error: Variable not in scope: x :: Char
- Oleg
On 1.11.2023 2.32, Brandon Allbery wrote:
> Feedback between lexer and parser isn't exactly unusual. Consider that
> parsing a C `typedef` generally needs to feed back to the lexer so
> uses will be recognized properly.
>
> On Wed, Nov 1, 2023 at 12:28 AM Oleg Grenrus <oleg.grenrus at iki.fi> wrote:
>
> Yes, the "communication between lexer and parser" is exactly what
> GHC does.
>
> Amelia has a nice post about it
> https://amelia.how/posts/parsing-layout.html which made it click
> it for me.
>
> Note, you don't actually need to use alex and happy, you can do
> hand-written lexer and parsec (or alex and parsec, ...). The key
> insight is to have stateful lexer, and control it from the parser.
>
> Amelia's post grammar is a bit too strict, e.g. GHC accepts real
> semis in virtual layout, and also empty "statements" in between,
> so we can write
>
> \x y z -> case x of True -> y;;;;;; False -> z
>
> but that's easy (at least in parsec) to adjust the parser grammar
> to accept those.
>
> Or, you can *approximate* the parse-error rule with "alternative
> layout rule" [1], which can be implemented as a pass between
> lexing and parsing, or as a stateful lexer (but in this case
> parser won't need to adjust lexer's state). GHC has an
> undocumented AlternativeLayoutRule extension, so you can
> experiment with it to see what it accepts (look for tests in GHC
> source for examples). It handles let-in bindings well enough.
>
> [1]
> https://www.mail-archive.com/haskell-prime@haskell.org/msg01938.html
> which can be imp
>
> - Oleg
>
> On 1.11.2023 0.31, Travis Athougies wrote:
>> According to the Haskell report [1] (See Note 5), a virtual `}` token
>> is inserted if parsing the next token would cause a parse error
>> and the
>> indentation stack is non-empty.
>>
>> I'm trying to lex and parse Haskell source and this sort of interplay
>> (which requires two-way communication between lexer and parser) makes
>> it very difficult to write a conformant implementation.
>>
>> I can't change the standard (obviously), but I'm wondering if this is
>> actually what GHC (de facto the only Haskell compiler) does, or if it
>> applies some other rule. If so, does anyone know the exact
>> mechanism of
>> its implementation?
>>
>> I've been programming Haskell for more than a decade, and while I
>> have
>> an intuitive understanding of the indentation rules, I would have
>> assumed the source could be lexed without also having a parser. In
>> particular, the note seems to imply that the main purpose of this
>> is to
>> properly lex `let`/`in` bindings. Perhaps there's an alternate
>> equivalent rule?
>>
>> Curious to hear other's thoughts.
>>
>> Travis
>>
>> [1]
>> https://www.haskell.org/onlinereport/haskell2010/haskellch10.html#x17-17800010.3
> > _______________________________________________ > Haskell-Cafe mailing list > To (un)subscribe, modify options or
> view archives go to: >
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe >
> Only members subscribed via the mailman list are allowed to post.
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
>
>
>
> --
> brandon s allbery kf8nh
> allbery.b at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20231101/07d68da5/attachment.html>
More information about the Haskell-Cafe
mailing list