Freigeben über


Sprachendienst-Parser und Scanner (Managed Paketframework)

Der Parser ist das Kernstück des Sprachdiensts. Die Sprachunterrichte des verwalteten Paketframeworks (MPF) benötigen einen Parser Sprachen, Informationen über den Code auswählen, der angezeigt wird. Ein Parser trennt den Text in lexikalische Token und kennzeichnet diese Token durch Typ- und Funktionen.

Erörterung

Im Folgenden finden Sie eine C#-Methode.

namespace MyNamespace
{
    class MyClass
    {
        public void MyFunction(int arg1)
        {
            int var1 = arg1;
        }
    }
}

In diesem Beispiel werden die Token die Wörter und Satzzeichen. Die Arten von Token sind wie folgt:

Tokenname

Tokentyp

Namespace-, Klassen-, öffentliche void, int

Schlüsselwort

=

Operator implementiert.

{ } ( ) ;

Trennzeichen

MyNamespace, MyClass, var1, arg1, MyFunction

identifier

MyNamespace

-Namespace

MyClass

class

MyFunction

method

arg1

-Parameter von

var1

Lokal

Die Rolle des Parsers ist, die Token zu identifizieren. Einige Token kann mehr als einen Typ verfügen. Nachdem der Parser die Token identifiziert wurde, kann der Sprachdienst die Informationen verwenden, um nützliche Funktionen, z. B. Syntax-Hervorhebung, abgleichende geschweifte Klammer und die IntelliSense-Vorgänge bereitzustellen.

Typen von Parsern

Ein Parser Sprachdienst ist nicht der gleiche wie ein Parser, der als Teil eines Compilers verwendet wird. Allerdings muss diese Art des Parsers einen Scanner und einen Parser, auf die gleiche Weise wie einen Parser Compiler verwenden.

  • Ein Scanner wird verwendet, um Typen von Token zu identifizieren. Diese Informationen werden für Syntax-Hervorhebung verwendet und für die Tokentypen schnell identifizieren, die andere Vorgänge stützen starten können, z. B. den Vergleich ab. Dieser Scanner wird von der IScanner-Schnittstelle dargestellt.

  • Ein Parser wird verwendet, um die Funktionen und den Bereich der Token zu beschreiben. Diese Informationen werden in IntelliSense-Vorgängen, um Sprachelemente wie Methoden, Variablen, Parameter und Deklarationen zu identifizieren, und Mitgliederlisten auf Grundlage von Methodensignaturen und Kontext bereitzustellen. Dieser Parser wird auch verwendet, um übereinstimmende Sprachelement paare, z. B. geschweifte Klammern und Klammern zu suchen. Dieser Parser wird von der ParseSource-Methode in der LanguageService-Klasse zugegriffen wird.

Wie Sie implementieren, ist ein Scanner und ein Sprachdienst den Parser für Sie. Einige Ressourcen sind verfügbar, die beschreiben, wie Sie Parser funktionieren und wie schreibt, Parser besitzen. Außerdem sind einige freie und Handelsprodukte die Hilfe zur Verfügung, wenn sie einen Parser erstellen.

Der ParseSource-Parser

Anders als einen Parser, der als Teil eines Compilers verwendet wird (wobei die Token in Form von ausführbarem Code konvertiert werden), kann ein Sprachdienst Parser für viele verschiedene Gründe und in vielen verschiedenen Kontexten aufgerufen werden. Wie Sie implementieren, ist dieser Ansatz in der ParseSource-Methode in der LanguageService Sie Klasse. Es ist wichtig zu beachten, dass die ParseSource-Methode möglicherweise um einen Hintergrundthread aufgerufen wird.

Warnung

Die ParseRequest Struktur enthält einen Verweis auf das IVsTextView-Objekt.Dieses IVsTextView-Objekt kann nicht im Hintergrundthread verwendet werden.Tatsächlich können viele der Klassen der Basis MPF nicht im Hintergrundthread verwendet werden.Dazu gehören Source, ViewFilter, CodeWindowManager-Klassen und eine andere Klasse, die sich direkt oder indirekt mit der Ansicht verständigt.

