Zuordnung von Klammern (Managed Paketframework)
Übereinstimmende Stützen Sie die Entwickler titel-Sprachelemente, die zusammen auftreten müssen, z oder geschweiften Klammern ab. Wenn ein Entwickler eine schließende geschweifte Klammer eingeben, wird die öffnende geschweifte Klammer hervorgehoben.
Sie können zwei oder drei CO-auftretende Elemente übereinstimmen, aufgerufen und Paare von Tripeln. Tripel sind drei Gruppen von Elementen CO-auftretenden. Zum Beispiel in C#, bildet die foreach Tripel Anweisung ein: „foreach()“, „{“ und „}“. Alle drei Elemente werden hervorgehoben, wenn die schließende Klammer eingegeben wird.
Die AuthoringSink-Klasse unterstützt Paaren und Tripel mit dem MatchPair und den MatchTriple-Methode.
Implementierung
Der Sprachdienst muss alle übereinstimmenden Elemente in der Sprache identifizieren und alle übereinstimmenden Paare danach suchen. Dies wird normalerweise erreicht, indem IScanner , um eine übereinstimmende Sprache und mithilfe der ParseSource-Methode zu erkennen implementiert die Elemente entspricht.
Die OnCommand der Scanner Methode aufgerufen, um die Zeile zu zerlegen und des Tokens unmittelbar vor der Einfügemarke zurückzugeben. Der Scanner gibt an, dass ein Sprachelement paar gefunden wurde, indem er einen Wert " Token MatchBraces für das aktuelle Token. Die OnCommand-Methode ruft die MatchBraces-Methode aufgerufen, die wiederum die BeginParse-Methode mit dem Wert grund Analyse MatchBraces aufgerufen, um die entsprechende Sprachelement zu suchen. Wenn das übereinstimmende Sprachelement gefunden wird, werden beide Elemente hervorgehoben.
Eine vollständige Beschreibung der vorgesehenen das Eingeben einer Klammer die Hervorhebung von Klammern gestartet wird, finden Sie im Abschnitt“ Beispiels-Analyse-Vorgangs im Thema Sprachendienst-Parser und Scanner (Managed Paketframework).
Unterstützung für die Zuordnung von Klammern aktivieren
Das ProvideLanguageServiceAttribute-Attribut kann MatchBraces, MatchBracesAtCaretShowMatchingBrace benannte Parameter festlegen und diese Gruppe die entsprechenden Eigenschaften der LanguagePreferences-Klasse. Sprachen einstellungs Eigenschaften können vom Benutzer auch festgelegt werden.
Registrierungseintrag |
Property |
Beschreibung |
---|---|---|
MatchBraces |
Ermöglicht die Zuordnung von Klammern |
|
MatchBracesAtCaret |
Aktiviert die abgleichende geschweifte Klammer, während die Einfügemarke verschoben wird. |
|
ShowMatchingBrace |
Hebt die übereinstimmende geschweifte Klammer hervor. |
Übereinstimmende Bedingungsanweisungen
Sie können if, else if, z. B. Bedingungsanweisungen und elseoder #if, #elif, #else, #endif, auf die gleiche Weise wie zusammengehörige Trennzeichen übereinstimmen. Sie können die AuthoringSink unterordnen Klasse und eine Möglichkeit bereitstellen, die Textabschnitte und Trennzeichen dem internen Array von übereinstimmenden Elementen hinzugefügt werden kann.
Der Trigger fest
Im folgenden Beispiel wird gezeigt, wie eine übereinstimmende Klammern, geschweiften Klammern und Quadrat geschweiften Klammern und Festlegen des Triggers für diese im Scanner erkennt. Die OnCommand-Methode für die Source-Klasse erkennt den Trigger und ruft den Parser an, um die übereinstimmenden Paare zu suchende (finden Sie im Abschnitt „das Suchen der Übereinstimmung“ in diesem Thema.) Dieses Beispiel ist nur zur Veranschaulichung. Es wird davon ausgegangen, dass der Scanner eine Methode GetNextToken enthält, die Token aus einer Textzeile identifiziert und zurückgibt.
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;
}
Die übereinstimmenden geschweiften Klammern
Hier ist ein vereinfachtes Beispiel für Vergleiche der Sprachelemente ({}) und [] und das Hinzufügen der Spannen in den AuthoringSink-Objekt. Dieser Ansatz ist keine empfohlene Vorgehensweise zum Analysieren des Quellcodes. Er ist nur für Veranschaulichung.
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();
}
}
}
Siehe auch
Konzepte
Sprachendienst-Parser und Scanner (Managed Paketframework)