[cfe-dev] [PATCH] C++ nested-name-specifier (Parser)
Argiris Kirtzidis
akyrtzi at gmail.com
Sat Aug 9 22:48:13 PDT 2008
Chris Lattner wrote:
>
> On Aug 9, 2008, at 10:01 PM, Argiris Kirtzidis wrote:
>
>> Chris Lattner wrote:
>>>
>>>> Sema actions like isTypeName and ActOnIdentifier, check the
>>>> scope-spec to see whether it needs to lookup a name inside the
>>>> scope-spec decl, or do a normal lookup.
>>>
>>> This is interesting: doesn't this mean that everything else will
>>> have to check to make sure that this hasn't happened, in order to
>>> reject invalid code?
>>
>> I didn't quite understand what you mean here, can you elaborate ?
>
> My understanding is that your implementation will build up an instance
> variable of Sema with the current "scope" If you get something like
> "X::Y" you set the scope to the looked up version of "X::" and when
> you parse Y, you use that to qualify it. If you say "X:: 4" then I
> assume that sema for "4" would have to see that there is qualification
> happening and reject it. Is this what you meant?
No, I think it's the parser's job to reject "X:: 4". It should emit a
parsing error when it encounters '4'.
>
>>> That is possible. I'm more concerned with the fact that Sema for
>>> ';' will have to check to make sure there is no current scope-spec
>>> that is active. This approach seems to make it so that *all* sema
>>> actions would have to check for an empty scope-spec :(
>>
>> This is why I think that having Sema keep the scope-spec state is
>> awkward and a hassle. The parser knows when parsing errors occured,
>> or when it needed to backtrack, etc., so the parser can do a far
>> better job of keeping track of the scope-spec state (when to clear
>> it, etc.).
>>
>> Sema actions can receive the scope-spec as parameter, which brings me
>> to my next point, that a [scope specifier + identifier] is considered
>> one syntactic construct by the spec, like a qualified-id, or an
>> elaborated-type-specifier, thus it makes sense to pass it along to an
>> action that handles a construct that it may be a part of.
>> For example, we can consider that ActOnIdentifier receives a
>> qualified-id, and that ActOnTag receives a elaborated-type-specifier
>> ("class A::B {};").
>
> Ah... so you're saying that Sema *resolves* the scope specifier, but
> that it returns a cookie *back to the parser*, which then passes it
> into the next action.
Yes! Sema will return a CXXScopeTy* (alias for void*) and the parser
will keep track of it and pass it along to other actions.
> If so, this makes a lot of sense to me, I think this can work. This
> means that only actions that take the scope specifier would have to
> handle it, and the parser would know how to handle other parser errors.
I'm glad that you agree. I'll post an updated patch later on.
-Argiris
>
>
>>> Sure, but this can apparently happen in the 'friend' case and some
>>> others, according to the Elsa doc. I confess to not being an expert
>>> on these matters though.
>>
>> The Elsa doc also says:
>>> every C++ compiler I've experimented with regards "::" as binding
>>> very tightly, such that any occurrence of an identifier followed
>>> by "::" is always interpreted as an attempt to use the binary "::",
>>>
>>
>> I think Clang can be one those pesky compilers too, at least for
>> compatibility's sake ;-)
>
> If you really don't think this will be an issue, I will happily
> believe you :), you know far more about this than I do. I just want
> efficiency :)
>
> -Chris
>
>
More information about the cfe-dev
mailing list