void assignstmt(out Node node) { node = null; Node lhsNode = null; if (isArrayAccess()) { arrayident(out lhsNode); } else if (la.kind == 1) { Get(); int ltype = (0 == String.Compare(t.val, "return")) ? (int)ProtoCore.PrimitiveType.kTypeReturn : (int)ProtoCore.PrimitiveType.kTypeVar; lhsNode = new ProtoImperative.AST.IdentifierNode() { Value = t.val, type = ltype, datatype = (ProtoCore.PrimitiveType)ltype }; } else { SynErr(52); } Expect(31); Node rhsNode; if (StartOf(3)) { expr(out rhsNode); BinaryExpressionNode bNode = new BinaryExpressionNode(); bNode.LeftNode = lhsNode; bNode.RightNode = rhsNode; bNode.Optr = Operator.assign; node = bNode; Expect(16); } else if (la.kind == 6) { languageblock(out rhsNode); BinaryExpressionNode bNode = new BinaryExpressionNode(); bNode.LeftNode = lhsNode; bNode.RightNode = rhsNode; bNode.Optr = Operator.assign; node = bNode; } else { SynErr(53); } }
void Ident(out Node node) { Expect(1); int ltype = (0 == String.Compare(t.val, "return")) ? (int)ProtoCore.PrimitiveType.kTypeReturn : (int)ProtoCore.PrimitiveType.kTypeVar; IdentifierNode var = new IdentifierNode() { // TODO Jun: Move the primitive types into a class table Value = t.val, Name = t.val, type = ltype, datatype = (ProtoCore.PrimitiveType)ltype }; node = var; }
void functioncall(out Node node) { Expect(1); IdentifierNode function = new IdentifierNode() { Value = t.val, Name = t.val }; NodeList arglist = new NodeList(); Expect(8); if (StartOf(3)) { Node argNode; expr(out argNode); arglist.Add(argNode); while (la.kind == 30) { Get(); expr(out argNode); arglist.Add(argNode); } } Expect(9); FunctionCallNode funcNode = new FunctionCallNode(); funcNode.Function = function; funcNode.FormalArguments = arglist; node = funcNode; }
void assignstmt(out Node node) { node = null; Node lhsNode = null; if (isArrayAccess()) { arrayident(out lhsNode); } else if (la.kind == 1) { Get(); int ltype = (0 == String.Compare(t.val, "return")) ? (int)ProtoCore.PrimitiveType.kTypeReturn : (int)ProtoCore.PrimitiveType.kTypeVar; lhsNode = new ProtoImperative.AST.IdentifierNode() { Value = t.val, type = ltype, datatype = (ProtoCore.PrimitiveType)ltype }; } else SynErr(52); Expect(31); Node rhsNode; if (StartOf(3)) { expr(out rhsNode); BinaryExpressionNode bNode = new BinaryExpressionNode(); bNode.LeftNode = lhsNode; bNode.RightNode = rhsNode; bNode.Optr = Operator.assign; node = bNode; Expect(16); } else if (la.kind == 6) { languageblock(out rhsNode); BinaryExpressionNode bNode = new BinaryExpressionNode(); bNode.LeftNode = lhsNode; bNode.RightNode = rhsNode; bNode.Optr = Operator.assign; node = bNode; } else SynErr(53); }
void ArgDecl(out Node node) { IdentifierNode tNode = null; VarDeclNode varDeclNode = new ProtoImperative.AST.VarDeclNode(); varDeclNode.memregion = ProtoCore.DSASM.MemoryRegion.kMemStack; if (la.kind == 25) { Get(); varDeclNode.memregion = ProtoCore.DSASM.MemoryRegion.kMemHeap; } if (isArrayAccess()) { arrayident(out node); tNode = node as IdentifierNode; varDeclNode.NameNode = tNode; } else if (la.kind == 1) { Get(); tNode = new IdentifierNode() { Value = t.val, Name = t.val, type = (int)ProtoCore.PrimitiveType.kTypeVar, datatype = ProtoCore.PrimitiveType.kTypeVar }; varDeclNode.NameNode = tNode; } else SynErr(68); ProtoCore.Type argtype = new ProtoCore.Type(); argtype.Name = "var"; argtype.rank = 0; argtype.UID = 0; if (la.kind == 36) { Get(); Expect(1); argtype.Name = t.val; if (la.kind == 6) { argtype.IsIndexable = true; Get(); Expect(7); argtype.rank = 1; if (la.kind == 6 || la.kind == 17 || la.kind == 31) { if (la.kind == 17) { Get(); Expect(6); Expect(7); argtype.rank = ProtoCore.DSASM.Constants.nDimensionArrayRank; } else { while (la.kind == 6) { Get(); Expect(7); argtype.rank++; } } } } } varDeclNode.ArgumentType = argtype; if (la.kind == 31) { Get(); Node rhsNode; expr(out rhsNode); BinaryExpressionNode bNode = new BinaryExpressionNode(); bNode.LeftNode = tNode; bNode.RightNode = rhsNode; bNode.Optr = Operator.assign; varDeclNode.NameNode = bNode; } node = varDeclNode; if(!isGlobalScope) { localVarCount++; } }