2014-12-30 4 views
2

나는 semantic highlighting plugin for VS에서 작업 중입니다. 여기에서 웹 Example을 볼 수 있습니다.구문 분석 시맨틱 하이라이팅을위한 C# 코드 구문 분석

목표 : 모든 변수를 가져 와서 각각에 대해 서로 다른 분류를 작성하십시오.

문제 : C# 렉서를 작성하지 않고 코드에서 변수를 가져 오는 중입니다.

나의 현재 접근법은 ITagger를 사용합니다. 나는 ITagger로 전달되는 모든 범위의 태그를 얻기 위해 ITagAggregator를 사용합니다. 그런 다음 필자는 그것들을 걸러 내고 변수, 메소드 이름, 클래스 이름, 사용법 및 특성을 포함하는 "식별자"분류로만 범위를 만듭니다.

public class Classifier : ITagger<ClassificationTag> { 

    public IEnumerable<ITagSpan<ClassificationTag>> GetTags(NormalizedSnapshotSpanCollection spans) { 

     ITextSnapshot snapshot = spans[0].Snapshot; 

     var tags = _aggregator.GetTags(spans).Where((span) => span.Tag.ClassificationType.Classification.Equals("identifier")).ToArray(); 

     foreach(var classifiedSpan in tags) { 

      foreach(SnapshotSpan span in classifiedSpan.Span.GetSpans(snapshot)) { 
       //generate classification based on variable name 
       yield return new TagSpan<ClassificationTag>(span, new ClassificationTag(_classification)); 
      } 
     } 
    } 
} 

메타 데이터의 무리에 번들 된 모든 변수의 목록을 얻을 수있는 내장 C#을 렉서를 사용하는 것이 훨씬 쉬울 것이다. 이 데이터를 플러그인 개발에 사용할 수 있습니까? 내가 그것을 얻을 수있는 대안적인 방법이 있습니까?

답변

2

Visual Studio에서는 해당 정보를 코드 모델로 제공합니다.

Accessing attribute info from DTE

여기에 코드 모델에 대한 자세한 내용은 다음과 같습니다 : http://msdn.microsoft.com/en-us/library/ms228763.aspx

여기

는 클래스에 액세스하고 클래스에 속성을 발견하고 인수를 속성을 구문 분석하는 방법을 예입니다 여기에 제가 자주 사용했던 자동화 객체 모델 차트도 있습니다 : http://msdn.microsoft.com/en-us/library/za2b25t3.aspx

또한, Roslyn은 실제로 ap ossible 옵션. 다음은 roslyn을 사용하는 VS2015의 예입니다. https://github.com/tomasr/roslyn-colorizer/blob/master/RoslynColorizer/RoslynColorizer.cs

+0

흥미 롭습니다. 이것은 실제로 모든 기능을 사용하기 위해 VS 2014로 업데이트 할 필요가 없음을 의미합니다. 유용한 추가 사례가 있으십니까? –

+1

@Jedy; 특히 당신이 정확히 알고 싶은 것은 무엇입니까? 내 대답에 "자동화 개체 모델 차트"를 추가하여 매우 유용하며 쉽게 찾을 수 없습니다. 탐색하는 데 도움이됩니다. 특히, "CODE 요소"를 참조하십시오. 당신은 아마도 당신이 원하는'CodeVariable'에 접근 할 수 있습니다. 추신 : 귀하의 * 특정 * 경우, 그것은 "기본 C# 분류 자"를 사용하는 것이 현명 할 수도 있습니다.이 경우 식별자 만 알고 싶다면. –

1

건물 언어 도구의 경우 C# 용 파서 생성기를 사용하는 것이 더 좋을 수 있습니다. GOLD parsing system은 LALR 문법을 처리 할 수있는 툴킷 중 하나입니다. 프로젝트에 사용할 수있는 .NET component based engine이 있으며 모든 IDE와 통합하는 데 사용할 수 있습니다. 또한 C#을 비롯한 다양한 프로그래밍 언어에 대한 grammars을 찾을 수 있습니다.