[cfe-dev] [PATCH] C++ nested-name-specifier (Parser)

Argiris Kirtzidis akyrtzi at gmail.com
Fri Aug 1 12:39:20 PDT 2008


For the next chapter of the C++ support saga, I've implemented 
nested-name-specifier support ("foo::bar::").

The attached 'pp-caching' patch, modifies Preprocessor::LookAhead 
(making it efficient enough to replace LookNext) and adds 'rewinding' 
That is, one can call Preprocessor::EnableRewindAtThisPos, lex and 
consume any number of tokens, and later call Preprocessor::Rewind to 
make the preprocessor re-lex the tokens that were previsouly lexed since 
EnableRewindAtThisPos was called.

This is used by the parser to determine whether a "foo::bar::x" 
construct represents a typename without consuming any tokens. It goes 
something like this:

-Parse 'foo::bar::' tokens
-Check whether 'x' is a typename in the 'foo::bar::' scope

The Preprocessor modifications should have no impact on its efficiency 
for normal lexing.

The C++ standard does not have a syntactic category for both the global 
scope specifier ('::') and nested-name-specifier ('foo::'), but I found 
that it's simpler to regard them both as a 'C++ scope specifier' and 
have them both treated the same way. For example, "::x", "foo::x", and 
"::foo::x" will all be treated as "[cxx-scope-spec] x" by the parser.

Comments are welcomed!


-------------- next part --------------
A non-text attachment was scrubbed...
Name: pp-caching.patch
Type: text/x-diff
Size: 13314 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080801/1aa41a0e/attachment.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nns-parser.patch
Type: text/x-diff
Size: 34992 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080801/1aa41a0e/attachment-0001.patch>

More information about the cfe-dev mailing list