Dieser Parser analysiert i. d. R. die gesamte Quelldatei er zum ersten Mal aufgerufen wird oder wenn der Analyse grund Check-Wert angegeben ist. Nachfolgende Aufrufe der ParseSource-Methode verarbeiten einen kleinen Teil des analysierten Code und können viel schneller ausgeführt werden, indem die Ergebnisse der vorhergehenden vollständigen Datenvorgangs Analyse verwenden. Die ParseSource-Methode teilt die Ergebnisse der Analyse Vorgangs durch die AuthoringSink und AuthoringScope-Objekten. Das AuthoringSink-Objekt wird verwendet, um Informationen für einen bestimmten Analysis grund z. B. Informationen über die Spannen der übereinstimmenden geschweiften Klammern oder Methodensignaturen zu erfassen, die Parameterlisten aufweisen. Auflistungen stellen AuthoringScope Deklarationen und Methodensignaturen und unterstützt auch für die Option Bearbeiten die Option Gehe zur erweitertenGehe zu Definition, Gehe zu Deklaration, Gehe zu Verweis().

Der IScanner-Scanner

Sie müssen einen Scanner ebenfalls implementieren, der IScannerimplementiert. Da der Scanner für eine zeilenweise Basis von der Colorizer-Klasse angewendet wird, zu implementieren ist in der Regel einfacher. Zu Beginn jeder Zeile gibt das MPF der Colorizer-Klasse einen Wert, der als Variable Zustand zu verwenden, um Scanner übergeben wird. Am Ende jeder Zeile, gibt der Scanner die aktualisierte Variable Zustand zurück. Das MPF speichert diese Zustandsinformationen für jede Zeile, sodass der Scanner Analyse aus jeder Zeile beginnen kann, ohne sich am Anfang der Quelldatei zu starten. Dies ermöglicht die schnelle Scannen einer einzelnen Zeile im Editor, um schnelle um dem Benutzer Feed-back bereitzustellen.

Analyse für übereinstimmende geschweifte Klammern

In diesem Beispiel wird die Ablaufsteuerung für das Abgleichen einer schließenden geschweiften Klammer angezeigt, die vom Benutzer eingegeben hat. Bei diesem Prozess wird für Farbauftrag der Scanner wird auch verwendet, um den Typ des Tokens zu bestimmen, ob das Token einen Vorgang der Übereinstimmung Klammer starten können. Wenn der Trigger gefunden wird, wird die ParseSource-Methode aufgerufen, um die übereinstimmende geschweifte Klammer zu suchen. Schließlich werden die beiden geschweiften Klammern hervorgehoben.

Obwohl geschweifte Klammern in Namen von Triggern verwendet und Gründe analysieren werden, wird dieser Prozess nicht den tatsächlichen geschweiften Klammern begrenzt. Ein beliebiges Paar von Zeichen, die das angegeben wird, zu sein, ein übereinstimmendes Paar wird unterstützt. Beispiele hierfür sind (und), < und > und [und].

