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; } } } } }