Condividi tramite


Interfaccia IScanner

Utilizzato come interfaccia per un parser in un servizio di linguaggio.

Spazio dei nomi:  Microsoft.VisualStudio.Package
Assembly:   Microsoft.VisualStudio.Package.LanguageService.10.0 (in Microsoft.VisualStudio.Package.LanguageService.10.0.dll)
  Microsoft.VisualStudio.Package.LanguageService.11.0 (in Microsoft.VisualStudio.Package.LanguageService.11.0.dll)
  Microsoft.VisualStudio.Package.LanguageService.9.0 (in Microsoft.VisualStudio.Package.LanguageService.9.0.dll)
  Microsoft.VisualStudio.Package.LanguageService (in Microsoft.VisualStudio.Package.LanguageService.dll)

Sintassi

'Dichiarazione
Public Interface IScanner
public interface IScanner

Il tipo IScanner espone i seguenti membri.

Metodi

  Nome Descrizione
Metodo pubblico ScanTokenAndProvideInfoAboutIt Analizza il token seguente del linguaggio dall'attuale riga e restituisce le informazioni.
Metodo pubblico SetSource Imposta la riga da analizzare.

In alto

Note

Un servizio di linguaggio deve analizzare il codice per supportare qualsiasi delle funzionalità offerte da Visual Studio per gli sviluppatori.Ad esempio, evidenziazione della sintassi richiede la conoscenza degli elementi del linguaggio di fornire il colore di destra, mentre il completamento di codice richiede la conoscenza dell'ambito corrente.L'identificazione del tipo di token è il ruolo di analisi, mentre identificare la funzionalità e l'ambito di un token è il ruolo di un parser.

Note per gli implementatori

Per analizzare il codice, è necessario implementare IScanner collegare su una classe e chiamare il costruttore della classe nell'implementazione di GetScanner.

Note per i chiamanti

Lo scanner viene utilizzato da Colorizer una classe per gestire evidenziazione della sintassi e in genere stato fornito al costruttore di colorizer.Il parser può essere utilizzato per altre funzionalità del linguaggio, come identificazione dei trigger token che iniziano l'analisi più complessa con ParseSource metodo.

Esempi

Di seguito è riportato un esempio di un'implementazione semplice dell'interfaccia.

[C#]
namespace MyLanguagePackage
{
    class CScanner : IScanner
    {
        /////////////////////////////////////////////////////
        // Fields

        private string m_line;
        private int    m_offset;
        private int    m_offset;
        private string m_source;


        /////////////////////////////////////////////////////
        // Enumerations

        private enum ParseState
        {
            InText = 0,
            InQuotes = 1,
            InComment = 2
        }

        /////////////////////////////////////////////////////
        // Private methods

        private bool GetNextToken(int startIndex,
                                 TokenInfo tokenInfo,
                                 ref int state)
        {
            bool bFoundToken = false;
            int endIndex = -1;
            int index = startIndex;
            if (index < m_source.Length)
            {
                if (state == (int) ParseState.InQuotes)
                {
                    // Find end quote. If found, set state to InText
                    // and return the quoted string as a single token.
                    // Otherwise, return the string to the end of the line
                    // and keep the same state.
                }
                else if (state == (int) ParseState.InComment)
                {
                    // Find end of comment. If found, set state to InText
                    // and return the comment as a single token.
                    // Otherwise, return the comment to the end of the line
                    // and keep the same state.
                }
                else
                {
                    // Parse the token starting at index, returning the
                    // token's start and end index in tokenInfo, along with
                    // the token's type and color to use.
                    // If the token is a quoted string and the string continues
                    // on the next line, set state to InQuotes.
                    // If the token is a comment and the comment continues
                    // on the next line, set state to InComment.
                    bFoundToken = true;
                }
            }
            return bFoundToken;
        }

        /////////////////////////////////////////////////////
        // IScanner methods

        public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
                                                   ref int state)
        {
            bool bFound = false;
            if (tokenInfo != null)
            {
                bFound = GetNextToken(m_offset, tokenInfo, ref state);
                if (bFound)
                {
                    m_offset = tokenInfo.EndIndex + 1;
                }
            }
            return bFound;
        }

        public void SetSource(string source, int offset)
        {
            m_offset = offset;
            m_source = source;
        }
    }
}

Vedere anche

Riferimenti

Spazio dei nomi Microsoft.VisualStudio.Package