void Associative_NameReference(out ProtoCore.AST.AssociativeAST.AssociativeNode node) { ProtoCore.AST.AssociativeAST.ArrayNameNode nameNode = null; ProtoCore.AST.AssociativeAST.GroupExpressionNode groupExprNode = null; if (la.kind == 12) { Get(); Associative_Expression(out node); if (node is ProtoCore.AST.AssociativeAST.ArrayNameNode) { nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else { groupExprNode = new ProtoCore.AST.AssociativeAST.GroupExpressionNode(); groupExprNode.Expression = node; nameNode = groupExprNode; } Expect(13); } else if (IsFunctionCall()) { if (isLeft) { errors.SemErr(la.line, la.col, Resources.FunctionCallCannotBeAtLeftSide); } Associative_FunctionCall(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else if (la.kind == 1) { Associative_Ident(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else if (la.kind == 45) { Associative_ArrayExprList(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else SynErr(99); if (la.kind == 10) { ProtoCore.AST.AssociativeAST.ArrayNode array = new ProtoCore.AST.AssociativeAST.ArrayNode(); Get(); if (StartOf(4)) { bool tmpIsLeft = isLeft; isLeft = false; Associative_Expression(out node); isLeft = tmpIsLeft; array.Expr = node; array.Type = nameNode.ArrayDimensions; NodeUtils.SetNodeLocation(array, t); nameNode.ArrayDimensions = array; } Expect(11); while (la.kind == 10) { Get(); if (StartOf(4)) { bool tmpIsLeft = isLeft; isLeft = false; Associative_Expression(out node); isLeft = tmpIsLeft; ProtoCore.AST.AssociativeAST.ArrayNode array2 = new ProtoCore.AST.AssociativeAST.ArrayNode(); array2.Expr = node; array2.Type = null; NodeUtils.SetNodeLocation(array2, t); array.Type = array2; array = array2; } Expect(11); } if (groupExprNode != null) { var expr = groupExprNode.Expression; if (expr is ProtoCore.AST.AssociativeAST.IdentifierListNode) { var rightNode = (expr as ProtoCore.AST.AssociativeAST.IdentifierListNode).RightNode; if (rightNode is ProtoCore.AST.AssociativeAST.ArrayNameNode) { var rightMostArrayNameNode = rightNode as ProtoCore.AST.AssociativeAST.ArrayNameNode; if (rightMostArrayNameNode.ArrayDimensions == null) { rightMostArrayNameNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { rightMostArrayNameNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } } else if (expr is ProtoCore.AST.AssociativeAST.RangeExprNode) { var rangeExprNode = expr as ProtoCore.AST.AssociativeAST.RangeExprNode; if (rangeExprNode.ArrayDimensions == null) { rangeExprNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { rangeExprNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } else if (expr is ProtoCore.AST.AssociativeAST.ExprListNode) { var exprListNode = expr as ProtoCore.AST.AssociativeAST.ExprListNode; if (exprListNode.ArrayDimensions == null) { exprListNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { exprListNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } else if (expr is ProtoCore.AST.AssociativeAST.FunctionDotCallNode) { var dotCall = (expr as ProtoCore.AST.AssociativeAST.FunctionDotCallNode).DotCall; var arrayExpr = (dotCall.FormalArguments[2] as ProtoCore.AST.AssociativeAST.ExprListNode); var dimCount = (dotCall.FormalArguments[3] as ProtoCore.AST.AssociativeAST.IntNode); var dims = dimCount.Value; var newdims = dims; if (arrayExpr != null) { var newarray = groupExprNode.ArrayDimensions; while (newarray != null) { arrayExpr.Exprs.Add(newarray.Expr); newdims++; newarray = (newarray.Type as ProtoCore.AST.AssociativeAST.ArrayNode); } (dotCall.FormalArguments[3] as ProtoCore.AST.AssociativeAST.IntNode).Value = newdims; } groupExprNode.ArrayDimensions = null; } } } if (la.kind == 8 || la.kind == 9) { AssociativeNode levelNode = null; bool isDominant = false; if (la.kind == 8) { Get(); Associative_Number(out levelNode); } else { Get(); Associative_Number(out levelNode); isDominant = true; } IntNode listAtLevel = levelNode as IntNode; if (listAtLevel != null) { var atLevel = new AtLevelNode { Level = listAtLevel.Value, IsDominant = isDominant }; nameNode.AtLevel = atLevel; } } if (IsReplicationGuide()) { var guides = new List<AssociativeNode>(); Expect(17); string repguide = String.Empty; bool isLongest = false; ReplicationGuideNode repGuideNode = null; if (IsPostfixedReplicationGuide()) { Expect(7); isLongest = true; } else if (la.kind == 2) { Get(); isLongest = false; } else SynErr(100); repguide = t.val; if (isLongest) { repguide = repguide.Remove(repguide.Length - 1); } var numNode = new IdentifierNode() { Value = repguide }; repGuideNode = new ReplicationGuideNode(); repGuideNode.RepGuide = numNode; repGuideNode.IsLongest = isLongest; NodeUtils.SetNodeLocation(numNode, t); Expect(18); guides.Add(repGuideNode); while (la.kind == 17) { Get(); if (IsPostfixedReplicationGuide()) { Expect(7); isLongest = true; } else if (la.kind == 2) { Get(); isLongest = false; } else SynErr(101); repguide = t.val; if (isLongest) { repguide = repguide.Remove(repguide.Length - 1); } numNode = AstFactory.BuildIdentifier(repguide); repGuideNode = new ReplicationGuideNode(); repGuideNode.RepGuide = numNode; repGuideNode.IsLongest = isLongest; NodeUtils.SetNodeLocation(numNode, t); Expect(18); guides.Add(repGuideNode); } nameNode.ReplicationGuides = guides; if (groupExprNode != null) { var expr = groupExprNode.Expression; if (expr is IdentifierListNode) { var rightNode = (expr as IdentifierListNode).RightNode; if (rightNode is ArrayNameNode) { var rightMostArrayNameNode = rightNode as ArrayNameNode; if (rightMostArrayNameNode.ReplicationGuides == null) { rightMostArrayNameNode.ReplicationGuides = guides; } else { rightMostArrayNameNode.ReplicationGuides.InsertRange(0, guides); } groupExprNode.ReplicationGuides = null; } } else if (expr is FunctionDotCallNode) { var functionCall = (expr as FunctionDotCallNode).FunctionCall; var function = (functionCall.Function as ArrayNameNode); if (function.ReplicationGuides == null) { function.ReplicationGuides = guides; } else { function.ReplicationGuides.InsertRange(0, guides); } groupExprNode.ReplicationGuides = null; } } } if (groupExprNode != null && groupExprNode.ArrayDimensions == null && (groupExprNode.ReplicationGuides == null || groupExprNode.ReplicationGuides.Count == 0)) { node = groupExprNode.Expression; } else { node = nameNode; } }
public GroupExpressionNode(GroupExpressionNode rhs) : base(rhs) { }
void Associative_NameReference(out ProtoCore.AST.AssociativeAST.AssociativeNode node) { ProtoCore.AST.AssociativeAST.ArrayNameNode nameNode = null; ProtoCore.AST.AssociativeAST.GroupExpressionNode groupExprNode = null; if (la.kind == 9) { Get(); Associative_Expression(out node); if (node is ProtoCore.AST.AssociativeAST.FunctionCallNode || node is ProtoCore.AST.AssociativeAST.IdentifierNode) { nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else { groupExprNode = new ProtoCore.AST.AssociativeAST.GroupExpressionNode(); groupExprNode.Expression = node; nameNode = groupExprNode; } Expect(10); } else if (IsFunctionCall()) { if (isLeft) { errors.SemErr(la.line, la.col, "function call is not allowed at the left hand side of an assignment"); } Associative_FunctionCall(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else if (la.kind == 1) { Associative_Ident(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else if (la.kind == 44) { Associative_ArrayExprList(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else SynErr(102); if (la.kind == 7) { ProtoCore.AST.AssociativeAST.ArrayNode array = new ProtoCore.AST.AssociativeAST.ArrayNode(); Get(); if (StartOf(4)) { bool tmpIsLeft = isLeft; isLeft = false; Associative_Expression(out node); isLeft = tmpIsLeft; array.Expr = node; array.Type = null; NodeUtils.SetNodeLocation(array, t); nameNode.ArrayDimensions = array; } Expect(8); while (la.kind == 7) { Get(); if (StartOf(4)) { bool tmpIsLeft = isLeft; isLeft = false; Associative_Expression(out node); isLeft = tmpIsLeft; ProtoCore.AST.AssociativeAST.ArrayNode array2 = new ProtoCore.AST.AssociativeAST.ArrayNode(); array2.Expr = node; array2.Type = null; NodeUtils.SetNodeLocation(array2, t); array.Type = array2; array = array2; } Expect(8); } if (groupExprNode != null) { var expr = groupExprNode.Expression; if (expr is ProtoCore.AST.AssociativeAST.IdentifierListNode) { var rightNode = (expr as ProtoCore.AST.AssociativeAST.IdentifierListNode).RightNode; if (rightNode is ProtoCore.AST.AssociativeAST.ArrayNameNode) { var rightMostArrayNameNode = rightNode as ProtoCore.AST.AssociativeAST.ArrayNameNode; if (rightMostArrayNameNode.ArrayDimensions == null) { rightMostArrayNameNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { rightMostArrayNameNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } } else if (expr is ProtoCore.AST.AssociativeAST.RangeExprNode) { var rangeExprNode = expr as ProtoCore.AST.AssociativeAST.RangeExprNode; if (rangeExprNode.ArrayDimensions == null) { rangeExprNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { rangeExprNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } else if (expr is ProtoCore.AST.AssociativeAST.ExprListNode) { var exprListNode = expr as ProtoCore.AST.AssociativeAST.ExprListNode; if (exprListNode.ArrayDimensions == null) { exprListNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { exprListNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } else if (expr is ProtoCore.AST.AssociativeAST.FunctionDotCallNode) { var dotCall = (expr as ProtoCore.AST.AssociativeAST.FunctionDotCallNode).DotCall; var arrayExpr = (dotCall.FormalArguments[2] as ProtoCore.AST.AssociativeAST.ExprListNode); var dimCount = (dotCall.FormalArguments[3] as ProtoCore.AST.AssociativeAST.IntNode); int dims = Int32.Parse(dimCount.value); int newdims = dims; if (arrayExpr != null) { var newarray = groupExprNode.ArrayDimensions; while (newarray != null) { arrayExpr.list.Add(newarray.Expr); newdims++; newarray = (newarray.Type as ProtoCore.AST.AssociativeAST.ArrayNode); } (dotCall.FormalArguments[3] as ProtoCore.AST.AssociativeAST.IntNode).value = newdims.ToString(); } groupExprNode.ArrayDimensions = null; } } } if (IsReplicationGuide()) { var guides = new List<ProtoCore.AST.AssociativeAST.AssociativeNode>(); Expect(14); Expect(2); ProtoCore.AST.AssociativeAST.AssociativeNode numNode = new ProtoCore.AST.AssociativeAST.IdentifierNode() { Value = t.val }; NodeUtils.SetNodeLocation(numNode, t); Expect(15); guides.Add(numNode); while (la.kind == 14) { Get(); Expect(2); numNode = new ProtoCore.AST.AssociativeAST.IdentifierNode() { Value = t.val }; NodeUtils.SetNodeLocation(numNode, t); Expect(15); guides.Add(numNode); } nameNode.ReplicationGuides = guides; if (groupExprNode != null) { var expr = groupExprNode.Expression; if (expr is ProtoCore.AST.AssociativeAST.IdentifierListNode) { var rightNode = (expr as ProtoCore.AST.AssociativeAST.IdentifierListNode).RightNode; if (rightNode is ProtoCore.AST.AssociativeAST.ArrayNameNode) { var rightMostArrayNameNode = rightNode as ProtoCore.AST.AssociativeAST.ArrayNameNode; if (rightMostArrayNameNode.ReplicationGuides == null) { rightMostArrayNameNode.ReplicationGuides = guides; } else { rightMostArrayNameNode.ReplicationGuides.InsertRange(0, guides); } groupExprNode.ReplicationGuides = null; } } else if (expr is ProtoCore.AST.AssociativeAST.FunctionDotCallNode) { var functionCall = (expr as ProtoCore.AST.AssociativeAST.FunctionDotCallNode).FunctionCall; var function = (functionCall.Function as ProtoCore.AST.AssociativeAST.ArrayNameNode); if (function.ReplicationGuides == null) { function.ReplicationGuides = guides; } else { function.ReplicationGuides.InsertRange(0, guides); } groupExprNode.ReplicationGuides = null; } } } if (groupExprNode != null && groupExprNode.ArrayDimensions == null && groupExprNode.ReplicationGuides == null) { node = groupExprNode.Expression; } else { node = nameNode; } }
void Associative_NameReference(out ProtoCore.AST.AssociativeAST.AssociativeNode node) { ProtoCore.AST.AssociativeAST.ArrayNameNode nameNode = null; ProtoCore.AST.AssociativeAST.GroupExpressionNode groupExprNode = null; if (la.kind == 10) { Get(); Associative_Expression(out node); if (node is ProtoCore.AST.AssociativeAST.ArrayNameNode) { nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else { groupExprNode = new ProtoCore.AST.AssociativeAST.GroupExpressionNode(); groupExprNode.Expression = node; nameNode = groupExprNode; } Expect(11); } else if (IsFunctionCall()) { if (isLeft) { errors.SemErr(la.line, la.col, "function call is not allowed at the left hand side of an assignment"); } Associative_FunctionCall(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else if (la.kind == 1) { Associative_Ident(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else if (la.kind == 47) { Associative_ArrayExprList(out node); nameNode = node as ProtoCore.AST.AssociativeAST.ArrayNameNode; } else SynErr(105); if (la.kind == 8) { ProtoCore.AST.AssociativeAST.ArrayNode array = new ProtoCore.AST.AssociativeAST.ArrayNode(); Get(); if (StartOf(4)) { bool tmpIsLeft = isLeft; isLeft = false; Associative_Expression(out node); isLeft = tmpIsLeft; array.Expr = node; array.Type = nameNode.ArrayDimensions; NodeUtils.SetNodeLocation(array, t); nameNode.ArrayDimensions = array; } Expect(9); while (la.kind == 8) { Get(); if (StartOf(4)) { bool tmpIsLeft = isLeft; isLeft = false; Associative_Expression(out node); isLeft = tmpIsLeft; ProtoCore.AST.AssociativeAST.ArrayNode array2 = new ProtoCore.AST.AssociativeAST.ArrayNode(); array2.Expr = node; array2.Type = null; NodeUtils.SetNodeLocation(array2, t); array.Type = array2; array = array2; } Expect(9); } if (groupExprNode != null) { var expr = groupExprNode.Expression; if (expr is ProtoCore.AST.AssociativeAST.IdentifierListNode) { var rightNode = (expr as ProtoCore.AST.AssociativeAST.IdentifierListNode).RightNode; if (rightNode is ProtoCore.AST.AssociativeAST.ArrayNameNode) { var rightMostArrayNameNode = rightNode as ProtoCore.AST.AssociativeAST.ArrayNameNode; if (rightMostArrayNameNode.ArrayDimensions == null) { rightMostArrayNameNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { rightMostArrayNameNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } } else if (expr is ProtoCore.AST.AssociativeAST.RangeExprNode) { var rangeExprNode = expr as ProtoCore.AST.AssociativeAST.RangeExprNode; if (rangeExprNode.ArrayDimensions == null) { rangeExprNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { rangeExprNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } else if (expr is ProtoCore.AST.AssociativeAST.ExprListNode) { var exprListNode = expr as ProtoCore.AST.AssociativeAST.ExprListNode; if (exprListNode.ArrayDimensions == null) { exprListNode.ArrayDimensions = groupExprNode.ArrayDimensions; } else { exprListNode.ArrayDimensions.Type = groupExprNode.ArrayDimensions; } groupExprNode.ArrayDimensions = null; } else if (expr is ProtoCore.AST.AssociativeAST.FunctionDotCallNode) { var dotCall = (expr as ProtoCore.AST.AssociativeAST.FunctionDotCallNode).DotCall; var arrayExpr = (dotCall.FormalArguments[2] as ProtoCore.AST.AssociativeAST.ExprListNode); var dimCount = (dotCall.FormalArguments[3] as ProtoCore.AST.AssociativeAST.IntNode); var dims = dimCount.Value; var newdims = dims; if (arrayExpr != null) { var newarray = groupExprNode.ArrayDimensions; while (newarray != null) { arrayExpr.list.Add(newarray.Expr); newdims++; newarray = (newarray.Type as ProtoCore.AST.AssociativeAST.ArrayNode); } (dotCall.FormalArguments[3] as ProtoCore.AST.AssociativeAST.IntNode).Value = newdims; } groupExprNode.ArrayDimensions = null; } } } if (IsReplicationGuide()) { var guides = new List<ProtoCore.AST.AssociativeAST.AssociativeNode>(); Expect(15); string repguide = String.Empty; bool isLongest = false; ProtoCore.AST.AssociativeAST.AssociativeNode numNode = null; ProtoCore.AST.AssociativeAST.ReplicationGuideNode repGuideNode = null; if (IsPostfixedReplicationGuide()) { Expect(7); repguide = t.val; repguide = repguide.Remove(repguide.Length - 1); isLongest = true; numNode = new ProtoCore.AST.AssociativeAST.IdentifierNode() { Value = repguide }; repGuideNode = new ProtoCore.AST.AssociativeAST.ReplicationGuideNode(); repGuideNode.RepGuide = numNode; repGuideNode.IsLongest = isLongest; NodeUtils.SetNodeLocation(numNode, t); } else if (la.kind == 2) { Get(); repguide = t.val; isLongest = false; numNode = new ProtoCore.AST.AssociativeAST.IdentifierNode() { Value = repguide }; repGuideNode = new ProtoCore.AST.AssociativeAST.ReplicationGuideNode(); repGuideNode.RepGuide = numNode; repGuideNode.IsLongest = isLongest; NodeUtils.SetNodeLocation(numNode, t); } else SynErr(106); Expect(16); guides.Add(repGuideNode); while (la.kind == 15) { Get(); if (IsPostfixedReplicationGuide()) { Expect(7); repguide = t.val; repguide = repguide.Remove(repguide.Length - 1); isLongest = true; numNode = new ProtoCore.AST.AssociativeAST.IdentifierNode() { Value = repguide }; repGuideNode = new ProtoCore.AST.AssociativeAST.ReplicationGuideNode(); repGuideNode.RepGuide = numNode; repGuideNode.IsLongest = isLongest; NodeUtils.SetNodeLocation(numNode, t); } else if (la.kind == 2) { Get(); repguide = t.val; isLongest = false; numNode = new ProtoCore.AST.AssociativeAST.IdentifierNode() { Value = repguide }; repGuideNode = new ProtoCore.AST.AssociativeAST.ReplicationGuideNode(); repGuideNode.RepGuide = numNode; repGuideNode.IsLongest = isLongest; NodeUtils.SetNodeLocation(numNode, t); } else SynErr(107); Expect(16); guides.Add(repGuideNode); } nameNode.ReplicationGuides = guides; if (groupExprNode != null) { var expr = groupExprNode.Expression; if (expr is ProtoCore.AST.AssociativeAST.IdentifierListNode) { var rightNode = (expr as ProtoCore.AST.AssociativeAST.IdentifierListNode).RightNode; if (rightNode is ProtoCore.AST.AssociativeAST.ArrayNameNode) { var rightMostArrayNameNode = rightNode as ProtoCore.AST.AssociativeAST.ArrayNameNode; if (rightMostArrayNameNode.ReplicationGuides == null) { rightMostArrayNameNode.ReplicationGuides = guides; } else { rightMostArrayNameNode.ReplicationGuides.InsertRange(0, guides); } groupExprNode.ReplicationGuides = null; } } else if (expr is ProtoCore.AST.AssociativeAST.FunctionDotCallNode) { var functionCall = (expr as ProtoCore.AST.AssociativeAST.FunctionDotCallNode).FunctionCall; var function = (functionCall.Function as ProtoCore.AST.AssociativeAST.ArrayNameNode); if (function.ReplicationGuides == null) { function.ReplicationGuides = guides; } else { function.ReplicationGuides.InsertRange(0, guides); } groupExprNode.ReplicationGuides = null; } } } if (groupExprNode != null && groupExprNode.ArrayDimensions == null && (groupExprNode.ReplicationGuides == null || groupExprNode.ReplicationGuides.Count == 0)) { node = groupExprNode.Expression; } else { node = nameNode; } }