[cfe-dev] Source rewrite

Fariborz Jahanian fjahanian at apple.com
Thu Dec 17 09:32:20 PST 2009


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.

- Fariborz

>
>
> 	- Doug
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev




More information about the cfe-dev mailing list