private static void HandleStartIndex(ParseContext context) { // Validate follows ")", "]", or a property name. if (context.LastToken == null || (context.LastToken.Kind != TokenKind.EndParameter && context.LastToken.Kind != TokenKind.EndIndex && context.LastToken.Kind != TokenKind.PropertyName && context.LastToken.Kind != TokenKind.ExtensionNamedValue && context.LastToken.Kind != TokenKind.UnknownKeyword)) { throw new ParseException(ParseExceptionKind.UnexpectedSymbol, context.Token, context.Expression); } // Wrap the object being indexed into. var indexer = new IndexerNode(); Node obj = null; if (context.Containers.Count > 0) { ContainerNode container = context.Containers.Peek().Node; Int32 objIndex = container.Parameters.Count - 1; obj = container.Parameters[objIndex]; container.ReplaceParameter(objIndex, indexer); } else { obj = context.Root; context.Root = indexer; } indexer.AddParameter(obj); // Update the container stack. context.Containers.Push(new ContainerInfo() { Node = indexer, Token = context.Token }); }
private static void HandleEndIndex(ParseContext context) { IndexerNode indexer = context.Containers.Count > 0 ? context.Containers.Peek().Node as IndexerNode : null; // // Validate: if (indexer == null || // 1) Container is an indexer indexer.Parameters.Count != 2) // 2) Exactly 2 parameters { throw new ParseException(ParseExceptionKind.UnexpectedSymbol, context.Token, context.Expression); } context.Containers.Pop(); }
private static void HandleDereference(ParseContext context) { // Validate follows ")", "]", or a property name. if (context.LastToken == null || (context.LastToken.Kind != TokenKind.EndParameter && context.LastToken.Kind != TokenKind.EndIndex && context.LastToken.Kind != TokenKind.PropertyName && context.LastToken.Kind != TokenKind.ExtensionNamedValue && context.LastToken.Kind != TokenKind.UnknownKeyword)) { throw new ParseException(ParseExceptionKind.UnexpectedSymbol, context.Token, context.Expression); } // Wrap the object being indexed into. var indexer = new IndexerNode(); Node obj = null; if (context.Containers.Count > 0) { ContainerNode container = context.Containers.Peek().Node; Int32 objIndex = container.Parameters.Count - 1; obj = container.Parameters[objIndex]; container.ReplaceParameter(objIndex, indexer); } else { obj = context.Root; context.Root = indexer; } indexer.AddParameter(obj); // Validate a property name follows. if (!TryGetNextToken(context)) { throw new ParseException(ParseExceptionKind.ExpectedPropertyName, context.LastToken, context.Expression); } if (context.Token.Kind != TokenKind.PropertyName) { throw new ParseException(ParseExceptionKind.UnexpectedSymbol, context.Token, context.Expression); } // Add the property name to the indexer, as a string. String propertyName = context.Token.RawValue; indexer.AddParameter(new LiteralValueNode(propertyName)); }