2008-10-17 23 views
15

¿Actualmente es posible traducir el código C# en un árbol de sintaxis abstracto?¿Traducir el código de C# en AST?

Editar: alguna aclaración; No necesariamente espero que el compilador genere el AST para mí, un analizador estaría bien, aunque me gustaría usar algo "oficial". Desafortunadamente, las expresiones lambda no serán suficientes dado que no me permiten usar cuerpos de enunciados, que es lo que estoy buscando.

+0

¿Se pregunta cómo va su intento de traducir el código C# a AST? – yeeen

+0

Puse el proyecto en espera. –

+4

Mantener a largo plazo ... Lol –

Respuesta

17

El proyecto Roslyn se encuentra en Visual Studio 2010 y le brinda acceso programático al Syntax Tree, entre otras cosas.

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

Iba a publicar esto como una respuesta a mi propia pregunta, pero me ganaste. =) –

6

Eche un vistazo a .NET CodeDom support. Hay un artículo anterior sobre el proyecto de código para C# CodeDOM parser, pero no será compatible con las nuevas funciones de idioma.

También se supone que hay soporte en #develop para generar un árbol CodeDom a partir del código fuente de C# según este posting.

0

Consulte el proyecto R # (lo siento, los documentos están en ruso, pero hay algunos ejemplos de código). Permite manipulaciones AST en código C#. SVN

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

del Proyecto es here: (URL actualizada, gracias, derigel)

También por favor ver el lenguaje Nemerle. Es un lenguaje .Net con un fuerte soporte para la metaprogramación.

+0

El depósito ahora está en http://svn.rsdn.ru/svn/RSharp/ – derigel

12

¿Actualmente es posible traducir el código C# a un árbol de sintaxis abstracto?

Sí, trivialmente en circunstancias especiales (= usando la nueva Expressions framework):

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

Esto crea un árbol de expresión de la lambda, es decir, una función de tomar un int y devolver el doble. Puede modificar el árbol de expresión utilizando el marco Expresiones (= las clases a partir de ese espacio de nombres) y luego compilarlo en tiempo de ejecución:

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 

en cuenta que todas las expresiones son inmutables por lo que tienen que ser construido de nuevo por composición. En este caso, he añadido una adición de 1.

Observe que estos árboles de expresiones solo funcionan en expresiones reales, es decir, contenido encontrado en una función C#. No puede obtener árboles de sintaxis para construcciones más altas como las clases de esta manera. Use el marco CodeDom para estos.

+0

¿Erik aceptó esto? Utiliza las formas muy lambda que dijo que no quería. –

+1

Ira: debe prestar atención al desarrollo de la discusión. Esta entrada fue publicada * antes * Edición/aclaración de Erik. Aparentemente, ninguna de las otras respuestas fue mejor * en el momento * (aviso: * ¡hace un año! *) Por lo que no aceptó otra respuesta. Tu respuesta es probablemente lo que él hubiera querido. –

2

Parece que este tipo de funcionalidad se incluirá con lo que venga después de C# 4, según Anders Hejlsberg's 'Future of C#' PDC video.

+0

Esto es útil para ver qué C# no ofrece una biblioteca para que manipulemos C# API. ¡Es debido a que su compilador es clásico, una caja negra! – yeeen

2

El ANTLR Parser Generator tiene una gramática para C# 3.0 que cubre todo excepto la sintaxis LINQ.

+0

He usado ANTLR en el pasado, y es bastante agradable. No he usado la gramática C#, pero la mayoría de los colaboradores son bastante cluecos. – Travis

1

Nuestro C# front end for DMS analiza el C# 3.0 completo incluyendo LINQ y produce AST. De hecho, DMS es un ecosistema para analizar/transformar el código fuente utilizando AST para lenguajes proporcionados por el usuario.

EDITAR 3/10/2010: ... Ahora maneja completo de C# 4.0

EDIT: 27/06/2014: Maneja C# 5.0 ya bastante tiempo.

EDITAR: 15/06/2016: Handles C# 6.0. Ver https://stackoverflow.com/a/37847714/120163 para una muestra AST.

+0

2004? Supongo que el año 2010. – Cheeso

+0

@ Cheeso: Hmm, 2004 significaría que obtuvimos MS. Bueno, nunca sirve sugerir eso, así que lo modifiqué, por ejemplo, 2010. Solucionado. –

1

Es extraño que nadie sugirió la piratería Mono C# compilador existente.

3

En lo personal, me gustaría utilizar NRefactory, que es gratuito, de código abierto y gana popularidad.