2 using System.Collections.Generic;
24 bool _checkBraces, _checkOperator;
26 public Stack<int> Indents =
new Stack<int>();
31 bool _isContinuation, _prevIsContinuation;
32 bool _isOperator, _prevIsOperator;
37 _grammarData = grammarData;
38 _grammar = grammarData.Grammar;
39 _grammar.LanguageFlags |= LanguageFlags.EmitLineStartToken;
41 ContinuationTerminal = continuationTerminal;
42 if (ContinuationTerminal != null)
43 if (!_grammar.NonGrammarTerminals.Contains(ContinuationTerminal))
64 return (Options & option) != 0;
69 foreach (
Token token
in tokens) {
71 while (OutputTokens.Count > 0)
72 yield
return OutputTokens.Pop();
77 SetCurrentToken(token);
81 var tokenTerm = token.Terminal;
84 if (tokenTerm == _grammar.Eof) {
89 if (tokenTerm != _grammar.LineStartTerminal)
return;
93 if (PreviousToken == null)
return;
98 if (_prevIsContinuation || _checkBraces && _context.OpenBraces.Count > 0)
100 if (_prevIsOperator && _checkOperator)
105 if (_produceIndents) {
106 var currIndent = token.Location.Column;
107 var prevIndent = Indents.Peek();
108 if (currIndent > prevIndent) {
109 Indents.Push(currIndent);
110 PushOutlineToken(_grammar.Indent, token.
Location);
111 }
else if (currIndent < prevIndent) {
112 PushDedents(currIndent);
114 if (Indents.Peek() != currIndent) {
123 if (_context.Mode !=
ParseMode.CommandLine) {
124 var eosLocation = ComputeEosLocation();
125 PushOutlineToken(_grammar.Eos, eosLocation);
130 private void SetCurrentToken(
Token token) {
131 _doubleEof = CurrentToken != null && CurrentToken.Terminal == _grammar.Eof
132 && token.Terminal == _grammar.Eof;
134 if (CurrentToken != null && CurrentToken.Category ==
TokenCategory.Content) {
135 PreviousToken = CurrentToken;
136 _prevIsContinuation = _isContinuation;
137 _prevIsOperator = _isOperator;
138 if (PreviousToken != null)
139 PreviousTokenLocation = PreviousToken.Location;
141 CurrentToken = token;
142 _isContinuation = (token.Terminal == ContinuationTerminal && ContinuationTerminal != null);
143 _isOperator = token.Terminal.FlagIsSet(TermFlags.IsOperator);
144 if (!_isContinuation)
145 OutputTokens.Push(token);
153 private void ProcessEofToken() {
155 bool pushDedents =
false;
157 switch (_context.Mode) {
159 pushDedents = _produceIndents;
161 case ParseMode.CommandLine:
163 pushDedents = _produceIndents && _doubleEof;
164 pushEos = !_prevIsContinuation && !_doubleEof;
166 case ParseMode.VsLineScan:
171 if (pushDedents) PushDedents(0);
174 var eosLocation = ComputeEosLocation();
175 PushOutlineToken(_grammar.Eos, eosLocation);
179 private void PushDedents(
int untilPosition) {
180 while (Indents.Peek() > untilPosition) {
182 PushOutlineToken(_grammar.Dedent, CurrentToken.Location);
186 private SourceLocation ComputeEosLocation() {
187 if (PreviousToken == null)
188 return new SourceLocation();
190 var loc = PreviousToken.Location;
191 var len = PreviousToken.Length;
192 return new SourceLocation(loc.Position + len, loc.Line, loc.Column + len);
195 private void PushOutlineToken(Terminal term, SourceLocation location) {
196 OutputTokens.Push(
new Token(term, location,
string.Empty, null));
TokenCategory
Token category.
A strongly-typed resource class, for looking up localized strings, etc.
static string ErrOutlineFilterContSymbol
Looks up a localized string similar to CodeOutlineFilter: line continuation symbol '{0}' should be ad...
static string ErrInvDedent
Looks up a localized string similar to Invalid dedent level, no previous matching indent found...
override IEnumerable< Token > BeginFiltering(ParsingContext context, IEnumerable< Token > tokens)
Flags
Enumeration of the new Assimp's flags.
bool OptionIsSet(OutlineOptions option)
readonly SourceLocation Location
Location in the source code.
SourceLocation PreviousTokenLocation
static SourceLocation Empty
CodeOutlineFilter(GrammarData grammarData, OutlineOptions options, KeyTerm continuationTerminal)
Tokens are produced by scanner and fed to parser, optionally passing through Token filters in between...
void ProcessToken(Token token)
readonly KeyTerm ContinuationTerminal
readonly OutlineOptions Options