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 | |
---|---|---|
ScanTokenAndProvideInfoAboutIt | Analizza il token seguente del linguaggio dall'attuale riga e restituisce le informazioni. | |
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;
}
}
}