Esempio n. 1
0
        // 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);
        }
Esempio n. 2
0
        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;
            }
        }