[cfe-dev] Source rewrite
Douglas Gregor
dgregor at apple.com
Thu Dec 17 09:23:47 PST 2009
On Dec 17, 2009, at 9:13 AM, Abramo Bagnara wrote:
> Il 17/12/2009 16:57, Douglas Gregor ha scritto:
>>
>> On Dec 17, 2009, at 5:23 AM, steve naroff wrote:
>>
>>>
>>> On Dec 17, 2009, at 7:05 AM, Abramo Bagnara wrote:
>>>
>>>> In an application that uses clang libraries we need to transform
>>>> some
>>>> specially written comments in C construct.
>>>>
>>>> e.g:
>>>> int p() {
>>>> int a = 3;
>>>> /* #instrument(a)# */
>>>> }
>>>>
>>>> should be parsed as
>>>> int p() {
>>>> int a = 3;
>>>> instrument(a);
>>>> }
>>>>
>>>> I've added a CommentHandler to Preprocessor to catch comments and I
>>>> thought to use Rewriter class to manipulate the input buffer
>>>> inserting
>>>> after the comment the text to be parsed, but then I've realized
>>>> that
>>>> Rewriter class is not designed to rewrite lexer input buffers,
>>>> but to
>>>> build a separate object where original text and changes live
>>>> together.
>>>>
>>>> Now I'm a bit confused: what's the proper way to cope with the need
>>>> described above?
>>>>
>>>
>>> Hi Abramo,
>>>
>>> The ASTContext class has a 'Comments' member that contains all the
>>> SourceRanges's for all comments in the source file.
>>>
>>> This assumes you've told the preprocessor to keep comments.
>>
>> You actually don't have to tell the preprocessor to keep comments; it
>> keeps the source ranges for the comments regardless, and you can go
>> back
>> to the source to get the content of the comments.
>
> I think to have explained badly what we need: I've no problems to get
> the comment content, my problem is to translate, during the parsing,
> the
> comment content in another text to be lexed/parsed instead of (or just
> after) the comment.
>
> As I write above, what I need is that the AST built from:
>
> int p() {
> int a = 3;
> /* #instrument(a)# */
> }
>
> is as if the source read was:
>
> int p() {
> int a = 3;
> instrument(a);
> }
Oh, interesting. You'll probably need to each the preprocessor how to
parse inside these comments. One option might be to treat such
comments similarly to macro expansion, so that processing the comment
/* #instrument(a)# */
consumes the comment and then pushes a new lexer that will point into
a buffer containing
instrument(a)
just like processing
FOO
where there is a macro definition
#define FOO instrument(a)
will create a new lexer pointing into a buffer containing
instrument(a)
- Doug
More information about the cfe-dev
mailing list