14 using System.Collections.Generic;
21 this.StartSymbol = startSymbol;
23 EndSymbols.AddRange(endSymbols);
24 Priority = Terminal.HighestPriority;
29 private char[] _endSymbolsFirsts;
30 private bool _isLineComment;
35 base.Init(grammarData);
37 _endSymbolsFirsts =
new char[EndSymbols.Count];
38 for (
int i = 0; i < EndSymbols.Count; i++) {
39 string sym = EndSymbols[i];
40 _endSymbolsFirsts[i] = sym[0];
41 _isLineComment |= sym.Contains(
"\n");
45 if (this.EditorInfo == null) {
46 TokenType ttype = _isLineComment ? TokenType.LineComment : TokenType.Comment;
55 context.VsLineScanState.Value = 0;
58 if (!BeginMatch(context, source))
return null;
60 result = CompleteMatch(context, source);
61 if (result != null)
return result;
64 return source.CreateToken(this.OutputTerminal);
66 return CreateIncompleteToken(context, source);
71 source.PreviewPosition = source.Text.Length;
72 Token result = source.CreateToken(this.OutputTerminal);
73 result.Flags |= TokenFlags.IsIncomplete;
74 context.VsLineScanState.TerminalIndex = this.MultilineIndex;
78 private bool BeginMatch(ParsingContext context, ISourceStream source) {
80 if (!source.MatchSymbol(StartSymbol, !Grammar.CaseSensitive))
return false;
81 source.PreviewPosition += StartSymbol.Length;
84 private Token CompleteMatch(ParsingContext context, ISourceStream source) {
86 while (!source.EOF()) {
88 if (EndSymbols.Count == 1)
89 firstCharPos = source.Text.IndexOf(EndSymbols[0], source.PreviewPosition);
91 firstCharPos = source.Text.IndexOfAny(_endSymbolsFirsts, source.PreviewPosition);
92 if (firstCharPos < 0) {
93 source.PreviewPosition = source.Text.Length;
97 source.PreviewPosition = firstCharPos;
98 foreach (
string endSymbol
in EndSymbols) {
99 if (source.MatchSymbol(endSymbol, !Grammar.CaseSensitive)) {
103 source.PreviewPosition += endSymbol.Length;
104 return source.CreateToken(this.OutputTerminal);
107 source.PreviewPosition++;
113 return new string[] { StartSymbol };
TokenCategory
Token category.
Interface for Terminals to access the source stream and produce tokens.
static string ErrUnclosedComment
Looks up a localized string similar to Unclosed comment block.
VsScannerStateMap VsLineScanState
Tokens are produced by scanner and fed to parser, optionally passing through Token filters in between...