C # 용 파서


101

C # 코드를 구문 분석하는 데 사용할 수있는 파서는 무엇입니까?

C #에서 사용할 수 있고 분석 된 코드의 각 아티팩트에 대한 줄 및 파일 정보에 액세스 할 수있는 C # 파서를 찾고 있습니다.

답변:


118

소스 코드에서 작동 :

조립 작업 :

어셈블리 "파싱"의 문제는 줄과 파일에 대한 정보가 적다는 것입니다 (정보는 .pdb 파일을 기반으로하고 Pdb에는 메서드에 대한 줄 정보 만 포함됨).

Mono.CecilNRefactory를 개인적으로 추천 합니다.


1
CS-Script ( csscript.net )-C # 스크립트 엔진이이 목록에 적합 할 수 있습니다. "Microsoft"Roslyn "CTP 소개"샘플은 CS-script가 할 수있는 것과 매우 유사합니다.
Dzmitry Lahoda

1
비용을 언급하는 동안 Roslyn에는 최소한 Pro 버전의 Visual Studio가 필요합니다.
kristianp 2012

7

Mono (오픈 소스)에는 C # 컴파일러 (물론 파서 포함)가 포함됩니다.


Mono를 다른 파서보다 사용하면 어떤 이점이 있습니까? 방문자를 사용하여 C # 프로그램의 AST 정보를 얻을 수 있습니까? 그렇다면 해당 페이지를 보여주는 페이지로 나를 안내 할 수 있습니까?
yeeen

6

C # v3.5를 .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


1
특히 CodeDomProvider.Parse()방법을 살펴보십시오 .
Don Kirkby

3
아니요, 공개 빌드에서 NotImplemented 예외를 발생시키는 CodeDomProvider.Parse () 메서드를 보지 마십시오! (Visual Studio는 독점 내부 파서를 사용합니다).
Robin Davies


4

저는 SharpDevelop AST API를 사용하여 OWASP O2 플랫폼 프로젝트 에서 귀하가 요청한 것 (C # 코드의 AST 구문 분석)을 구현했습니다 .

더 쉽게 사용할 수 있도록 여러 주요 소스 코드 요소 (문, 유형, 메서드, 속성, 필드, 주석 사용)를 노출하고 원본 C # 코드를 C # 및 VBNET에 다시 쓸 수있는 빠른 API를 작성했습니다. .

이 O2 XRule 스크립트 파일에 대한 조치에서이 API를 볼 수 있습니다 ascx_View_SourceCode_AST.cs.o2를 .

예를 들어 다음은 C # 소스 코드 텍스트를 처리하고 여러 TreeView 및 TextBox를 채우는 방법입니다.

    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");                                
    }

ascx_View_SourceCode_AST.cs.o2 의 예제 는 AST에서 수집 한 정보를 사용하여 소스 코드에서 유형, 메소드, 주석 등을 선택하는 방법을 보여줍니다.

