문제

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

편집 : 일부 설명; 나는 컴파일러가 나에게 AST를 생성 할 것으로 기대하지는 않지만, "공식"을 사용하고 싶지만 파서는 괜찮을 것입니다. Lambda 표현은 불행히도 내가 찾고있는 진술 기관을 사용할 수 없다는 점에서 충분하지 않을 것입니다. 이것이 제가 찾고있는 것입니다.

도움이 되었습니까?

해결책

그만큼 로슬린 프로젝트는 Visual Studio 2010에 있으며 구문 트리, 다른 것들 사이.

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

다른 팁

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

예, 특별한 상황에서 사소한 (= 신규 사용 표현식 프레임 워크):

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

이것은 Lambda의 발현 트리를 만듭니다. 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# 함수에서 발견되는 실제 표현 IE 컨텐츠에만 작동합니다. 이런 식으로 클래스와 같은 더 높은 구조물에 대해 구문 트리를 얻을 수 없습니다. 이를 위해 Codedom 프레임 워크를 사용하십시오.

.NET를 확인하십시오 코드 지원하다. 코드 프로젝트에 대한 오래된 기사가 있습니다. C# codedom 파서, 그러나 새로운 언어 기능은 지원하지 않습니다.

#Develop에서 C # 소스 코드에서 CODEDOM 트리를 생성하기위한 지원이 있어야합니다. 전기.

R# 프로젝트보다 훨씬 강력합니다. nemerle.peg :

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

그리고 모든 C# 코드를 구문 분석하고 AST로 변환하는 C# Parser가 있습니다!

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

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

개인적으로 나는 사용할 것입니다 nrefactory, 이는 무료이며 오픈 소스이며 인기를 얻습니다.

이런 종류의 기능은 C# 4 이후에 오는 모든 것에 포함될 것 같습니다. Anders Hejlsberg의 '미래 C#'PDC 비디오.

그만큼 Antlr Parser 생성기 LINQ 구문을 제외한 모든 것을 다루는 C# 3.0 용 문법이 있습니다.

방금 STACKOVERFLOW의 다른 스레드에서 API를 구현 한 솔루션에 답했습니다. C# 소스 코드에서 AST를 작성하고 조작하십시오

아무도 기존 모노 C# 컴파일러를 해킹 할 것을 제안하지 않는 것이 이상합니다.

우리의 C# DMS의 프론트 엔드 LINQ를 포함하여 전체 C# 3.0을 구문 분석하고 AST를 생성합니다. 실제로 DMS는 프론트 엔드 제공 랑가우스의 ASTS를 사용하여 소스 코드를 분석/변환하기위한 생태계입니다.

3/10/2010 편집 : ... 이제 전체 C# 4.0을 처리합니다.

편집 : 2014 년 6 월 27 일 : 꽤 오랫동안 C# 5.0을 처리합니다.

편집 : 2016 년 6 월 15 일 : C# 6.0을 처리합니다. 보다 https://stackoverflow.com/a/37847714/120163 샘플 AST의 경우.

Antlr은 그다지 유용하지 않습니다. LINQ는 당신이 원하는 것이 아닙니다.

mono.cecil을 시도하십시오! http://www.mono-project.com/cecil

ndepend!를 포함한 많은 프로젝트에서 사용됩니다! http://www.ndepend.com/

R# 프로젝트를 참조하십시오 (Docs는 러시아어로 사용되지만 일부 코드 예제가 있습니다). C# 코드에서 AST 조작을 허용합니다.

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

프로젝트의 SVN입니다 여기: (URL 업데이트, 감사합니다. DERIGEL)

또한 참조하십시오 네머리 언어. 메타 프로 그램을 강력하게 지원하는 .NET 언어입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top