示例#1
0
        /** Get the next Token. */
        public Token getNextToken()
        {
            Token specialToken = null;
            Token matchedToken;
            int   lastReadPosition = 0;

EOFLoop:
            for (; ;)
            {
                // First see if we have any input at all.
                try
                {
                    curChar = input_stream.BeginToken();
                }
                catch (System.Exception)
                {
                    // No input. So return EOF token.
                    jjmatchedKind             = EOF;
                    jjmatchedPos              = -1;
                    matchedToken              = jjFillToken();
                    matchedToken.specialToken = specialToken;
                    return(matchedToken);
                }

                // Set matched kind to a MAX VALUE to implement largest, first occuring rule
                // i.e., smallest kind value matched should be used.
                image      = jjimage;
                image      = string.Empty;
                jjimageLen = 0;

                for (; ;)
                {
                    jjmatchedKind    = int.MaxValue;
                    jjmatchedPos     = 0;
                    lastReadPosition = jjRunStringLiteralMatch();
                    if (jjmatchedPos == 0 && jjmatchedKind > canMatchAnyChar[curLexState])
                    {
                        jjmatchedKind = canMatchAnyChar[curLexState];
                    }

                    if (jjmatchedKind != int.MaxValue)
                    {
                        // We have a match!

                        // Put back any characters looked ahead.
                        input_stream.backup(lastReadPosition - jjmatchedPos);
                        if (isToken(jjmatchedKind))
                        {
                            // Matched kind is a real TOKEN.
                            matchedToken = jjFillToken();
                            matchedToken.specialToken = specialToken;
                            TokenLexicalActions(matchedToken);
                            if (jjnewLexState[jjmatchedKind] != -1)
                            {
                                curLexState = jjnewLexState[jjmatchedKind];
                            }
                            return(matchedToken);
                        }
                        else if (isSkip(jjmatchedKind))
                        {
                            // Matched kind is a SKIP or SPECIAL_TOKEN.
                            if (isSpecial(jjmatchedKind))
                            {
                                matchedToken = jjFillToken();
                                if (specialToken == null)
                                {
                                    specialToken = matchedToken;
                                }
                                else
                                {
                                    matchedToken.specialToken = specialToken;
                                    specialToken = (specialToken.next = matchedToken);
                                }
                                SkipLexicalActions(matchedToken);
                            }
                            else
                            {
                                SkipLexicalActions(null);
                            }
                            if (jjnewLexState[jjmatchedKind] != -1)
                            {
                                curLexState = jjnewLexState[jjmatchedKind];
                            }
                            goto EOFLoop;
                        }
                        // Here it's a MORE.
                        MoreLexicalActions();
                        if (jjnewLexState[jjmatchedKind] != -1)
                        {
                            curLexState = jjnewLexState[jjmatchedKind];
                        }
                        lastReadPosition = 0;
                        jjmatchedKind    = int.MaxValue;
                        try
                        {
                            curChar = input_stream.readChar();
                            continue;
                        }
                        catch (System.IO.IOException) { }
                    }
                    reportError(lastReadPosition);
                }
            }
        }