Traduzir código C # para AST?
-
03-07-2019 - |
Pergunta
É actualmente possível traduzir o código C # em uma árvore de sintaxe abstrata?
Edit: alguns esclarecimentos; Eu não necessariamente esperar o compilador para gerar a AST para mim - "oficial" um analisador seria bom, embora eu gostaria de usar algo As expressões lambda, infelizmente, não vai ser suficiente dado que não permite que eu use corpos declaração, que é o que eu estou procurando.
Solução
O Roslyn projeto está em Visual Studio 2010 e dá-lhe acesso programático ao < a href = "http://msdn.microsoft.com/en-us/hh543916" rel = "noreferrer"> Sintaxe Árvore , entre outras coisas.
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
Outras dicas
É actualmente possível traduzir o código C # em uma árvore de sintaxe abstrata?
Sim, trivialmente em circunstâncias especiais (= usando o novo href="http://msdn.microsoft.com/en-us/library/bb397951.aspx" rel="nofollow noreferrer"> quadro ):
// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;
Isso cria uma árvore de expressão para o lambda, ou seja, uma função de tomar uma int
e retornando a dupla. Você pode modificar a árvore de expressão usando a estrutura expressões (= as classes de em que namespace) e, em seguida, compilá-lo em tempo de execução:
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 as expressões são imutáveis ??por isso têm de ser construído de novo por composição. Neste caso, eu prefixado uma adição de 1.
Observe que essas árvores de expressão só funcionam em expressões reais ou seja, conteúdo encontrado em uma função C #. Você não pode obter árvores de sintaxe para construções maiores, como aulas desta forma. Use o quadro CodeDom para estes.
Confira .NET CodeDom apoio. Há um artigo de idade no projeto de código para um C # CodeDOM analisador , mas ganhou 't suportar os novos recursos de linguagem.
Há também é suposto ser de apoio em #develop para gerar uma árvore CodeDom de código C # fonte de acordo com esta postagem .
Há muito poderoso do que R # projeto. Nemerle.Peg:
E tem C # Parser que analisadores de todo o código C # e traduz a AST!
Você pode baixar o instalador aqui: https://code.google.com/p/nemerle/
Pessoalmente, eu usaria NRefactory , que é gratuito, open source e ganha popularidade.
Parece que este tipo de funcionalidade será incluída com o que vem após C # 4, de acordo com Anders 'Future of C #' do Hejlsberg PDC vídeo .
O ANTLR gerador de analisador tem uma gramática para C # 3.0, que cobre tudo, exceto para a sintaxe LINQ.
Eu apenas respondeu em outro segmento aqui no StackOverflow uma solução onde eu implementada uma API para criar e manipular AST de código fonte C #
É estranho que ninguém sugeriu cortar o # compilador Mono C existente.
Nosso C front end # para DMS analisa completo C # 3.0 incluindo LINQ e produz ASTs. DMS, de facto, é um ecossistema para a análise / transformação de código fonte usando ASTs para front-end langauges prestados.
EDIT 2010/03/10: ... Agora lida com plena C # 4.0
EDIT: 2014/06/27:. Handles C # 5.0 desde completamente por algum tempo
EDIT: 6/15/2016: Punhos C # 6.0. Consulte https://stackoverflow.com/a/37847714/120163 para uma AST amostra.
ANTLR não é muito útil. LINQ não é o que você quer.
Tente Mono.Cecil! http://www.mono-project.com/Cecil
É usado em muitos projetos, incluindo NDepend! http://www.ndepend.com/
Por favor, veja o projeto R # (desculpe os documentos estão em russo, mas existem alguns exemplos de código). Ele permite manipulações AST em código C #.
http://www.rsdn.ru/projects/rsharp/article /rsharp_mag.xml
SVN do Projeto é aqui : (URL atualizado, graças, derigel )
Além disso consulte o href="http://nemerle.org/Main_Page" rel="nofollow noreferrer"> Nemerle linguagem . É uma linguagem .Net com um forte apoio para metaprogramming.