Parser para C #

101

Quais analisadores estão disponíveis para analisar o código C #?

Estou procurando um analisador C # que possa ser usado em C # e me dê acesso a informações de linha e arquivo sobre cada artefato do código analisado.

Julien Hoarau
fonte

Respostas:

118

Funciona no código-fonte:

Trabalha na montagem:

O problema com a "análise" da montagem é que temos menos informações sobre a linha e o arquivo (as informações são baseadas no arquivo .pdb, e o Pdb contém informações das linhas apenas para métodos)

Eu pessoalmente recomendo Mono.Cecil e NRefactory .

Julien Hoarau
fonte
1
CS-Script ( csscript.net ) - o C # Script Engine pode incluir esta lista. Amostra de "Apresentando o Microsoft“ Roslyn ”CTP" é muito parecido com o que um script CS pode fazer.
Dzmitry Lahoda,
1
Enquanto você menciona custos, observe que Roslyn requer pelo menos a versão Pro do Visual Studio.
Kristianp
7

Mono (código aberto) inclui compilador C # (e, claro, analisador)

aku
fonte
Qual é a vantagem de usar Mono em relação a outro analisador? Posso obter informações do AST de um programa C # usando um visitante? Se sim, você pode me direcionar para a página que mostra a página para isso?
yeeen,
6

Se você for compilar C # v3.5 para assemblies .net:

var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx

zproxy
fonte
1
Particularmente, observe o CodeDomProvider.Parse()método.
Don Kirkby
3
Não, não olhe para o método CodeDomProvider.Parse () que lança uma exceção NotImplemented em compilações públicas! (Visual Studio usa um analisador interno proprietário).
Robin Davies
5

Se você estiver familiarizado com ANTLR, poderá usar a gramática Antlr C # .

prosseek
fonte
4

