// ParametersTail -> CommaToken IdentifierToken ParametersTail |
 //                   CommaToken NumberToken ParametersTail |
 //                   e
 private bool ProcessParametersTail()
 {
     if (LexicalAnaylzer.Token == Token.CommaToken && LexicalAnaylzer.IsFirstWordCharacter(LexicalAnaylzer.LookNextCharacter()))
     { // TODO: This isn't good - will work for this grammar but shouldn't be checking just next character like so
         LexicalAnaylzer.GetNextToken();
         if (!CheckDeclaredVariable())
         {
             return(false);
         }
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         if (!MatchToken(Token.IdentifierToken))
         {
             return(false);
         }
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     else if (LexicalAnaylzer.Token == Token.CommaToken && LexicalAnaylzer.IsDigitCharacter(LexicalAnaylzer.LookNextCharacter()))
     { // TODO: This isn't good - will work for this grammar but shouldn't be checking just next character like so
         LexicalAnaylzer.GetNextToken();
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         if (!MatchToken(Token.NumberToken))
         {
             return(false);
         }
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     return(true);
 }
 // Parameters -> IdentifierToken ParametersTail |
 //               NumberToken ParametersTail |
 //               e
 private bool ProcessParameters()
 {
     if (LexicalAnaylzer.Token == Token.IdentifierToken)
     {
         if (!CheckDeclaredVariable())
         {
             return(false);
         }
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         LexicalAnaylzer.GetNextToken();
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     else if (LexicalAnaylzer.Token == Token.NumberToken)
     {
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         LexicalAnaylzer.GetNextToken();
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     return(true);
 }
 // Program -> Type IdentifierToken Rest Program |
 //            ConstToken IdentifierToken AssignmentOperatorToken NumberToken SemiColonToken Program |
 //            e
 private bool ProcessProgram()
 {
     if (IsVariableType(LexicalAnaylzer.Token))
     {
         CurrentFunction.ReturnType = LexicalAnaylzer.Token;
         if (!ProcessType())
         {
             return(false);
         }
         CurrentVariable.Lexeme = LexicalAnaylzer.Lexeme;
         CurrentFunction.Lexeme = LexicalAnaylzer.Lexeme;
         if (!MatchToken(Token.IdentifierToken))
         {
             return(false);
         }
         if (!ProcessRest())
         {
             return(false);
         }
         if (!ProcessProgram())
         {
             return(false);
         }
     }
     else if (LexicalAnaylzer.Token == Token.ConstToken)
     {
         LexicalAnaylzer.GetNextToken();
         CurrentConstant.Lexeme = LexicalAnaylzer.Lexeme;
         if (!MatchToken(Token.IdentifierToken))
         {
             return(false);
         }
         if (!MatchToken(Token.AssignmentOperatorToken))
         {
             return(false);
         }
         if (!InsertConstantNode())
         {
             return(false);
         }
         if (!MatchToken(Token.NumberToken))
         {
             return(false);
         }
         if (!MatchToken(Token.SemiColonToken))
         {
             return(false);
         }
         if (!ProcessProgram())
         {
             return(false);
         }
     }
     return(true);
 }
        // Matches expected symbol to current symbol from lexical analyzer
        private bool MatchToken(Token expectedSymbol)
        {
            if (LexicalAnaylzer.Token == expectedSymbol)
            {
                LexicalAnaylzer.GetNextToken();
                return(true);
            }

            DisplayExpectedTokensError(expectedSymbol.ToString());
            return(false);
        }