extend C syntax in clang plug-in?

I want to experiment with some syntax extensions to C, including some new
built-in types and new statements. Can it be done completely in a plugin?
Any related examples to look at?

For an extremely simple example, let us say we have
  int A;
  A, B = 1, [1.0, 2.0];
Here B is untyped, and [1.0, 2.0] is not an expected expression. Instead of
throwing errors, can we write a clang plugin to do the following? (1)
Pre-process the token stream. For example, the second statement can be
broken into two statements: A=1; B=[1.0, 2.0]; That gives us a new token
stream. (2) Parse. For the statement “B=[1.0, 2.0]”, build a customized AST
node, and insert it to the function’s AST. (3) Some additional analysis may
be done on the function’s AST. (4) Finally, transform the function's AST so
that it completely conforms to standard C.

Thanks,
Hongbo

This isn’t possible. The plugin API allows you to add an ASTConsumer that runs either instead of or after codegen. The ASTConsumer interface [1] only has hooks that tell you about the AST that clang is building – so a plugin can only do things in response to receiving an AST. Plugins can’t modify parsing, or add new AST nodes.

1: http://clang.llvm.org/doxygen/classclang_1_1ASTConsumer.html

I want to experiment with some syntax extensions to C, including some new
built-in types and new statements. Can it be done completely in a plugin?

No. Currently clang's plugin functionality is very limited.

-- Sean Silva

I want to experiment with some syntax extensions to C, including some new
built-in types and new statements. Can it be done completely in a plugin?

No. Currently clang's plugin functionality is very limited.

Sorry, I should have added a link to what you *can* do:
http://clang.llvm.org/docs/ClangPlugins.html

Basically you can run a FrontendAction which operates on the AST that
clang's parser generates.

-- Sean Silva

Thanks to Nico's and your replies. It looks I have to modify Clang to achieve
this purpose. What are the main places to change in clang?

I think you should to modify the libclangParse and libclangSema.
The source code in the clang/lib/Parse and clang/lib/Sema.
And in your extensions, maybe also need to modify the libLLVMCodeGen.