[cfe-dev] Relexing more than one tokens
Abramo Bagnara
abramobagnara at tin.it
Tue Jul 7 23:07:12 PDT 2009
Chris Lattner ha scritto:
>
> On Jul 7, 2009, at 10:19 PM, Abramo Bagnara wrote:
>
>>>
>>> In order to lex from "foo" to "baz", you need to know (e.g.) if bar is a
>>> macro that expands to zero (or many) tokens. From an arbitrary point in
>>> an ASTConsumer, you don't have this information, because the macros
>>> could be undef'd etc.
>>
>> Taken for granted that currently from any SourceLocation I can obtain
>> the related token, a possibility could be to have in class SLocEntry a
>> reference to next token's SourceLocation in preprocessed stream. It
>> should not be too hard to implement, but this means to add 32 bits to
>> each SLocEntry and to keep all translation unit source locations in
>> memory.
>
> We can't do that, SourceLocation has to stay 32-bits, it is very pervasive.
SourceLocation size would not change, the link to next SourceLocation
would be added to SLocEntry (similarly to IncludeLoc and SpellingLoc).
>>> However, not all hope is lost. It is very reasonable for an ASTConsumer
>>> to construct ASTs for a translation unit *AND* then preprocess the whole
>>> file again to get the tokens in a big vector. Given that, you could map
>>> from the AST node to an index in the vector, then scan around in the
>>> vector of tokens looking for what you want.
>>
>> How you'd map the AST node to the relexed tokens vector?
>
> Just compare the source locations.
Are you meaning that preprocessing the whole translation unit again I'd
get the same SourceLocation opaque ID?
More information about the cfe-dev
mailing list