Erik Forbes
Erik Forbes

Reputation: 35891

Translate C# code into AST?

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.

Upvotes: 19

Views: 18576

Answers (12)

Paul Rubel
Paul Rubel

Reputation: 27242

The Roslyn project is in Visual Studio 2010 and gives you programmatic access to the Syntax Tree, among other things.

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;

Upvotes: 21

Rob Walker
Rob Walker

Reputation: 47482

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.

Upvotes: 6

yeeen
yeeen

Reputation: 4945

ANTLR is not very useful. LINQ is not what you want.

Try Mono.Cecil! http://www.mono-project.com/Cecil

It is used in many projects, including NDepend! http://www.ndepend.com/

Upvotes: 2

Ira Baxter
Ira Baxter

Reputation: 95410

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.

Upvotes: 1

konrad.kruczynski
konrad.kruczynski

Reputation: 47641

Personally, I would use NRefactory, which is free, open source and gains popularity.

Upvotes: 3

SK-logic
SK-logic

Reputation: 9725

It is strange that nobody suggested hacking the existing Mono C# compiler.

Upvotes: 0

NN_
NN_

Reputation: 1593

There is much powerful than R# project. Nemerle.Peg:

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/

And it has C# Parser which parsers all C# code and translates it to AST !

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/

You can download installer here: https://code.google.com/p/nemerle/

Upvotes: 4

Dinis Cruz
Dinis Cruz

Reputation: 4289

I've just answered on another thread here at StackOverflow a solution where I implemented an API to create and manipulate AST from C# Source Code

Upvotes: 1

Alexander Gladysh
Alexander Gladysh

Reputation: 41473

Please see the R# project (sorry the docs are in Russian, but there are some code examples). It allows AST manipulations on C# code.

http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml

Project's SVN is here: (URL updated, thanks, derigel)

Also please see the Nemerle language. It is a .Net language with strong support for metaprogramming.

Upvotes: 0

Erik Forbes
Erik Forbes

Reputation: 35891

The ANTLR Parser Generator has a grammar for C# 3.0 which covers everything except for LINQ syntax.

Upvotes: 2

Erik Forbes
Erik Forbes

Reputation: 35891

It looks like this sort of functionality will be included with whatever comes after C# 4, according to Anders Hejlsberg's 'Future of C#' PDC video.

Upvotes: 2

Konrad Rudolph
Konrad Rudolph

Reputation: 546015

Is it currently possible to translate C# code into an Abstract Syntax Tree?

Yes, trivially in special circumstances (= using the new Expressions framework):

// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;

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:

var newBody = Expression.Add(f.Body, Expression.Constant(1));
f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters);
var compiled = f.Compile();
Console.WriteLine(compiled(5)); // Result: 11

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.

Upvotes: 12

Related Questions