중괄호 일치 (패키지 관리 프레임 워크)
중괄호 일치 개발자, 괄호 및 중괄호 등 발생 해야 하는 언어 요소를 추적할 수 있습니다. 개발자는 닫는 중괄호를 입력 하면 여는 중괄호를 강조 표시 됩니다.
쌍 및 triples 라는 두 가지 또는 세 개의 co-occurring 요소를 일치 시킬 수 있습니다. Triples 세 co-occurring 요소 집합입니다. 예를 들어,에서 C#의 foreach 문 형성에 세 번: "foreach()","{", 및 "}". 닫는 괄호를 입력 하면 세 가지 요소를 모두 강조 표시 됩니다.
AuthoringSink 클래스 모두를 지원 하 고 함께 triples는 MatchPair 및 MatchTriple 방법입니다.
구현
언어에 일치 하는 모든 요소를 확인 하 고 다음 모든 짝을 찾아 언어 서비스를 해야 합니다. 이 일반적으로 구현 하 여 수행 됩니다 IScanner 일치 하는 언어 및 사용 하 고 검색 하는 ParseSource 메서드는 요소와 일치 하도록 합니다.
OnCommand 메서드 호출 줄 토큰화 캐럿 바로 앞에 토큰을 반환 하는 검색 프로그램입니다. 스캐너가 토큰 트리거 값을 설정 하 여 언어 요소 쌍 발견 되었습니다 나타냅니다 MatchBraces 에서 현재 토큰입니다. OnCommand 메서드 호출을 MatchBraces 차례로 호출 되는 메서드는 BeginParse 메서드 구문 분석 이유로 값을 가진 MatchBraces 일치 하는 언어 요소를 찾습니다. 일치 하는 언어 요소가 없는 경우 두 가지 요소를 강조 표시 됩니다.
중괄호가 입력 중괄호 강조 발생에 대 한 전체 설명을 항목 "예제 구문 분석 작업" 단원을 참조 하십시오. 언어 서비스 파서 및 검색 프로그램 (관리 되는 패키지 프레임 워크).
중괄호 일치에 대 한 지원 사용
ProvideLanguageServiceAttribute 특성을 설정할 수 있습니다의 MatchBraces, MatchBracesAtCaret, 및 ShowMatchingBrace 명명 된 해당 속성을 설정 하는 매개 변수는 LanguagePreferences 클래스입니다. 또한 사용자가 언어 기본 설정의 등록 정보를 설정할 수 있습니다.
레지스트리 항목 |
Property |
설명 |
---|---|---|
MatchBraces |
수 있도록 중괄호 일치 |
|
MatchBracesAtCaret |
수 있도록 캐럿으로 중괄호 일치를 이동 합니다. |
|
ShowMatchingBrace |
일치 하는 중괄호를 강조 표시합니다. |
일치 하는 조건부 문
같은 조건문을 일치 시킬 수 있습니다 if, else if, 및 else, 또는 #if, #elif, #else, #endif, 같은 방식으로 구분 기호를 일치 하는. 서브 클래스 수는 AuthoringSink 클래스 및 텍스트를 추가 하는 메서드를 걸쳐 같은 요소에 일치 하는 내부 배열에 대 한 구분 기호를 제공 합니다.
트리거 설정
다음 예제에서는 일치 하는 괄호, 중괄호 및 사각 괄호 및 스캐너에 대 한 트리거 설정 검색 하는 방법을 보여 줍니다. OnCommand 방법에는 Source 클래스 트리거를 감지 하 고 (이 항목의 "일치 찾기" 섹션을 참조 하십시오)은 일치 하는 쌍을 찾으려면 파서를 호출 합니다. 이 예제는 설명을 위한 것입니다. 스캐너는 메서드를 포함 하는 가정 GetNextToken 를 식별 하 고 텍스트 줄의 토큰을 반환 합니다.
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestScanner : IScanner
{
private const string braces = "()[]{}";
private Lexer lex;
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
ref int state)
{
bool foundToken = false;
string token = lex.GetNextToken();
if (token != null)
{
foundToken = true;
char firstChar = token[0];
if (Char.IsPunctuation(firstChar) && token.Length == 0)
{
if (braces.IndexOf(c) != -1)
{
tokenInfo.Trigger = TokenTriggers.MatchBraces;
}
}
}
return foundToken;
}
중괄호 일치
언어 요소 {}, (), 및와 일치 하는 및 해당 범위에 추가 하는 간단한 예를 AuthoringSink 개체입니다. 이 방법은 소스 코드를 구문 분석 하는 권장 되는 방법은 아닙니다. 이 설명을 위한 것입니다.
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class Parser
{
private IList<TextSpan[]> m_braces;
public IList<TextSpan[]> Braces
{
get { return m_braces; }
}
private void AddMatchingBraces(TextSpan braceSpan1, TextSpan braceSpan2)
{
if IsMatch(braceSpan1, braceSpan2)
m_braces.Add(new TextSpan[] { braceSpan1, braceSpan2 });
}
private bool IsMatch(TextSpan braceSpan1, TextSpan braceSpan2)
{
//definition for matching here
}
}
public class TestLanguageService : LanguageService
{
Parser parser = new Parser();
Source source = (Source) this.GetSource(req.FileName);
private AuthoringScope ParseSource(ParseRequest req)
{
if (req.Sink.BraceMatching)
{
if (req.Reason==ParseReason.MatchBraces)
{
foreach (TextSpan[] brace in parser.Braces)
{
req.Sink.MatchPair(brace[0], brace[1], 1);
}
}
}
return new TestAuthoringScope();
}
}
}
참고 항목
개념
언어 서비스 파서 및 검색 프로그램 (관리 되는 패키지 프레임 워크)