참고로 여기에 작성한 API 코드가 있습니다 (SharpDevelop의 C # AST 파서를 사용하는 첫 번째 패스이며 작동 방식에 대해 여전히 고심하고 있습니다).


네 이것은 적어도 내가 본 것을 기반으로 한 가장 쉬운 해결책 인 것 같습니다. 나는 괜찮은 파서를 찾고 있었고이 블로그 svengrand.blogspot.com/2010/10/… 을 우연히 발견했습니다.이 블로그 는 SharpDevelop의 C # 파서를 사용하는 방법도 자세히 설명합니다.
알렉스

3

최근에 모든 C # 4.0 기능과 새로운 비동기 기능인 C # 파서 및 CodeDOM 을 처리하는 C # 파서를 출시했습니다.

이 라이브러리는 주석 및 서식 정보를 유지하고 수정 및 저장할 수있는 의미 객체 모델을 생성합니다. 또한 LINQ 쿼리를 사용하여 소스 코드를 분석 할 수 있습니다.



2

오픈 소스 IDE 인 SharpDevelop 에는 방문자 기반 코드 파서가 함께 제공됩니다. IDE와 독립적으로 사용할 수 있습니다.


2

C # 코드를 직접 구문 분석하는 대신 빌드 된 바이너리에 리플렉션을 사용하는 것이 좋습니다. 리플렉션 API는 정말 사용하기 쉽고 필요한 모든 정보를 얻을 수 있습니까?


3
반사는 정적 분석을 수행하는 나쁜 방법입니다. 리플렉션 로직이 추출 할 수있는 정보 (예 : "클래스의 메소드 이름") 만 제공합니다. 세부 정보 ( "이 할당의 오른쪽은 무엇입니까?")를 제공하지 않으며 이러한 종류의 정적을 심각하게 제한합니다. 분석 할 수 있습니다.
Ira Baxter

@Ira Baxter 몇 가지 제한 사항이 있지만 리플렉션을 통해 IL 코드를 얻을 수도 있습니다. 즉, 어떤 메서드가 호출되는지, 어떤 변수에 어떤 것이 할당되는지 등을 이해할 수 있습니다. 충분하지 않은 경우는 많이 생각할 수 없습니다. 모든 Reflector 플러그인이 무엇을 할 수 있는지 살펴보십시오.
Hallgrim

Reflection을 통해 실제 IL 코드를 어떻게 얻습니까? 내가 아는 한 Reflection은 이것을 제공하지 않으며 CCI를 사용해야합니다. 참조 : stackoverflow.com/questions/2824086/…
Ash

2

Gold Parser를 살펴보십시오 . 대화식으로 문법을 테스트하고 C # 코드를 생성 할 수있는 매우 직관적 인 IU가 있습니다. 그것과 함께 사용 가능한 많은 예제가 있으며 완전히 무료입니다.


2
OP는 다른 것을 파싱하는 C #이 아닌 C #을 파싱 할 수있는 무언가를 요청했습니다.
Ira Baxter

2

irony.codeplex.com에서 Irony를 사용해 볼 수 있습니다.

매우 빠르고 ac # 문법이 이미 존재합니다.

문법 자체는 BNF와 같은 방식으로 C #으로 직접 작성됩니다 (일부 연산자 오버로드로 어려움을 겪음).

가장 좋은 점은 "문법"이 AST를 직접 생성한다는 것입니다.


Irony.Samples / CSharp / CSharpGrammar.cs의 주석은 "참고 :이 문법은 데모 일 뿐이며 깨진 데모입니다"라고 말합니다. 따라서 적어도 완전한 구현은 아닙니다.
vladich

2

MS가 방금 Apache 2 라이선스로 코드를 열었거나 곧 열리므로 Roslyn을 확인해야 합니다 . GitHub 에서이 코드를 사용하여이 정보를 구문 분석하는 방법을 확인할 수도 있습니다 .


1

추진력을 얻고 작업에 매우 적합한 것은 Nemerle입니다.

NDC의 다음 비디오에서 어떻게 해결할 수 있는지 확인할 수 있습니다.


Nemerle은 프로그래밍 언어입니다. 좋은 프로그래밍 언어, 동의하지만 C # 내부에서 C # 코드를 구문 분석하는 방법이 문제였습니다!
Qwertie 2014 년

nemerle에서 규칙을 생성하고 C #에서 사용합니다. 파서가 C #에 있어야한다는 말은 없지만 무엇이든 반대표를 던집니다.
Stéphane 2014 년

1

C #에는 없지만 전체 AST를 빌드하는 전체 C # 2/3/4 파서는 DMS 소프트웨어 리엔지니어링 툴킷 과 함께 사용할 수 있습니다 .

DMS는 구문 분석, 트리 구축, 심볼 테이블 구성 및 흐름 분석, 소스에서 소스로의 변환, (수정 된) AST에서 소스 코드 재생성을위한 방대한 인프라를 제공합니다. (또한 C # 이외의 다른 많은 언어도 처리합니다.)

편집 (9 월) 2013 :이 답변은 최근에 업데이트되지 않았습니다. DMS는 오랫동안 C # 5.0을 처리했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.