Angenommen, der Sprachdienst übereinstimmende geschweifte Klammern unterstützt.

  1. Die Benutzer eine geschweifte Klammer (}).

  2. Die Klammer wird in der Quelldatei an der Cursorposition eingefügt, und der Cursor wird durch einen gesetzt.

  3. Die OnCommand-Methode in der Source-Klasse wird mit der typisierten schließende geschweifte Klammern genannt.

  4. Die OnCommand-Methode ruft die GetTokenInfo-Methode in der Source-Klasse für das Token an der Position direkt vor der aktuellen Cursorposition zu erhalten. Dieses Token entspricht der typisierten schließende Klammer).

    1. Die GetTokenInfo-Methode ruft die GetLineInfo-Methode für das Objekt zu erhalten, Colorizer alle Token in der aktuellen Zeile.

    2. Die GetLineInfo-Methode ruft die SetSource-Methode für das IScanner-Objekt mit dem Text der aktuellen Zeile.

    3. Die GetLineInfo-Methode ruft wiederholt die ScanTokenAndProvideInfoAboutIt-Methode auf dem IScanner-Objekt auf, um alle Token aus der aktuellen Zeile abzurufen.

    4. Die GetTokenInfo-Methode ruft eine private Methode in der Source-Klasse zum Abrufen des Tokens, das die gewünschte Position enthält, und übergibt die Liste von Token, die von der GetLineInfo-Methode.

  5. Die OnCommand-Methode sucht nach einem Token " flag von MatchBraces auf dem Token, das von der GetTokenInfo-Methode zurückgegeben wurde. d. h. das Token, das die schließende Klammer) darstellt.

  6. Wenn es sich bei dem Trigger flag von MatchBraces gefunden wird, wird die MatchBraces-Methode in der Source-Klasse aufgerufen.

  7. Die MatchBraces-Methode startet einen Analysevorgang grund Analyse mit dem Wert HighlightBraces. Dieser Vorgang ruft schließlich die ParseSource-Methode für die LanguageService-Klasse. Wenn die asynchrone Verarbeitung aktiviert ist, tritt dieser Aufruf der ParseSource-Methode in einem Hintergrundthread auf.

  8. Wenn der Analysevorgang abgeschlossen ist, wird ein interner abschließenden Handler (auch eine Rückrufmethode) mit dem Namen HandleMatchBracesResponse in der Source-Klasse aufgerufen. Dieser Aufruf wird automatisch durch die LanguageService Basisklasse nicht vom Parser gemacht.

  9. Die HandleMatchBracesResponse-Methode ruft eine Liste von Spannen aus dem AuthoringSink-Objekt, das im ParseRequest-Objekt gespeichert wird. (A-Spanne ist eine TextSpan Struktur, die einen Bereich von Zeilen und der Zeichen in der Quelldatei angibt). Diese Liste von Spannen enthält in der Regel zwei Spannen, die je für die öffnende und schließende geschweifte Klammer.

  10. Die HandleBracesResponse-Methode ruft die HighlightMatchingBrace-Methode auf dem IVsTextView-Objekt, das im ParseRequest-Objekt gespeichert wird. Dadurch werden die angegebenen Spanne hervor.

  11. Wenn die LanguagePreferences-Eigenschaft EnableShowMatchingBrace aktiviert ist, ruft die Methode HandleBracesResponse den Text, der durch die entsprechende Spanne umgegeben und zeigt die ersten 80 Zeichen dieser Spanne in der Statusleiste an. Dies funktioniert gut, wenn die ParseSource-Methode das Sprachelement enthält, die die passenden Paare begleitet. Weitere Informationen finden Sie in den Ausführungen zur EnableShowMatchingBrace-Eigenschaft.

  12. Fertig.

Zusammenfassung

