[cfe-dev] Source rewrite

Abramo Bagnara abramobagnara at tin.it
Thu Dec 17 09:44:24 PST 2009


Il 17/12/2009 18:32, Fariborz Jahanian ha scritto:
> 
> On Dec 17, 2009, at 9:23 AM, Douglas Gregor wrote:
> 
>>
>> 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)
> 
> Somehow, all semantics checks need be performed and an 'invisible' AST
> generated and passed on so rewriter can do
> the rewrite.

I believe to not understand what you mean... I think that the rewriter
is not involved in any way.



More information about the cfe-dev mailing list