Implementei exatamente o que você está pedindo (análise AST do código C #) na plataforma OWASP O2 projeto da usando APIs AST SharpDevelop.

Para torná-lo mais fácil de consumir, escrevi uma API rápida que expõe vários elementos-chave do código-fonte (usando instruções, tipos, métodos, propriedades, campos, comentários) e é capaz de reescrever o código C # original em C # e em VBNET .

Você pode ver esta API em ação neste arquivo de script O2 XRule: ascx_View_SourceCode_AST.cs.o2 .

Por exemplo, é assim que você processa um texto de código-fonte C # e preenche uma série de TreeViews e TextBoxes:

    public void updateView(string sourceCode)
    {   
        var ast = new Ast_CSharp(sourceCode);
        ast_TreeView.show_Ast(ast);
        types_TreeView.show_List(ast.astDetails.Types, "Text");
        usingDeclarations_TreeView.show_List(ast.astDetails.UsingDeclarations,"Text");
        methods_TreeView.show_List(ast.astDetails.Methods,"Text");
        fields_TreeView.show_List(ast.astDetails.Fields,"Text");
        properties_TreeView.show_List(ast.astDetails.Properties,"Text");
        comments_TreeView.show_List(ast.astDetails.Comments,"Text");

        rewritenCSharpCode_SourceCodeEditor.setDocumentContents(ast.astDetails.CSharpCode, ".cs");
        rewritenVBNet_SourceCodeEditor.setDocumentContents(ast.astDetails.VBNetCode, ".vb");                                
    }

O exemplo em ascx_View_SourceCode_AST.cs.o2 também mostra como você pode usar as informações coletadas do AST para selecionar no código-fonte um tipo, método, comentário, etc.

Para referência, aqui está o código da API que escrevi (observe que esta é minha primeira passagem usando o analisador C # AST da SharpDevelop, e ainda estou tentando entender como ele funciona):

Dinis cruz
fonte
Sim, esta parece ser a solução mais fácil, pelo menos com base no que tenho visto. Eu estava procurando por um analisador decente e me deparei com este blog svengrand.blogspot.com/2010/10/… que também detalha como usar o analisador C # do SharpDevelop.
Alex
3

Recentemente, lançamos um analisador C # que lida com todos os recursos do C # 4.0, além do novo recurso assíncrono: Analisador C # e CodeDOM

Esta biblioteca gera um modelo de objeto semântico que retém comentários e informações de formatação e pode ser modificado e salvo. Ele também oferece suporte ao uso de consultas LINQ para analisar o código-fonte.

Ken Beckett
fonte
2

SharpDevelop , um IDE de código aberto, vem com um analisador de código baseado em visitante que funciona muito bem. Ele pode ser usado independentemente do IDE.

Akselsson
fonte
2

Considere o uso de reflexão em um binário integrado em vez de analisar o código C # diretamente. A API de reflexão é realmente fácil de usar e talvez você possa obter todas as informações de que precisa?

Hallgrim
fonte
3
A reflexão é uma maneira ruim de fazer análise estática; fornece apenas as informações que a lógica de reflexão pode extrair (por exemplo, "nomes dos métodos da classe". Não fornece informações detalhadas ("qual é o lado direito desta atribuição?") e limita severamente esse tipo de estática análise que se pode fazer.
Ira Baxter
@Ira Baxter Existem algumas limitações, mas lembre-se de que você também pode obter o código IL por meio de reflexão. Isso significa que você pode entender quais métodos são chamados, o que são atribuídos a quais variáveis, etc. Não consigo pensar em muitos casos em que isso não seja suficiente. Basta olhar para o que todos os plug-ins Reflector podem fazer.
Hallgrim
como você obtém o código IL real por meio do Reflection? Pelo que eu sei, o Reflection não fornece isso e você precisa usar o CCI. Consulte: stackoverflow.com/questions/2824086/…
Ash
2

Dê uma olhada no Gold Parser . Tem uma IU muito intuitiva que permite testar interativamente sua gramática e gerar código C #. Existem muitos exemplos disponíveis com ele e é totalmente gratuito.

Sbeskur
fonte
2
O OP pediu algo que possa analisar C #, não algo em C # que analise outra coisa.
Ira Baxter
2

Talvez você possa tentar com o Irony em irony.codeplex.com.

É muito rápido e já existe uma gramática c #.

A própria gramática é escrita diretamente em c # de forma semelhante ao BNF (obtida com algumas sobrecargas de operadores)

A melhor coisa com isso é que a "gramática" produz o AST diretamente.

SeeSoft
fonte
O comentário em Irony.Samples / CSharp / CSharpGrammar.cs diz "NOTA: Esta gramática é apenas uma demonstração, e é uma demonstração quebrada". Portanto, pelo menos não é uma implementação completa.
Vladich
2

Você definitivamente deve verificar o Roslyn, já que a MS acabou de abrir (ou abrirá em breve) o código com uma licença Apache 2 aqui . Você também pode verificar uma maneira de analisar essas informações com este código do GitHub .

Jason
fonte
1

Algo que está ganhando impulso e muito apropriado para o trabalho é Nemerle

você pode ver como isso poderia resolver nestes vídeos da NDC:

Stéphane
fonte
Nemerle é uma linguagem de programação. Uma boa linguagem de programação, eu concordo, mas a questão era como analisar o código C # dentro do C #!
Qwertie
você cria regras em nemerle e usa-as a partir de C #, nada dizia que o analisador tinha que estar em C #, mas enfim, downvote afastado.
Stéphane,
1

Não em C #, mas um analisador C # 2/3/4 completo que cria ASTs completos está disponível com nosso DMS Software Reengineering Toolkit .

O DMS fornece uma vasta infraestrutura para análise, construção de árvore, construção de tabelas de símbolos e análises de fluxo, transformação de origem para origem e regeneração de código-fonte dos ASTs (modificados). (Ele também lida com muitas outras linguagens além de apenas C #.)

EDIT (setembro) 2013: Esta resposta não foi atualizada recentemente. DMS há muito lidou com C # 5.0

Ira Baxter
fonte
-1

O GPPG pode ser útil, se você estiver disposto a escrever seu próprio analisador (o que é divertido).

leppie
fonte