예제 #1
0
        public virtual Token GetNextToken()
        {
            Token matchedToken;
            int   curPos = 0;

            for (; ;)
            {
                try
                {
                    m_curChar = m_input_stream.BeginToken();
                }
                catch (IOException /*e*/)
                {
                    jjmatchedKind = 0;
                    matchedToken  = JjFillToken();
                    return(matchedToken);
                }

                switch (curLexState)
                {
                case 0:
                    jjmatchedKind = 0x7fffffff;
                    jjmatchedPos  = 0;
                    curPos        = JjMoveStringLiteralDfa0_0();
                    break;

                case 1:
                    jjmatchedKind = 0x7fffffff;
                    jjmatchedPos  = 0;
                    curPos        = jjMoveStringLiteralDfa0_1();
                    break;
                }
                if (jjmatchedKind != 0x7fffffff)
                {
                    if (jjmatchedPos + 1 < curPos)
                    {
                        m_input_stream.BackUp(curPos - jjmatchedPos - 1);
                    }
                    if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 63 /*077*/))) != 0L)
                    {
                        matchedToken = JjFillToken();
                        if (jjnewLexState[jjmatchedKind] != -1)
                        {
                            curLexState = jjnewLexState[jjmatchedKind];
                        }
                        return(matchedToken);
                    }
                    else
                    {
                        if (jjnewLexState[jjmatchedKind] != -1)
                        {
                            curLexState = jjnewLexState[jjmatchedKind];
                        }
                        goto EOFLoop;
                    }
                }
                int    error_line   = m_input_stream.EndLine;
                int    error_column = m_input_stream.EndColumn;
                string error_after  = null;
                bool   EOFSeen      = false;
                try { m_input_stream.ReadChar(); m_input_stream.BackUp(1); }
                catch (IOException /*e1*/)
                {
                    EOFSeen     = true;
                    error_after = curPos <= 1 ? "" : m_input_stream.Image;
                    if (m_curChar == '\n' || m_curChar == '\r')
                    {
                        error_line++;
                        error_column = 0;
                    }
                    else
                    {
                        error_column++;
                    }
                }
                if (!EOFSeen)
                {
                    m_input_stream.BackUp(1);
                    error_after = curPos <= 1 ? "" : m_input_stream.Image;
                }
                throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, m_curChar, TokenMgrError.LEXICAL_ERROR);
                EOFLoop :;
            }
        }