[cfe-dev] code conversion challenge

Sean Silva silvas at purdue.edu
Tue Feb 28 09:17:53 PST 2012


It looks like what you want to do is to run a RecursiveASTVisitor over the
AST and essentially cherry-pick certain information off of it. It may be a
lot of work, but I think you could do it.

Oh, except for the comment. That would be *much* more difficult. In your
example you seem to be including the comment as though it were a statement
in the body. How would your representation (which reminds me of Prolog btw)
represent:

  int main(int argc, char * argv[])
  {
    return  /* all ok */ 0;
  }

or

  int main(int argc, char * argv[])
  {
    doSomethingWithALotOfArgs(argv[0], argv, argv+argc, /*verbose=*/false);
    return 0;
  }

Code like that last example is extremely common.

For a more pathological example, consider

  #define X(a,b) a##b
  int X(ma,/*pure evil*/in)(int argc, char * argv[])
  {
    doSomethingWithALotOfArgs(argv[0], argv, argv+argc, /*verbose=*/false);
    return 0;
  }

The conclusion is that to actually be useful, your representation would
want to make certain things "off limits" or purposefully not representable.
It's up to you to draw the line. Once you have that line, you can then get
what you want in a pretty straightforward way from clang.

--Sean Silva

On Tue, Feb 28, 2012 at 2:21 AM, Philip Ashmore
<contact at philipashmore.com>wrote:

> On 28/02/12 07:01, Philip Ashmore wrote:
> > Hi there.
> >
> > Here's the problem:
> > Given the source file with this content:
> >
> >     int main(int argc, char * argv[])
> >     {
> >       /* all ok */
> >       return 0;
> >     }
> >
> > I want to convert it into something like this:
> >
> >     module
> >     ( function
> >       ( Name("main")
> >       , Returns("int")
> >       , Parameters
> >         ( Parameter(Type("int"), Name("argc")
> >         , Parameter(Type(Array(Pointer("char"), Size()), Name("argv")
> >         )
> >       , Body
> >         ( Comment("all ok")
> >         , Return(Int(0i32))
> >         )
> >       )
> >     )
> >
> > This is a description format that has a binary representation that
> allows for
> > easy depth-first and breadth-first traversal.
> >
> > With it one can describe C/C++, make files, pre-processor macros etc. -
> the
> > reader supplies the meaning to the "calls" like "module".
> >
> > With it I hope to be able to describe things like interfaces and be able
> to
> > automate the glue that allows it to be called from scripting languages,
> > and much more.
> >
> > I haven't even given this format a name, but I can convert the text
> above to
> > and from the binary representation.
> >
> > So that's the challenge - any takers?
> >
> > Regards,
> > Philip Ashmore
> >
> > _______________________________________________
> > cfe-dev mailing list
> > cfe-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> OK, maybe not this exact example - the parameters are missing ')', but
> you get the idea.
>
> Philip
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120228/48954636/attachment.html>


More information about the cfe-dev mailing list