// Check to see if linebuf contains a keyword we're interested in (not all keywords) byte WordIsKeyword() { var kw = DTokens.GetTokenID(linebuf.ToString(wordStart, Math.Min(linebuf.Length - wordStart, 15))); if (interestingKeywords[kw]) { return(kw); } return(DTokens.INVALID); }
public void Push(char ch) { if (Lexer.IsIdentifierPart(ch) && (wordToken.Length != 0 || !Lexer.IsDigit(ch))) // Don't allow digits as initial id char { wordToken.Append(ch); } else if (wordToken.Length != 0) { var kw = DTokens.GetTokenID(wordToken.ToString()); currentState.CheckKeyword(kw); previousKeyword = kw; wordToken.Length = 0; isLineStartBeforeWordToken = false; } switch (ch) { case '\n': if (previousNewline == '\r') { offset++; return; } goto case '\r'; case '\r': currentState.Push(currentChar = newLineChar); offset++; previousNewline = ch; // there can be more than one chars that determine the EOL, // the engine uses only one of them defined with newLineChar if (currentChar != newLineChar) { return; } currentIndent.Length = 0; isLineStart = true; isLineStartBeforeWordToken = true; column = 1; line++; lineBeganInsideMultiLineComment = IsInsideMultiLineComment; lineBeganInsideVerbatimString = IsInsideVerbatimString; break; case ' ': currentState.Push(currentChar = ch); offset++; previousNewline = '\0'; if (isLineStart) { currentIndent.Append(ch); } column++; break; case '\t': currentState.Push(currentChar = ch); offset++; previousNewline = '\0'; if (isLineStart) { currentIndent.Append(ch); } var nextTabStop = (column - 1 + indentWidth) / indentWidth; column = 1 + nextTabStop * indentWidth; break; default: currentState.Push(currentChar = ch); offset++; previousNewline = '\0'; previousChar = currentChar; isLineStart = false; column++; break; } }