현재 C# 코드를 추상 구문 트리로 변환 할 수 있습니까?C# 코드를 AST로 변환 하시겠습니까?
편집 : 일부 설명; 필자는 컴파일러가 나를 위해 AST를 생성 할 것을 기대하지 않는다. 파서는 괜찮을 것이다. "공식적인 것"을 사용하고 싶다. 불행히도 람다 표현은 내가 성명서 본문을 사용하는 것을 허용하지 않는다면 충분하지 않을 것입니다. 그것은 내가 찾고있는 것입니다.
현재 C# 코드를 추상 구문 트리로 변환 할 수 있습니까?C# 코드를 AST로 변환 하시겠습니까?
편집 : 일부 설명; 필자는 컴파일러가 나를 위해 AST를 생성 할 것을 기대하지 않는다. 파서는 괜찮을 것이다. "공식적인 것"을 사용하고 싶다. 불행히도 람다 표현은 내가 성명서 본문을 사용하는 것을 허용하지 않는다면 충분하지 않을 것입니다. 그것은 내가 찾고있는 것입니다.
Roslyn 프로젝트는 Visual Studio 2010에 있으며 다른 것들 중에서 프로그래밍 방식으로 Syntax Tree에 액세스 할 수 있습니다.
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
나는이 질문을 내 질문에 대한 답으로 게시하려고했으나 그 질문에 나를 이겼다. =) –
.NET CodeDom을 확인하십시오. C# CodeDOM parser의 코드 프로젝트에 대한 이전 기사가 있지만 새로운 언어 기능을 지원하지 않습니다.
또한 posting에 따라 C# 소스 코드에서 CodeDom 트리를 생성하기위한 #develop를 지원해야합니다.
R # 프로젝트를 참조하십시오 (미안하지만 문서는 러시아어로되어 있지만 몇 가지 코드 예가 있습니다). 그것은 C# 코드에서 AST 조작을 허용합니다.
http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml
프로젝트의 SVN은 here입니다 : (업데이트 된 URL, 감사, derigel)
는 또한 Nemerle 언어를 참조하십시오. 메타 프로그래밍을 강력하게 지원하는 .Net 언어입니다.
저장소가 http://svn.rsdn.ru/svn/RSharp/ – derigel
현재 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 프레임 워크를 사용하십시오.
에 있습니다.이 작업을 수락 했습니까? 그는 그가 원하지 않는다고 말한 매우 람다 형태를 사용합니다. –
Ira : 토론의 발전에주의를 기울여야합니다. 이 항목은 * Erik의 편집/설명 이전에 게시되었습니다. 외관상으로는, 다른 응답의 아무도는 * (주의 사항 : * 1 년 전에! *) 그 당시에는 더 좋았습니다. 그래서 그는 다른 대답을 받아들이지 않았습니다. 당신의 대답은 아마 그가 원했을 것입니다. –
Anders Hejlsberg's 'Future of C#' PDC video에 따르면이 종류의 기능이 C# 4 이후의 항목에 포함될 것 같습니다.
이것은 C# API를 조작하기 위해 C#이 라이브러리를 제공하지 않는 것을 확인하는 데 도움이됩니다. 컴파일러는 클래식 한 것 인 블랙 박스 때문입니다! – yeeen
ANTLR Parser Generator에는 LINQ 구문을 제외한 모든 내용을 다루는 C# 3.0의 문법이 있습니다.
저는 ANTLR을 과거에 사용해 왔지만 아주 좋습니다. 나는 C# 문법을 사용하지 않았지만 거기에있는 대부분의 기여자들은 꽤 단서가있다. – Travis
우리의 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을 참조하십시오.
2004? 2010 년을 추측하고 있습니다. – Cheeso
@Cheeso : 음, 2004 년은 우리가 MS를 퍼덕 거렸다는 것을 의미합니다. 글쎄, 그것은 그것을 제안하지 않는다. 그래서 2010 년에 그것을 수정했다. 고정. –
ANTLR은별로 유용하지 않습니다. LINQ는 당신이 원하는 것이 아닙니다.
Mono.Cecil을 사용해보세요! http://www.mono-project.com/Cecil
NDepend를 비롯한 많은 프로젝트에서 사용됩니다! http://www.ndepend.com/
난 그냥 StackOverflow에 여기 다른 스레드에 내가 create and manipulate AST from C# Source Code
에 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/
또한. Nemerle은 Nemerle 컴파일러를 사용하여 C# 소스를 컴파일 할 수 있습니다! :) –
그것은 아무도 기존의 모노 C# 컴파일러를 해킹 제안 없다는 것을 이상하다.
개인적으로는 오픈 소스와 이익 인기, 무료 NRefactory를 사용합니다.
궁금해 UT는 어떻게 C# 코드를 AST로 변환하려고합니까? – yeeen
나는 프로젝트를 보류했다. –
장기간 개최 중 ... Lol –