Thanks once again for your detailed analysis, it's really helpful.
Especially the forall example - I did try constructing some string that would 
parse, but I was shooting in the dark.

Best,
Csongor

> On 29 Aug 2020, at 09:05, Vladislav Zavialov <vladis...@serokell.io> wrote:
> 
> The lexer produces only as many tokens as the parser requires. In the 
> ‘lexerDbg’ dump that you included in the message, there were these lines:
> 
>  token: ITvarid "m"
>  token: ITvarid "b"
>  token: ITsemi
> 
> So I knew that the parser consumed the entire string, up to the virtual 
> semicolon. I also recognized the parse error as the one produced by ‘happy’ 
> rather than by a later validation pass. So even though the parser consumed 
> the entire string, it failed. Therefore, it didn’t expect this string to end 
> so abruptly, it expected it to continue.
> 
> But what did it expect to find? To figure it out, we need to know which 
> grammar production is involved in the failure. The only grammar production 
> that could’ve consumed the ‘->’ PREFIX_AT sequence successfully and proceed 
> to process the rest of the string is this one:
> 
>   btype '->' PREFIX_AT btype ctype
> 
> By inspecting the definitions of ‘btype’ and ‘ctype’, one can see that 
> neither of those accept the empty string, and both of those accept type-level 
> function application. Thus it’s possible that ‘btype’ consumed “m b” as an 
> application, and ‘ctype’ failed because it didn’t accept the remaining empty 
> string:
> 
>  btype = “m b”
>  ctype = parse error (nothing to consume)
> 
> But what you wanted instead was:
> 
>  btype = “m”
>  ctype = “b”
> 
> The solution is to use ‘atype’ instead of ‘btype’, as ‘atype’ does not accept 
> type-level application.
> 
> By the way, there’s also the input string on which the original grammar 
> would’ve succeeded (or at least I think so):
> 
>  test :: a -> @m forall b. b
>  test = undefined
> 
> That’s because ‘btype’ wouldn’t have consumed the ‘forall’, it would’ve 
> stopped at this point. And then ‘ctype’ could’ve consumed “forall b. b”.
> 
> I don’t think there’s a parser equivalent of -ddump-tc-trace. You’ll need to 
> figure this stuff out by reading the grammar and keeping in mind that ‘happy’ 
> generates a shift-reduce parser that does not backtrack. The ‘lexerDbg’ 
> output is useful to see how far the parser got. And there’s also this command 
> in case you want to go low level and inspect the state machine generated by 
> ‘happy’:
> 
>    happy -agc --strict compiler/GHC/Parser.y -idetailed-info
> 
> Hope this helps,
> - Vlad
> 
>> On 29 Aug 2020, at 10:16, Csongor Kiss <kiss.csongor.k...@gmail.com> wrote:
>> 
>> Thanks a lot Vlad and Shayne, that indeed did the trick!
>> 
>> Out of curiosity, how could I have figured out that this was the culprit? 
>> The parse
>> error I got was a bit puzzling, and I couldn't find any flags that would 
>> give more information
>> (I think I was looking for the parser equivalent of -ddump-tc-trace).
>> 
>> Best,
>> Csongor
> 

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to