2010-03-15 2 views
9

나는 C# 코드를 구문 분석하고 매개 변수가있는 함수 목록, 메서드, 속성 등이있는 클래스를 반환하는 클래스 집합 (.net 프레임 워크가 바람직 함)을 찾고 있습니다. 이상적으로 내 자신의 인텔리 센스를 구축하는 데 필요한 모든 것을 제공 할 것입니다.C# 코드 파서 찾기

.net 프레임 워크에 있어야한다는 느낌이 들었습니다. 제공하는 모든 반사 요소를 감안할 때, 그렇다면 오픈 소스 대안으로 충분합니다.

제가 작성하려고하는 것은 기본적으로 스 니펫 컴파일러와 비슷하지만 비틀어졌습니다. 나는 먼저 코드 돔을 얻는 방법을 알아 내려고 노력하고있다.

나는 이것에 대한 정확한 용어가 무엇인지 모르겠다. 그래서 나는 비어있게되었다.

편집 : intellisense와 같은 처리에이 코드를 사용하려고하므로 코드를 실제로 컴파일하는 것은 불완전하기 때문에 실제로는 작동하지 않습니다. 미안해, 먼저 언급 했어야 했어.

+0

불완전한 코드 또는 오류가있는 코드 (즉, 일반 컴파일러로 컴파일하지 않는 코드)와 작동해야합니까? 일반적으로 IntelliSense 스타일의 파서에 대한 요구 사항입니다. –

+0

그래, 불완전한 코드에서 작동해야합니다. 나는 온 - 더 - 플라이 물건을 찾고 있어요. – Blindy

답변

5

.NET의 CodeDom 네임 스페이스는 basic API for code language parsers을 제공하지만 구현되지 않습니다. Visual Studio는 자체 언어 서비스를 통해이 작업을 수행합니다. 재배포 가능 프레임 워크에서는 사용할 수 없습니다.

당신은 ... 하나 수

  1. 코드는 다음 어셈블리 결과에서 이러한 구문 트리를 생성 모노 C# 컴파일러와 같은 뭔가
  2. 봐 반사를 사용하여 컴파일합니다. CodeDom과 같은 상위 API는 아니지만 어쩌면 함께 작업 할 수 있습니다.

something on CodePlex 또는 유사한 사이트가있을 수 있습니다.

업데이트
이 관련 게시물을 참조하십시오. Parser for C#

+0

+1도 업데이트 할 수 있습니다. 실행 가능한 솔루션이 포함되어 있습니다. –

1

CSharpCodeCompilerMicrosoft.CSharp 네임 스페이스에서 확인하십시오. CSharpCodeCompiler을 사용하여 컴파일하고 CompilerResults.CompiledAssembly을 사용하여 결과 어셈블리에 액세스 할 수 있습니다. 해당 어셈블리에서 유형을 가져올 수 있고 유형을 벗어난 경우 리플렉션을 사용하여 모든 특성 및 메소드 정보를 얻을 수 있습니다.

변경 사항이있을 때마다 모든 소스 코드를 컴파일해야하기 때문에 평균적인 성능을 발휘합니다. 나는 당신이 코드 스 니펫을 증분 컴파일 할 수있게 해주는 어떤 방법도 알지 못한다.

1

Microsoft.CSharp.CSharpCodeProvider 클래스를 사용해 보셨습니까? 이것은 CodeDom을 지원하는 완전한 C# 코드 공급자입니다. 텍스트 스트림에서 .Parse()를 호출하기 만하면 CodeCompileUnit이 반환됩니다.

var codeStream = new StringReader(code); 
var codeProvider = new CSharpCodeProvider(); 

var compileUnit = codeProvider.Parse(codeStream); 

// compileUnit contains your code dom 

음, 위의 작동하지 않습니다 (난 그냥 그것을 테스트), 다음 문서가 관심이 될 수도로보고. 오래 전 좋은 일을 북마크 했으므로 C# 2 만 지원합니다.