Der entsprechende Vorgang geschweiften Klammern wird i. d. R. auf den einfachen Paaren Sprachelemente beschränkt. Komplexere Elemente wie zusammengehörige Tripel („if(…)“, „{“ und „}“ oder „else“, „{“ und „}"), können als Teil eines Vorgangs vollständig Word hervorgehoben werden. Wenn z. B.“ Else „kann der Begriff „abgleichende beendet wird,if“ - Anweisung hervorgehoben werden. Wenn es eine Reihe von Anweisungenelse if / ifgab, könnten alle hervorgehoben werden, indem der gleiche Weise wie übereinstimmende geschweifte Klammern verwendet. Die Source Basisklasse unterstützt bereits dies wie folgt: Der Scanner muss den Wert " Token MatchBraces zurückgeben, das mit dem Wert der Trigger MemberSelect für das Token kombiniert wird, das vor der Cursorposition ist.

Weitere Informationen finden Sie unter Zuordnung von Klammern (Managed Paketframework).

Analyse für Farbauftrag

Quellcode ist einfach, die zum farbigen Anzeigen nur den Typ der Token- und Rückgabe farbinformationen zum jeweiligen Typ. Die Colorizer-Klasse fungiert als Vermittler zwischen dem Editor und dem Scanner auf, um Farbinformationen über jedes Token bereitzustellen. Die Colorizer-Klasse verwendet das IScanner-Objekt, um im Darfarbig stellen eine Zeile zu sichern, und Zustandsinformationen für alle Zeilen in der Quelldatei auch zu erfassen. In den MPF-Sprachendienst Klassen muss die Colorizer-Klasse nicht überschrieben werden, da sie den Scanner nur über die Schnittstelle IScanner verbunden ist. Sie stellen das Objekt, das die IScanner-Schnittstelle implementiert, indem die GetScanner-Methode für die LanguageService-Klasse überschreibt.

Der IScanner Scanner ist eine Quellcodezeile von der SetSource-Methode angegeben. Aufrufe der ScanTokenAndProvideInfoAboutIt-Methode wiederholt werden, um das nächste Token in der Zeile, bis die Zeile von Token erschöpft ist. Für Farbauftrag behandelt das MPF allen Quellcode als Sequenz von Zeilen. Deshalb muss der Scanner in der Lage sein, mit der Quelle vorgenommen werden, die an ihr als Zeilen stammen. Darüber hinaus kann jede Zeile der Scanner jederzeit übergeben werden, und die einzige Garantie dafür ist, dass der Zustand der Scanner Variable aus der Zeile vor der Zeile erhält das überprüft werden soll, oder legt diese fest.

Die Colorizer-Klasse wird auch verwendet, um Token " zu identifizieren. Diese Trigger durch das MPF, dass ein bestimmtes Token einen komplexeren Vorgang initiieren kann, z. B. abschluss Wort oder übereinstimmende geschweifte Klammern an. Da diese Trigger zu identifizieren, schnell sein muss und an einem beliebigen Ort stattfinden muss der Scanner für diese Aufgabe geeignet.

Weitere Informationen finden Sie unter Syntax-tönen (Managed Paketframework).

Analyse für Funktionen und Bereich

Analyse für Funktionen erfordert mehr Aufwand als Bereich und den Typen von Token nur identifizierend, die aufgetreten sind. Der Parser muss nicht nur den Typ des Tokens, sondern auch die Funktionen bestimmen, für die das Token verwendet wird. Beispielsweise ist ein Bezeichner nur ein Name, aber in der Sprache, kann ein Bezeichner der Name einer Klasse, eines Namespaces, der Variablen oder einer Methode je nach Kontext sein. Der allgemeine Typ des Tokens ist ein Bezeichner, aber der Bezeichner verfügt möglicherweise auch andere Bedeutungen, je nachdem, was es ist und zu der er definiert ist. Diese ID erfordert, dass der Parser, umfangreicheres Wissen über die Sprache, die analysiert wird. Dies ist, auf dem die AuthoringSink-Klasse bereitgestellt. Die AuthoringSink-Klasse sammelt Informationen über Bezeichner, Methoden, Sprachpaare übereinstimmende geschweifte Klammern (z) und Klammern und Sprache verdreifacht (ähnlich den Sprachpaaren mit der Ausnahme, dass sie gibt drei Teile, z. B. „foreach()“ „{“ und „}"). Darüber hinaus können Sie die AuthoringSink-Klasse überschreiben, um Code identifikation, die in der frühen Validierung von Haltepunkten verwendet wird, sodass der Debugger nicht geladen werden muss. Auto des Fensters zu unterstützen, die lokale Variablen und Parameter automatisch angezeigt, wenn ein Programm gedebuggt wird und den Parser muss entsprechende lokale Variablen und Parameter zusätzlich zu den Elementen zu identifizieren, die der Debugger darstellt.

Das AuthoringSink-Objekt wird an den Parser als Teil des ParseRequest-Objekts übergeben, und ein neues AuthoringSink-Objekt wird jedes Mal erstellt, das ein neues ParseRequest-Objekt erstellt wird. Außerdem muss die ParseSource-Methode ein AuthoringScope-Objekt zurückgeben, das verwendet wird, um verschiedene IntelliSense-Vorgänge zu behandeln. Das AuthoringScope-Objekt verwaltet eine Liste für Deklarationen und eine Liste für Methoden, von denen jede aufgefüllt wird, abhängig vom Grund für das Analysieren. Die AuthoringScope-Klasse muss implementiert werden.

Siehe auch

Konzepte

Sprachendienst-Übersicht (Managed Paketframework)

Syntax-tönen (Managed Paketframework)

Zuordnung von Klammern (Managed Paketframework)

Weitere Ressourcen

Wenn Sie einen Sprachdienst mithilfe von verwaltetem Paketframeworks implementieren