Is it currently possible to translate C# code into an Abstract Syntax Tree?
Edit: some clarification; I don't necessarily expect the compiler to generate the AST for me - a parser would be fine, although I'd like to use something "official." Lambda expressions are unfortunately not going to be sufficient given they don't allow me to use statement bodies, which is what I'm looking for.
Yes, trivially in special circumstances (= using the new Expressions framework):
This creates an expression tree for the lambda, i.e. a function taking an
int
and returning the double. You can modify the expression tree by using the Expressions framework (= the classes from in that namespace) and then compile it at run-time:Notice that all expressions are immutable so they have to be built anew by composition. In this case, I've prepended an addition of 1.
Notice that these expression trees only work on real expressions i.e. content found in a C# function. You can't get syntax trees for higher constructs such as classes this way. Use the CodeDom framework for these.
It is strange that nobody suggested hacking the existing Mono C# compiler.
Check out .NET CodeDom support. There is an old article on code project for a C# CodeDOM parser, but it won't support the new language features.
There is also supposed to be support in #develop for generating a CodeDom tree from C# source code according to this posting.
Personally, I would use NRefactory, which is free, open source and gains popularity.
ANTLR is not very useful. LINQ is not what u want.
Try Mono.Cecil! http://www.mono-project.com/Cecil
It is used in many projects, including NDepend! http://www.ndepend.com/
Our C# front end for DMS parses full C# 3.0 including LINQ and produces ASTs. DMS in fact is an ecosystem for analyzing/transforming source code using ASTs for front-end provided langauges.
EDIT 3/10/2010: ... Now handles full C# 4.0
EDIT: 6/27/2014: Handles C# 5.0 since quite awhile.
EDIT: 6/15/2016: Handles C# 6.0. See https://stackoverflow.com/a/37847714/120163 for a sample AST.