언어 서비스 파서 및 검색 프로그램 (관리 되는 패키지 프레임 워크)
파서가 언어 서비스의 핵심입니다. 패키지 관리 프레임 워크 (MPF) 언어 클래스 표시 되 고 코드에 대 한 정보를 선택 하는 언어 파서가 필요 합니다. 파서 텍스트 어휘 토큰으로 구분 하 고 이러한 토큰 유형 및 기능을 식별 합니다.
토론
다음은 C# 메서드입니다.
namespace MyNamespace
{
class MyClass
{
public void MyFunction(int arg1)
{
int var1 = arg1;
}
}
}
이 예제에서는 토큰 단어와 문장 부호입니다. 토큰의 종류는 다음과 같습니다.
토큰 이름 |
토큰 형식 |
---|---|
네임 스페이스, 클래스, public void, int |
keyword |
= |
함수입니다. |
{ } ( ) ; |
구분 기호 |
MyNamespace, MyClass, myfunction을 참조 arg1, var1 |
identifier |
MyNamespace |
네임스페이스 |
MyClass |
클래스 |
Myfunction을 참조 |
메서드 |
a r g 1 |
parameter |
var1 |
지역 변수 |
역할의 파서 토큰을 식별할 수 있습니다. 일부 토큰 형식이 둘 이상 있을 수 있습니다. 파서에서 토큰을 확인 한 후 일치에서 구문 강조 표시를 하는 등의 유용한 기능을 중괄호를 제공 하는 정보 및 IntelliSense 작업 언어 서비스를 사용할 수 있습니다.
종류의 파서
언어 서비스 파서 파서 컴파일러의 일부로 사용할 수 없습니다. 그러나 이러한 종류의 파서 스캐너 및 파서를 모두 동일한 방식으로 컴파일러 파서 사용 해야 합니다.
스캐너가 토큰의 형식을 식별 하는 데 사용 됩니다. 구문 강조 표시 하 고 다른 작업을 트리거할 수 있습니다 예를 들어 토큰 형식을 일치 하는 중괄호를 신속 하 게 식별 하는 데이 정보를 사용 합니다. 이 스캐너 표시 됩니다 있는 IScanner 인터페이스입니다.
함수 및 해당 토큰의 범위를 설명 하는 파서가 사용 됩니다. 이 정보는 메서드, 변수, 매개 변수 및 선언 하는 것과 같은 언어 요소를 식별 하 고 멤버 및 컨텍스트를 기반으로 한 메서드 시그니처 목록을 제공 합니다 IntelliSense 작업에 사용 됩니다. 이 파서가이 중괄호 및 괄호 일치 하는 언어 요소 쌍을 찾으려면도 사용 됩니다. 이 파서를 통해 액세스 되는 ParseSource 메서드에서 LanguageService 클래스입니다.
스캐너 및 파서 언어 서비스를 구현 하는 방법을 것입니다. 사용할 수 있는 몇 가지 리소스 파서 작동 방법 및 직접 파서를 작성 하는 방법을 설명 합니다. 또한, 몇 가지 무료 및 상용 제품을 사용할 수 있는 도움말을 파서를 만들 합니다.
ParseSource 파서
(여기서 토큰 일부 실행 코드의 형식으로 변환 됩니다) 컴파일러의 일부로 사용 되는 파서 달리 언어 서비스 파서의 서로 다른 여러 가지 이유로 및 많은 다른 컨텍스트에서 호출할 수 있습니다. 이 방법에서 구현 하는 방법을 ParseSource 메서드에서 LanguageService 클래스인까지. 고려 하는 것이 중요 하는 ParseSource 메서드는 백그라운드 스레드에서 호출 될 수 있습니다.
경고
ParseRequest 구조에 대 한 참조를 포함 합니다.의 IVsTextView 개체입니다.이 IVsTextView 에서 백그라운드 스레드에서 개체를 사용할 수 없습니다.사실, 많은 MPF 클래스가 기본 배경 스레드를 사용할 수 있습니다.여기에 Source, ViewFilter, CodeWindowManager 클래스 및 뷰를 직접 또는 간접적으로 전달 하는 모든 클래스입니다.
이 파서는 일반적으로 호출 또는 구문 값이 있는 이유 시기 전체 소스 파일의 첫 번째 시간을 구문 분석 Check 지정 됩니다. 나머지는 ParseSource 메서드 구문 분석된 코드의 작은 부분을 처리 하 고 이전 전체 구문 분석 작업의 결과 사용 하 여 훨씬 더 빠르게 실행 될 수 있습니다. ParseSource 메서드를 통해 구문 분석 작업의 결과 통신의 AuthoringSink 및 AuthoringScope 개체입니다. AuthoringSink 개체 구문 분석 이유로, 괄호 또는 매개 변수 목록을 메서드 시그니처가 일치 하는 예를 들어 정보를 확장 하는 방법에 대 한 정보를 수집 하는 데 사용 됩니다. AuthoringScope 컬렉션의 선언, 메서드 시그니처 및 지원으로 이동 하려면 고급 편집 옵션을 제공 (정의로 이동, 를 선언으로 이동, 참조로 이동).
IScanner 스캐너
또한 구현 스캐너를 구현 해야 IScanner. 그러나이 스캐너를 통해 여 줄 별로 작동 하기 때문에 Colorizer 클래스 것입니다 일반적으로 쉽게 구현할 수 있습니다. MPF 각 줄의 시작 부분에 제공의 Colorizer 스캐너에 전달 되는 상태 변수를 사용 하는 값을 클래스입니다. 각 줄의 끝에 스캐너 업데이트 된 상태 변수를 반환합니다. MPF 스캐너는 명령줄에서 소스 파일의 처음부터 시작 하지 않고 구문 분석을 시작할 수 있도록 각 줄에 대해이 상태 정보를 캐시 합니다. 이 한 줄의 빠른 검색 편집기를 사용자에 게 빠른 피드백을 제공할 수 있습니다.
중괄호 일치를 구문 분석
이 예제에서는 사용자가 입력 한 닫는 중괄호 일치 하는 제어 흐름을 보여 줍니다. 이 과정에서 색 지정을 사용 하는 스캐너 종류 토큰과 토큰 중괄호 일치 작업을 트리거할 수 있는 여부를 결정 하도 사용 됩니다. 트리거를 찾을 경우는 ParseSource 일치 하는 중괄호 찾기 위해 메서드를 호출 합니다. 마지막으로, 두 개의 중괄호 강조 표시 됩니다.
중괄호 트리거 이름에 사용 되 고 원인 분석에,이 프로세스를 실제 중괄호에 제한 되지 않습니다. 한 쌍의에 일치 하는 지정 된 쌍을 문자 지원 됩니다. 예로, < 및 >, 및 [및].
언어 서비스에서 일치 하는 중괄호를 지원 한다고 가정 합니다.
사용자에 닫는 중괄호 (})를 입력 합니다.
중괄호 커서 위치는 소스 파일에 삽입 되 고 커서 1 씩 증가 합니다.
OnCommand 메서드 호출의 GetTokenInfo 메서드에서 Source 토큰의 현재 커서 위치 바로 앞의 위치에 얻을 수 있는 클래스. 이 토큰으로 형식화 된 닫는 중괄호 해당).
GetTokenInfo 메서드 호출의 GetLineInfo 메서드를의 Colorizer 개체를 현재 줄의 모든 토큰을 얻을 수 있습니다.
GetLineInfo 메서드 호출의 SetSource 방법에의 IScanner 개체를 현재 줄의 텍스트를.
GetLineInfo 메서드를 반복적으로 호출 하는 ScanTokenAndProvideInfoAboutIt 방법에의 IScanner 개체를 현재 줄에서 모든 토큰을 수집 합니다.
GetTokenInfo 메서드를 호출 하는 private 메서드를 Source 클래스를 원하는 위치를 포함 하는 토큰을 얻을 수 및 토큰 목록에서 패스를 얻을 GetLineInfo 메서드.
OnCommand 메서드 토큰 트리거 플래그를 찾습니다 MatchBraces 에서 반환 되는 토큰에 있는 GetTokenInfo 메서드도 있습니다. 즉, 토큰이 나타내는 닫는 중괄호).
트리거를 플래그를 지정 하면 MatchBraces 발견 되는 MatchBraces 메서드에서 Source 클래스를 호출할.
MatchBraces 메서드는 구문 분석 이유로 값으로 구문 분석 작업을 시작 HighlightBraces. 궁극적으로이 작업을 호출 하는 ParseSource 방법에는 LanguageService 클래스. 비동기 구문 분석 사용 하는 경우이 호출 하는 ParseSource 메서드는 백그라운드 스레드에서 발생 합니다.
작업을 구문 분석 되 면, 라는 내부 완료 처리기 (콜백 메서드) HandleMatchBracesResponse 호출 되는 Source 클래스입니다. 이 호출을 자동으로 수행 되는 LanguageService 기본 클래스에는 파서에서.
HandleMatchBracesResponse 메서드 범위에서 목록을 가져오는 데는 AuthoringSink 에 저장 된 개체의 ParseRequest 개체. (되는 범위는 TextSpan 소스 파일의 줄 및 문자 범위를 지정 하는 구조입니다.) 이 목록의 범위를 일반적으로 중괄호와 닫는 중괄호에 대해 각각 하나씩, 두 개의 범위를 포함합니다.
HandleBracesResponse 메서드 호출의 HighlightMatchingBrace 메서드를는 IVsTextView 저장 된 개체의 ParseRequest 개체입니다. 이 지정 된 범위를 강조 표시합니다.
경우는 LanguagePreferences 속성 EnableShowMatchingBrace 사용 되는 HandleBracesResponse 메서드에서 일치 하는 범위에 포함 되 고 처음 80 자 해당 범위의 상태 표시줄에 표시 하는 텍스트를 가져옵니다. 경우 가장 효과적은 ParseSource 메서드는 일치 하는 쌍을와 함께 제공 되는 언어 요소를 포함 합니다. 자세한 내용은 EnableShowMatchingBrace 속성을 참조하십시오.
다음을 수행 합니다.
요약
일치 하는 중괄호 작업 언어 요소의 단순 쌍으로 일반적으로 제한 됩니다. Triples 일치 하는 것과 같은 보다 복잡 한 요소를 ("if(…)","{"및"}", 또는 "else","{"및"}")에서으로 단어 완성 작업의 일부를 강조 표시할 수 있습니다. 예를 들어, 단어 "else" 되 면, 일치 하는 "if" 문을 강조 될 수 있습니다. 한 경우에 일련의 if/else if 문을 모두에 게 동일한 메커니즘을 사용 하 여 중괄호 일치로 강조 수 있습니다. Source 기본 클래스 이미 지원, 다음과 같은: 스캐너가 토큰 트리거 값을 반환 해야 합니다 MatchBraces 트리거 값과 결합 된 MemberSelect 전에 커서 위치를 지정 하는 토큰에 대 한.
자세한 내용은 중괄호 일치 (패키지 관리 프레임 워크)를 참조하십시오.
색 처리에 대 한 구문 분석
소스 코드 색 조정 간단, 단지 해당 유형에 대 한 정보가 토큰 및 반환 형식을 식별 합니다. Colorizer 클래스의 모든 토큰에 대 한 색 정보를 제공 하는 편집기와 스캐너 사이의 매개 역할입니다. Colorizer 클래스는 IScanner 개체가 줄에 색을 입히는 하 고 원본 파일의 모든 줄에 대 한 상태 정보를 수집 합니다. MPF 언어 서비스 클래스에는 Colorizer 스캐너와 통신 하기 때문에 재정의할 클래스 없습니다 통해만 IScanner 인터페이스입니다. 구현 하는 개체를 제공는 IScanner 인터페이스를 재정의 하 여는 GetScanner 메서드는 LanguageService 클래스.
IScanner 스캐너는 지정을 통해 소스 코드 줄은 SetSource 메서드. 호출 하는 ScanTokenAndProvideInfoAboutIt 메서드 반복 되는 줄의 토큰을 가득 찰 때까지 줄에서 다음 토큰을 얻을 수 있습니다. 색 처리에 대 한 MPF 모든 소스 코드 줄의 시퀀스로 처리 됩니다. 따라서, 스캐너 원본 위치에서 선으로 연결한 것으로 대처할 수 있어야 합니다. 또한 언제 든 지 줄 스캐너에 전달 될 수 있습니다 및 규칙만 스캐너 상태 변수 정보 검색 하 여 줄 앞에 줄에서 전달 되는 것입니다.
Colorizer 클래스입니다도 토큰 트리거를 식별 하려면 사용 합니다. 특정 토큰이 단어 완성 등의 보다 복잡 한 작업을 시작할 수 있는 이러한 트리거 MPF 알 또는 중괄호로 묶입니다. 스캐너와 같은 트리거를 식별 하 고 더 빨리 어떤 위치에서 발생 합니다 때문에이 작업에 가장 적합 합니다.
자세한 내용은 구문 색을 입히는 데 (패키지 관리 프레임 워크)를 참조하십시오.
기능 및 범위에 대 한 구문 분석
기능 및 범위에 대 한 구문 분석만 발생 하는 토큰 형식을 식별 하는 보다는 더 많은 노력이 필요 합니다. 파서가 토큰 유형을 뿐만 아니라 토큰을 사용 하는 기능을 식별할 수 있습니다. 예를 들어 식별자의 이름을 있지만 사용자의 언어 식별자 이름을 클래스, 네임 스페이스, 메서드 또는 변수의 상황에 따라 수 있습니다. 토큰의 일반 형식 식별자 이지만 식별자도 다른 의미가 무엇 인지에 따라와 정의 되어 있을 수 있습니다. 이 특성 식별 파서가 구문 분석 되는 언어에 대 한 좀 더 광범위 한 지식을 있어야 합니다. 여기서는 AuthoringSink 클래스 추가 되. AuthoringSink 클래스 식별자, 방법, 일치 하는 언어 쌍 (예: 중괄호 및 괄호) triples 언어에 관한 정보를 수집 합니다. (비슷한 언어 쌍 수는 제외 하 세 부분, 예를 들어, "foreach()" "{"및"}"). 또한 재정의할 수는 AuthoringSink 디버거에서 로드할 수 없습니다 있도록 중단점의 초기 유효성 검사에 사용 하는 코드 식별, 지원 하기 위해 클래스 및 자동 프로그램이 디버깅 되는 및 적절 한 지역 변수 및 매개 변수 외에 디버거를 제공 식별 파서가 필요 하면 지역 변수 및 매개 변수를 자동으로 보여 디버깅 창이.
AuthoringSink 개체의 일부로 파서로 전달 되는 ParseRequest 개체 및 새 AuthoringSink 개체입니다 만들 때마다 새 ParseRequest 개체가 만들어진. 또한는 ParseSource 메서드가 반환 해야는 AuthoringScope IntelliSense 다양 한 작업을 처리 하는 데 사용 하는 개체입니다. AuthoringScope 개체가 유지 선언에 대 한 목록 및 메서드 목록을 중 중, 구문 분석에 대 한 이유에 따라 채워집니다. AuthoringScope 클래스를 구현 해야 합니다.