private bool Advance(TokenType type, out ParseException failure) { Validate.NonNull(type, nameof(type)); if (this.CurrentToken.Type != type) { failure = ParseException.UnexpectedCharactersError(this.CurrentToken.ToString()); return(false); } else { this.pos++; failure = null; return(true); } }
private bool Atom(out object success, out ParseException failure) { if (this.CurrentToken.Type == TokenType.Number) { NumberToken tok = this.CurrentToken as NumberToken; if (!this.Advance(TokenType.Number, out failure)) { success = null; return(false); } else { success = new DoubleMeasurement(tok.Value); failure = null; return(true); } } else if (this.CurrentToken.Type == TokenType.Id) { IdToken tok = this.CurrentToken as IdToken; if (!this.Advance(TokenType.Id, out failure)) { success = null; return(false); } else { if (this.Units.ContainsKey(tok.StringValue)) { success = this.Units[tok.StringValue]; return(true); } else { success = null; failure = ParseException.UndefinedUnitDiscovered(tok.StringValue); return(false); } } } else if (this.CurrentToken.Type == TokenType.OpenParen) { if (!this.Advance(TokenType.OpenParen, out failure)) { success = null; return(false); } else if (!this.AddExpression(out success, out failure)) { return(false); } else if (!this.Advance(TokenType.CloseParen, out failure)) { return(false); } else { return(true); } } else if (this.CurrentToken.Type == TokenType.OpenBracket) { if (!this.Advance(TokenType.OpenBracket, out failure)) { success = null; return(false); } else if (!this.AddExpression(out success, out failure)) { return(false); } else if (!this.Advance(TokenType.CloseBracket, out failure)) { return(false); } else { return(true); } } else if (this.CurrentToken.Type == TokenType.Plus || this.CurrentToken.Type == TokenType.Minus) { if (!this.Advance(this.CurrentToken.Type, out failure)) { success = null; return(false); } else if (!this.AddExpression(out success, out failure)) { return(false); } else { return(Evaluation.ApplyUrnaryOperator( this.AllOperators, this.CurrentToken.Type == TokenType.Plus ? UrnaryOperatorType.Positation : UrnaryOperatorType.Negation, success, out success, out failure )); } } else { success = null; failure = ParseException.UnexpectedCharactersError(this.CurrentToken.StringValue); return(false); } }