[cfe-dev] [PATCH] C++ nested-name-specifier (Parser)
Chris Lattner
clattner at apple.com
Sat Aug 9 22:22:28 PDT 2008
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?
>> 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. 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.
>> 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