ExtraCommas
Alan & Kim Zimmerman
alan.zimm at gmail.com
Fri Sep 26 16:05:58 UTC 2014
Something else to throw into the mix, once the Located replacement by
Genlocated is done for hsSyn I intend to capture the locations of all
non-captured syntactic elements, such as commas.
So this proposed mechanism would help, provided the location of each comma
is also tracked.
Alan
On Fri, Sep 26, 2014 at 5:46 PM, Simon Peyton Jones <simonpj at microsoft.com>
wrote:
> | What I think you are proposing is to capture commas in a different way
> | altogether before this stage, and I do not understand how or where
>
> No. I'm proposing this. Insetad of
>
> data HsRecFields id
> = HsRecFields { rec_flds :: [HsRecField id arg],
> rec_dotdot :: Maybe Int
>
> have this:
>
> data HsRecFields id
> = HsRecFields { rec_flds :: HsCommaList (HsRecField id arg),
> rec_dotdot :: Maybe Int
>
>
> data HsCommaList a
> = Empty
> | ExtraComma (HsCommaList a)
> | Cons a (HsCommaList a)
>
> So that HsCommaList a is very like [a] but can express precisely where the
> extra commas appear.
>
> Now adapt the parser to produce a (HsCommaList (HsRecField RdrName
> (LHsExpr RdrName))), rather than a list of those things.
>
> The renamer then complains if it finds any ExtraComma constructors, unless
> the -XExtraCommas is specified.
>
> Does that help?
>
> Simon
>
> | -----Original Message-----
> | From: Alexander Berntsen [mailto:alexander at plaimi.net]
> | Sent: 23 September 2014 10:40
> | To: Simon Peyton Jones
> | Subject: Re: ExtraCommas
> |
> | -----BEGIN PGP SIGNED MESSAGE-----
> | Hash: SHA256
> |
> | On 23/09/14 11:28, Simon Peyton Jones wrote:
> | > My advice was only: parse commas *always* as if they were part of
> | the
> | > language. (So the parser has no conditinoals.) Reject them later (in
> | > the renamer) if the language extension is not enabled.
> | I don't understand this. From my limited understanding commas are
> | lexed, and then I can, in the parser, pattern match on things. Here's
> | a very specific example, record field update/construction:
> |
> | fbinds :: { ([HsRecField RdrName (LHsExpr RdrName)], Bool) }
> | : fbinds1 { $1 }
> | | {- empty -} { ([], False) }
> |
> | fbinds1 :: { ([HsRecField RdrName (LHsExpr RdrName)], Bool) }
> | : fbind ',' fbinds1 { case $3 of (flds, dd) ->
> | ($1 : flds, dd) }
> | | fbind { ([$1], False) }
> | | '..' { ([], True) }
> |
> | What's happening here is that fbinds uses a helper fbinds1, to capture
> | both fbinds1 & emptys. So to add support for leading/trailing commas,
> | what I did is simply pattern match on them:
> |
> | fbinds :: { ([HsRecField RdrName (LHsExpr RdrName)], Bool) }
> | : ',' fbinds1 { $2 }
> | | fbinds1 { $1 }
> |
> | fbinds1 :: { ([HsRecField RdrName (LHsExpr RdrName)], Bool) }
> | : fbind ',' fbinds1 { case $3 of
> | (flds, dd) -> ($1 : flds, dd)
> | }
> | | fbind { ([$1], False) }
> | | '..' { ([], True) }
> | | {- empty -} { ([], False) }
> |
> | You can observe that I am now using fbinds to capture ',' fbinds1, and
> | have moved the empty match to fbinds1 itself.
> |
> | This is the general pattern I have used for all of my patches so far.
> |
> |
> | What I think you are proposing is to capture commas in a different way
> | altogether before this stage, and I do not understand how or where
> | this is meant to happen. And it also sounds like your suggestion will
> | mean I need to handle the case where extra commas are *not* supposed
> | to be handwaved, like tuples. So please elaborate, if you can.
> |
> | > Happy to talk. I'm simonpj0 on skype.
> | Do you happen to use any non-proprietary tool or at least protocol?
> | - --
> | Alexander
> | alexander at plaimi.net
> | https://secure.plaimi.net/~alexander
> | -----BEGIN PGP SIGNATURE-----
> | Version: GnuPG v2
> | Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
> |
> | iF4EAREIAAYFAlQhP9sACgkQRtClrXBQc7U0+gD/TvT+9iVA6JqiopTfeYEc7NU2
> | USD2bf+bKwhy9MNUjssA/3YUjA3PVYRpw1RFoRQF15zBFF6WDH5PQbS/8/5q7h+P
> | =saJc
> | -----END PGP SIGNATURE-----
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at haskell.org
> http://www.haskell.org/mailman/listinfo/ghc-devs
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/ghc-devs/attachments/20140926/12f6dd1e/attachment.html>
More information about the ghc-devs
mailing list