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