public override string GenerateScript(LanguageOption options, int indentationlevel = 0) { if (UoToken != null) { return(UoToken.Value); } if (Object is UoFieldExpressionNode && ((UoFieldExpressionNode)Object).isConst && !options.HasOption(LanguageOption.Constants)) { int index; UoFieldExpressionNode node = (UoFieldExpressionNode)Object; if (node.UoTypeToken != Types.List) { throw new InvalidOperationException(string.Format("Cannot index, This constant expression ({0}) is not a list", node.Name)); } else if (Index.UoToken == null || !Index.UoToken.IsLiteral) { throw new InvalidOperationException("Constant list indexers must be compile time constants."); } else if (!Index.UoToken.Value.TryParseHex(out index)) { throw new InvalidOperationException("Constant list indexers must be compile time constant integers."); } else if (index >= Object.ChildNodes.Count) { return("0"); } else { return(((UoFieldExpressionNode)Object.ChildNodes[index]).GenerateScript(options)); } } return(string.Format("{0}{1}{2}{3}", Object.GenerateScript(options), Punct.LBrack.Value, Index.GenerateScript(options), Punct.RBrack.Value)); }
public override void Init(ParsingContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); SetUoTypeToken(Types.Int); Field = (UoFieldExpressionNode)treeNode.FirstChild.AstNode; Operator = ((Tokenizer)treeNode.LastChild.LastChild.Term).Tokenize(); AsString = Operator.Value; }
public override void Init(ParsingContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); if (treeNode.ChildNodes[0].AstNode is UoFieldExpressionNode) { Field = (UoFieldExpressionNode)treeNode.ChildNodes[0].AstNode; Assign = (AssignNode)treeNode.ChildNodes[1].AstNode; } else if (treeNode.ChildNodes[0].AstNode is UnaryAssign) { Field = ((UnaryAssign)treeNode.ChildNodes[0].AstNode).Field; Assign = (UnaryAssign)treeNode.ChildNodes[0].AstNode; } ChildNodes.Add(Field); ChildNodes.Add(Assign); Field.Parent = Assign.Parent = this; }
public override void CheckScope(ParsingContext context) { if (Object is UoFieldExpressionNode && ((UoFieldExpressionNode)Object).isConst) { int index; UoFieldExpressionNode node = (UoFieldExpressionNode)Object; if (node.UoTypeToken != Types.List) { context.AddParserMessage(ParserErrorLevel.Error, node.Span, "Cannot index, This constant expression ({0}) is not a list", node.Name); } else if (Index.UoToken == null || !Index.UoToken.IsLiteral) { context.AddParserMessage(ParserErrorLevel.Error, node.Span, "Constant list indexers must be compile time constants."); } else if (!Index.UoToken.Value.TryParseHex(out index)) { context.AddParserMessage(ParserErrorLevel.Error, node.Span, "Constant list indexers must be compile time constant integers."); } else { IEnumerable <ConstantDeclarationNode.ConstantListElement> values = (IEnumerable <ConstantDeclarationNode.ConstantListElement>)((UoFieldExpressionNode)Object).Field.Value; if (index < values.Count()) { ConstantDeclarationNode.ConstantListElement value = values.ElementAt(index); SetUoToken(value.UoToken); SetUoTypeToken(value.UoTypeToken); } } } else if (Object.UoTypeToken == Types.String) { SetUoTypeToken(Types.Char); } else { SetUoTypeToken(null); // any } }