object IAstVisitor.Visit(ParameterName parameterName) { return Visit(parameterName); }
protected virtual object Visit(ParameterName switchParameter) { throw new NotSupportedException(); }
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; }