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.

Foi útil?

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

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 .

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.

scroll top