2008-10-17 13 views
15

현재 C# 코드를 추상 구문 트리로 변환 할 수 있습니까?C# 코드를 AST로 변환 하시겠습니까?

편집 : 일부 설명; 필자는 컴파일러가 나를 위해 AST를 생성 할 것을 기대하지 않는다. 파서는 괜찮을 것이다. "공식적인 것"을 사용하고 싶다. 불행히도 람다 표현은 내가 성명서 본문을 사용하는 것을 허용하지 않는다면 충분하지 않을 것입니다. 그것은 내가 찾고있는 것입니다.

+0

궁금해 UT는 어떻게 C# 코드를 AST로 변환하려고합니까? – yeeen

+0

나는 프로젝트를 보류했다. –

+4

장기간 개최 중 ... Lol –

답변

17

Roslyn 프로젝트는 Visual Studio 2010에 있으며 다른 것들 중에서 프로그래밍 방식으로 Syntax Tree에 액세스 할 수 있습니다.

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

나는이 질문을 내 질문에 대한 답으로 게시하려고했으나 그 질문에 나를 이겼다. =) –

6

.NET CodeDom을 확인하십시오. C# CodeDOM parser의 코드 프로젝트에 대한 이전 기사가 있지만 새로운 언어 기능을 지원하지 않습니다.

또한 posting에 따라 C# 소스 코드에서 CodeDom 트리를 생성하기위한 #develop를 지원해야합니다.

0

R # 프로젝트를 참조하십시오 (미안하지만 문서는 러시아어로되어 있지만 몇 가지 코드 예가 ​​있습니다). 그것은 C# 코드에서 AST 조작을 허용합니다.

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

프로젝트의 SVN은 here입니다 : (업데이트 된 URL, 감사, derigel)

는 또한 Nemerle 언어를 참조하십시오. 메타 프로그래밍을 강력하게 지원하는 .Net 언어입니다.

+0

저장소가 http://svn.rsdn.ru/svn/RSharp/ – derigel

12

현재 C# 코드를 추상 구문 트리로 변환 할 수 있습니까?

예, 사소 특별한 상황에서 (= 새로운 Expressions framework 사용) :

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

이것은 람다에 대한 식 트리, 즉 함수 int을 복용하고 이중 반환을 만듭니다. 당신은 (즉, 네임 스페이스에서 = 클래스를) 식 프레임 워크를 사용하여 식 트리를 수정 한 다음 실행시 컴파일 할 수 있습니다

그들에 의해 새롭게 구축 할 필요가 있으므로 모든 표현이 불변 공지 것을
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 

구성. 이 경우에는 1을 더 추가했습니다.

이 표현 트리는 실제 표현 즉 C# 함수에있는 내용에서만 작동합니다. 이런 식으로 클래스와 같은 상위 구문에 대한 구문 트리를 가져올 수 없습니다. CodeDom 프레임 워크를 사용하십시오.

+0

에 있습니다.이 작업을 수락 했습니까? 그는 그가 원하지 않는다고 말한 매우 람다 형태를 사용합니다. –

+1

Ira : 토론의 발전에주의를 기울여야합니다. 이 항목은 * Erik의 편집/설명 이전에 게시되었습니다. 외관상으로는, 다른 응답의 아무도는 * (주의 사항 : * 1 년 전에! *) 그 당시에는 더 좋았습니다. 그래서 그는 다른 대답을 받아들이지 않았습니다. 당신의 대답은 아마 그가 원했을 것입니다. –

2

Anders Hejlsberg's 'Future of C#' PDC video에 따르면이 종류의 기능이 C# 4 이후의 항목에 포함될 것 같습니다.

+0

이것은 C# API를 조작하기 위해 C#이 라이브러리를 제공하지 않는 것을 확인하는 데 도움이됩니다. 컴파일러는 클래식 한 것 인 블랙 박스 때문입니다! – yeeen

2

ANTLR Parser Generator에는 LINQ 구문을 제외한 모든 내용을 다루는 C# 3.0의 문법이 있습니다.

+0

저는 ANTLR을 과거에 사용해 왔지만 아주 좋습니다. 나는 C# 문법을 사용하지 않았지만 거기에있는 대부분의 기여자들은 꽤 단서가있다. – Travis

1

우리의 C# front end for DMS은 LINQ를 포함하여 전체 C# 3.0을 구문 분석하고 AST를 생성합니다. DMS는 실제로 프론트 엔드가 제공하는 langauges에 AST를 사용하여 소스 코드를 분석/변형하는 에코 시스템입니다.

EDIT 2010 년 3 월 10 일이 : 2014년 6월 27일 : ... 이제 전체 C# 4.0

편집을 처리하는 아주 잠시 때문에 C# 5.0을 처리합니다.

편집 : 6/15/2016 : C# 6.0을 처리합니다. 샘플 AST는 https://stackoverflow.com/a/37847714/120163을 참조하십시오.

+0

2004? 2010 년을 추측하고 있습니다. – Cheeso

+0

@Cheeso : 음, 2004 년은 우리가 MS를 퍼덕 거렸다는 것을 의미합니다. 글쎄, 그것은 그것을 제안하지 않는다. 그래서 2010 년에 그것을 수정했다. 고정. –

4

에 API를 구현하는 솔루션을 대답 한 R # 프로젝트보다 훨씬 강력한있다. Nemerle.Peg :

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

그리고 모든 C# 코드를 파서 및 AST로 변환 C#을 파서이있다!

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

당신은 여기에서 설치 프로그램을 다운로드 할 수 있습니다 https://code.google.com/p/nemerle/

+0

또한. Nemerle은 Nemerle 컴파일러를 사용하여 C# 소스를 컴파일 할 수 있습니다! :) –

1

그것은 아무도 기존의 모노 C# 컴파일러를 해킹 제안 없다는 것을 이상하다.

3

개인적으로는 오픈 소스와 이익 인기, 무료 NRefactory를 사용합니다.