object IAstVisitor.Visit(LiteralValue literalValue) { return Visit(literalValue); }
protected virtual object Visit(LiteralValue literalValue) { object ret; switch (literalValue.ValueType) { case LiteralValueType.Numeric: { sbyte signedByte; byte usignedByte; short signedShort; ushort unsignedShort; int signedInt; uint unsignedInt; long signedLong; ulong unsignedLong; Single single; Double dble; Decimal dec; BigInteger bigInt; if (byte.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out usignedByte)) ret = usignedByte; else if (sbyte.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out signedByte)) ret = signedByte; else if (short.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out signedShort)) ret = signedShort; else if (ushort.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out unsignedShort)) ret = unsignedShort; else if (int.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out signedInt)) ret = signedInt; else if (uint.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out unsignedInt)) ret = unsignedInt; else if (long.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out signedLong)) ret = signedLong; else if (ulong.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out unsignedLong)) ret = unsignedLong; else if (Single.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out single)) ret = single; else if (Double.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out dble)) ret = dble; else if (Decimal.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out dec)) ret = dec; else if (BigInteger.TryParse(literalValue.Value, NumberStyles.Any, this._culture, out bigInt)) ret = bigInt; else ret = literalValue.Value; IEnumerable<Exception> exceptions; if (!this._typeConverter.TryConvertType(this._culture, this._targetType.Peek(), ref ret, out exceptions)) { this.RaiseError(new TypeError(this._targetType.Peek(), ret, literalValue, exceptions)); } } break; case LiteralValueType.String: ret = literalValue.Value; if (this._targetType.Peek() != typeof (string)) { IEnumerable<Exception> exceptions; if (!this._typeConverter.TryConvertType(this._culture, this._targetType.Peek(), ref ret, out exceptions)) { this.RaiseError(new TypeError(this._targetType.Peek(), literalValue.Value, literalValue, exceptions)); } } break; case LiteralValueType.Null: ret = null; break; case LiteralValueType.Boolean: ret = StringComparer.InvariantCultureIgnoreCase.Equals(literalValue.Value, "$true"); if (this._targetType.Peek() != typeof (bool)) { IEnumerable<Exception> exceptions; if (!this._typeConverter.TryConvertType(this._culture, this._targetType.Peek(), ref ret, out exceptions)) { this.RaiseError(new TypeError(this._targetType.Peek(), ret, literalValue, exceptions)); } } break; default: throw new ArgumentOutOfRangeException(); } return ret; }
protected virtual AstNode GetAstNode(IEnumerator<Token> enumerator) { AstNode ret; switch (enumerator.Current.Type) { case TokenType.ParameterName: ret = new ParameterName(enumerator.Current, enumerator.Current.Value); enumerator.MoveNext(); break; case TokenType.SwitchParameter: Token token = enumerator.Current; enumerator.MoveNext(); ret = new SwitchParameter(token, token.Value, this.GetAstNode(enumerator)); break; case TokenType.NumericValue: ret = new LiteralValue( enumerator.Current, LiteralValueType.Numeric, enumerator.Current.Value); enumerator.MoveNext(); break; case TokenType.StringValue: ret = new LiteralValue( enumerator.Current, LiteralValueType.String, enumerator.Current.Value); enumerator.MoveNext(); break; case TokenType.BoolValue: ret = new LiteralValue( enumerator.Current, LiteralValueType.Boolean, enumerator.Current.Value); enumerator.MoveNext(); break; case TokenType.NullValue: ret = new LiteralValue( enumerator.Current, LiteralValueType.Null, enumerator.Current.Value); enumerator.MoveNext(); break; case TokenType.ListStart: ret = this.GetSequence(enumerator); break; case TokenType.DictionaryStart: ret = this.GetAssocArray(enumerator); break; //case TokenType.DictionaryValueSeperator: //case TokenType.DictionaryKeySeperator: case TokenType.DictionaryEnd: //case TokenType.ListValueSeperator: case TokenType.ListEnd: throw new Exception("Invalid token sequence."); default: throw new ArgumentOutOfRangeException(); } if (enumerator.Current.Type == TokenType.ListValueSeperator) { enumerator.MoveNext(); AstNode obj = this.GetAstNode(enumerator); if (obj is Sequence) { var list = new List<AstNode>(((Sequence) obj).Elements); list.Add(ret); ret = new Sequence(ret.SourceInfo, list); } else { ret = new Sequence(ret.SourceInfo, new[] {ret, obj}); } } return ret; }