Пример #1
0
        public ParseMessage Parse()
        {
            if (!TablesLoaded)
            {
                return(ParseMessage.NotLoadedError);
            }

            //===================================
            //Loop until breakable event
            //===================================
            for (;;)
            {
                if (m_InputTokens.Count == 0)
                {
                    Token Read = m_GroupTerminals.ProduceToken();
                    m_InputTokens.Push(Read);

                    return(ParseMessage.TokenRead);
                }
                else
                {
                    Token Read = m_InputTokens.Peek();
                    //Update current position
                    if (Read.Position.HasValue)
                    {
                        m_CurrentPosition = Read.Position.Value;
                    }

                    //Runaway group
                    if (m_GroupTerminals.Count != 0)
                    {
                        return(ParseMessage.GroupError);
                    }
                    else if (Read.SymbolType == SymbolType.Noise)
                    {
                        //Just discard. These were already reported to the user.
                        m_InputTokens.Pop();
                    }
                    else if (Read.SymbolType == SymbolType.Error)
                    {
                        //Finally, we can parse the token.
                        return(ParseMessage.LexicalError);
                    }
                    else
                    {
                        LALRStack.ParseResult Action = m_LALRStack.ParseLALR(Read);
                        //SAME PROCEDURE AS v1

                        switch (Action)
                        {
                        case LALRStack.ParseResult.Accept:
                            return(ParseMessage.Accept);

                        case LALRStack.ParseResult.InternalError:
                            return(ParseMessage.InternalError);

                        case LALRStack.ParseResult.ReduceNormal:
                            return(ParseMessage.Reduction);

                        case LALRStack.ParseResult.Shift:
                            //ParseToken() shifted the token on the front of the Token-Queue.
                            //It now exists on the Token-Stack and must be eliminated from the queue.
                            m_InputTokens.Pop();
                            break;

                        case LALRStack.ParseResult.SyntaxError:
                            //=== Syntax Error! Fill Expected Tokens
                            m_ExpectedSymbols = m_LALRStack.GetExpectedSymbols();
                            return(ParseMessage.SyntaxError);

                        default:
                            //Do nothing.
                            break;
                        }
                    }
                }
            }
        }