r177435 - Objective-C [qoi]: Provide improved parse diagnostics when
jahanian
fjahanian at apple.com
Wed Mar 20 11:12:12 PDT 2013
On Mar 19, 2013, at 4:22 PM, Douglas Gregor <dgregor at apple.com> wrote:
>
> On Mar 19, 2013, at 2:58 PM, jahanian <fjahanian at apple.com> wrote:
>
>>
>> On Mar 19, 2013, at 2:29 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>>
>>>
>>> On Mar 19, 2013, at 14:21 , jahanian <fjahanian at apple.com> wrote:
>>>
>>>>
>>>> On Mar 19, 2013, at 1:42 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>>>>
>>>>>
>>>>> Would it make sense to not just continue but to pretend instead that the '}' is there? I feel like that will give us better recovery. (You'd eliminate those last two errors: "expected '}'" and "missing '@end'".)
>>>>
>>>> I think by 'pretending' you mean insert a '}' before @end and continue. I thought about this but I did not want to introduce the bookkeeping
>>>> overhead for the correct case. Do you have a suggestion how to pretend without adding this overhead?
>>>
>>> Hm, I see what you mean—right now we unilaterally consume a closing brace when we exit the loop. The easiest way to solve this is to extract the parsing loop and the T.consumeClose() into a helper function, with an early return for the @end case...but that's not exactly pretty. I guess I'll let you make the call (or stand by the call you already made).
>>
>> Problem is not avoiding calling of T.consumeClose() in the incorrect case. Problem is that '@' and 'end" are two tokens and we have consumed
>> '@' already (this will cause parse error later). I see two solutions:
>> 1. When seeing '@', lookahead for 'end' and exit the loop while skipping T.consumeClose() . I think this is what you are suggesting. But it involves unnecessary overhead for the common case.
>> 2. If it is possible, I can insert a '}' two tokens before current token and reset the lexer to the inserted '}' for the incorrect case, then problem is solved without introducing any undue overhead for
>> the common case.
>
>
> You don't need to insert the '}' token. If you've consumed the '@' and see something that doesn't belong in a list of instance variables (e.g., 'property', 'end'), break out of the loop without calling consumeClose() and then PP.EnterToken() the '@' to recover.
Yes, this API was what I was wishing for. It was more involved than I bargained for because I did not want to introduce
any overhead in the loop for the common case. In r177549.
-Thanks to both
- Fariborz
>
> - Doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130320/3ff5d312/attachment.html>
More information about the cfe-commits
mailing list