Pregunta

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

Editar: algunas aclaraciones; No necesariamente espero que el compilador genere el AST para mí: un analizador estaría bien, aunque me gustaría usar algo "oficial". Lamentablemente, las expresiones Lambda no van a ser suficientes, ya que no me permiten usar cuerpos de declaración, que es lo que estoy buscando.

¿Fue útil?

Solución

El proyecto Roslyn está en Visual Studio 2010 y le brinda acceso programático a < a href = "http://msdn.microsoft.com/en-us/hh543916" rel = "noreferrer"> Syntax Tree , entre otras cosas.

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

Otros consejos

  

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

Sí, trivialmente en circunstancias especiales (= usar el nuevo marco de expresiones ):

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

Esto crea un árbol de expresiones para la lambda, es decir, una función que toma un int y devuelve el doble. Puede modificar el árbol de expresiones usando el marco de expresiones (= las clases 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

Observe que todas las expresiones son inmutables, por lo que deben ser construidas nuevamente por composición. En este caso, he agregado una adición de 1.

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

Consulte el soporte de .NET CodeDom . Hay un artículo antiguo en el proyecto de código para un C # CodeDOM parser , pero ganó No es 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 # de acuerdo con este publicación .

Hay mucho más poderoso que el proyecto R #. Nemerle.Peg:

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

¡Y tiene C # Parser que analiza todo el código C # y lo traduce a AST!

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

Puede descargar el instalador aquí: https://code.google.com/p/nemerle/

Personalmente, usaría NRefactory , que es gratuito, de código abierto y gana popularidad.

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

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

Acabo de responder en otro hilo aquí en StackOverflow una solución donde implementé una API para crear y manipular AST desde el código fuente de C #

Es extraño que nadie haya sugerido piratear el compilador Mono C # existente.

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

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

EDITAR: 6/27/2014: Maneja C # 5.0 desde hace bastante tiempo.

EDITAR: 6/15/2016: Maneja C # 6.0. Consulte https://stackoverflow.com/a/37847714/120163 para una muestra de AST.

ANTLR no es muy útil. LINQ no es lo que quieres.

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

Se usa en muchos proyectos, incluyendo NDepend! http://www.ndepend.com/

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

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

El SVN del proyecto es aquí : (URL actualizada, gracias, derigel )

También consulte el idioma Nemerle . Es un lenguaje .Net con un fuerte soporte para la metaprogramación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top