당신이 거기에 오류가있는 불완전 코드, 코드 작업을해야한다면, 내가 믿는

Generate Code-DOMs directly from C# or VB.NET

+0

이것은 코드 dom 제공자에 의해 구현되지 않고 NotImplementedException을 던집니다. – Josh

+0

@ Josh : 당신이 옳다고 보입니다. 방금 시도했는데 실제로 실패합니다. 그런 망할 놈. – jrista

2

당신이있어 자신에 거의 (0,하지만 여전히 가치가있을 수도 있습니다 즉, CSharpCodeCompiler 클래스 또는 이와 유사한 것을 사용할 수 없습니다.

자체 파싱을 수행하는 ReSharper와 같은 도구가 있지만 전문의 것입니다. Mono 컴파일러로 시작할 수도 있지만, 제 경험에 따르면 불완전한 코드에서 작동하는 파서를 작성하는 것은 불완전한 코드에서 오류가 발생하는 것과는 완전히 다른 볼거리입니다.

클래스 및 메서드 (메타 데이터, 기본적으로)의 이름이 필요한 경우 "손으로"구문 분석을 수행 할 수 있지만 결과가 얼마나 정확한지에 따라 달라질 수 있습니다.

+0

그래, 나는 그것을 손으로 파싱하는 것을 고려하기 시작했다. 하지만 이것이 제네릭에 얼마나 어려울 지 확신하지 못합니다. – Blindy

2

모노 프로젝트 GMCS 컴파일러에는 C# 4.0 용 재사용 가능한 파서가 포함되어 있습니다. 그리고 자신의 파서를 작성하는 것이 상대적으로 쉽습니다. http://antlrcsharp.codeplex.com/

+0

이미 작성된 파서의 문제점은 불완전한 (따라서 유효하지 않은) 코드에서 작동하지 않는다는 것입니다. 그들의 목적은 인텔리 센스 (intellisense)를위한 데이터를 제공하지 않고 코드를 생성 할 수있을만큼 상세한 구문 트리를 만드는 것입니다. – Blindy

+0

예. 그러나 재사용이 가능하기 때문에 쉽게 조정할 수 있습니다. ANTLR은 부분 구문 분석에 사용될 수 있습니다. 물론 가장 일반적인 옵션은 PEG입니다. 따라서 .NET 용 괜찮은 PEG 구현을 유지하고 기존 ANTLR 파서를 이식 할 수 있다면 빠르고 쉬운 일반 솔루션을 얻을 수 있습니다. 예를 들어, http://www.meta-alternative.net/mbase.html의 Packrat 파서는 일반 구문 외의 텍스트 편집기에 대한 구문 강조 모드를 생성 할 수 있으며 불완전하거나 유효하지 않은 구문으로 잘 작동합니다 입력. –

1

그것은 Blindy에 대해 조금 늦게 될 수도 있지만 나는 최근에이 코드 조각을 처리 할 수 ​​있도록 설계 및 의견을 유지하는 것 같은 이런 종류의 물건에 대한 완벽한 것 C#을 파서을 발표 : 예를 들어, 당신은이를 다시 사용할 수 있습니다 : C# Parser and CodeDOM

또한 C# 4.0과 새로운 '비동기'기능을 처리합니다. 상업용이지만 다른 상업용 컴파일러의 비용 중 작은 부분입니다.

저는 실제로 C#의 구문 분석이 얼마나 어려웠는지 깨닫지 못합니다. 특히 기호 적 참조를 제대로 처리해야하는 경우 (보통 서식 지정을하지 않는 한 일반적으로 필요합니다) 특히 그렇습니다. 을 시도하면 500+ 페이지 언어 사양의 유형 유추 섹션을 읽고 완전히 이해할 수 있습니다. 그런 다음, 스펙이 실제로 완전히 정확하지 않다는 사실을 명상하십시오 (Eric Lippert 자신이 언급 한 것처럼).