Esempio n. 1
0
 public void AddElementNode(Node n, string name)
 {
     ElementNodes.Add(n);
     if ("" != name)
     {
         AtNames.Add(name, n);
         BinaryExpressionNode o = n as BinaryExpressionNode;
         IdentifierNode t = o.LeftNode as IdentifierNode;
         BinaryExpressionNode e = new BinaryExpressionNode();
         e.LeftNode = new IdentifierNode() { Value = name, Name = name, type = t.type, datatype = t.datatype };
         e.RightNode = t;
         e.Optr = ProtoCore.DSASM.Operator.assign;
         ElementNodes.Add(e);
     }
 }
Esempio n. 2
0
        // a = 25
        // b = 4 + 20 / 5
        // c = a - 20 * 5
        public DependencyPass.DependencyTracker GetDemoTrackerJun()
        {
            DependencyPass.DependencyTracker tracker = new DependencyPass.DependencyTracker();

            
            string varIdent = null;

            //========================================================
            // a = 25
            BinaryExpressionNode i1 = new BinaryExpressionNode();

            varIdent = "a";
            IdentifierNode fAssignLeft = new IdentifierNode() { Value = varIdent, type = /*SDD*/(int)ProtoCore.PrimitiveType.kTypeVar };
                // SDD - automatic allocation
                //tracker.Allocate(varIdent, (int)FusionCore.DSASM.Constants.kGlobalScope, (int)FusionCore.DSASM.Constants.kPrimitiveSize);

            i1.LeftNode = fAssignLeft;
            i1.Optr = ProtoCore.DSASM.Operator.assign;
            IdentifierNode fAssignRight = new IdentifierNode() { Value = "25", type = (int)ProtoCore.PrimitiveType.kTypeInt };
            i1.RightNode = fAssignRight;

            //========================================================


            // b = 4 + 20 / 5

            // 20 / 5
            BinaryExpressionNode sDiv = new BinaryExpressionNode();
            IdentifierNode sDivLeft = new IdentifierNode() { Value = "20", /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeInt };
            sDiv.LeftNode = sDivLeft;
            sDiv.Optr = ProtoCore.DSASM.Operator.div;
            IdentifierNode sDivRight = new IdentifierNode() { Value = "5", /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeInt };
            sDiv.RightNode = sDivRight;


            // 4 + ( 20 / 5 )
            BinaryExpressionNode sAdd = new BinaryExpressionNode();
            IdentifierNode sAddLeft = new IdentifierNode() { Value = "4", /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeInt };
            sAdd.LeftNode = sAddLeft;
            sAdd.Optr = ProtoCore.DSASM.Operator.add;
            BinaryExpressionNode sAddRight = new BinaryExpressionNode();
            sAddRight = sDiv;
            sAdd.RightNode = sAddRight;


            // b = 4 + 20 / 5
            BinaryExpressionNode i2 = new BinaryExpressionNode();

            varIdent = "b";
            IdentifierNode sAssignLeft = new IdentifierNode() { Value = varIdent, /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeVar };
                // SDD - automatic allocation
                //tracker.Allocate(varIdent, (int)FusionCore.DSASM.Constants.kGlobalScope, (int)FusionCore.DSASM.Constants.kPrimitiveSize);

            i2.LeftNode = sAssignLeft;
            i2.Optr = ProtoCore.DSASM.Operator.assign;
            BinaryExpressionNode sAssignRight = new BinaryExpressionNode();
            sAssignRight = sAdd;
            i2.RightNode = sAssignRight;



            // c = a - 20 * 5

            // 20 * 5
            BinaryExpressionNode sMul = new BinaryExpressionNode();
            IdentifierNode sMulLeft = new IdentifierNode() { Value = "20", /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeInt };
            sMul.LeftNode = sMulLeft;
            sMul.Optr = ProtoCore.DSASM.Operator.mul;
            IdentifierNode sMulRight = new IdentifierNode() { Value = "5", /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeInt };
            sMul.RightNode = sMulRight;


            // a - ( 20 * 5 )
            BinaryExpressionNode sSub = new BinaryExpressionNode();
            IdentifierNode sSubLeft = new IdentifierNode() { Value = "a", /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeVar };
            sSub.LeftNode = sSubLeft;
            sSub.Optr = ProtoCore.DSASM.Operator.sub;
            BinaryExpressionNode sSubRight = new BinaryExpressionNode();
            sSubRight = sMul;
            sSub.RightNode = sSubRight;


            // c = a - 20 * 5
            BinaryExpressionNode i3 = new BinaryExpressionNode();

            varIdent = "c";
            IdentifierNode si3Left = new IdentifierNode() { Value = varIdent, /*SDD*/type = (int)ProtoCore.PrimitiveType.kTypeVar };
                // SDD - automatic allocation
                //tracker.Allocate(varIdent, (int)FusionCore.DSASM.Constants.kGlobalScope, (int)FusionCore.DSASM.Constants.kPrimitiveSize);

            i3.LeftNode = si3Left;
            i3.Optr = ProtoCore.DSASM.Operator.assign;
            BinaryExpressionNode si3Right = new BinaryExpressionNode();
            si3Right = sSub;
            i3.RightNode = si3Right;


            tracker.AllNodes.Add(i1);
            tracker.AllNodes.Add(i2);
            tracker.AllNodes.Add(i3);

            return tracker;
        }
Esempio n. 3
0
        /*
        public DependencyPass.DependencyTracker generateAST(ProtoCore.CodeBlock codeblock)
        {
            DependencyTracker tempTracker = new DependencyTracker();

            foreach (Object obj in codeblock.Body)
            {
                Debug.Assert(obj is ProtoAssociative.DependencyPass.Node);
                Node node = obj as ProtoAssociative.DependencyPass.Node;
                tempTracker.AllNodes.Add(node);
            }
            return tempTracker;
        }
         * */

		public DependencyPass.DependencyTracker GetDemoTracker()
		{
            IdentifierNode a = new IdentifierNode();
			a.Value = "1..1000..+1";
			
			FunctionCallNode b = new FunctionCallNode();
            b.Function = new IdentifierNode() { Value = "SQRT" };
			b.FormalArguments.Add(a);
			
			BinaryExpressionNode c = new BinaryExpressionNode();
			c.LeftNode = a;
            c.Optr = ProtoCore.DSASM.Operator.mul;
            IdentifierNode _2Node = new IdentifierNode() { Value = "2" };
			c.RightNode = _2Node;
			
			BinaryExpressionNode d = new BinaryExpressionNode();
			d.LeftNode = c;
			d.RightNode = c;
			d.Optr = ProtoCore.DSASM.Operator.mul;
			
			FunctionCallNode e = new FunctionCallNode();
            e.Function = new IdentifierNode() { Value = "LineFromPoint" };
			e.FormalArguments.Add(a);
			e.FormalArguments.Add(b);
			e.FormalArguments.Add(d);

            Node f = new FunctionCallNode() { Function = new IdentifierNode() { Value = "Trim" } };
            Node g = new FunctionCallNode() { Function = new IdentifierNode() { Value = "Rotate" } };

			DependencyPass.DependencyTracker tracker = new DependencyPass.DependencyTracker();
			tracker.AllNodes.Add(a);
			tracker.AllNodes.Add(b);
			tracker.AllNodes.Add(c);
			tracker.AllNodes.Add(_2Node);
			tracker.AllNodes.Add(d);
			tracker.AllNodes.Add(e);
			tracker.AllNodes.Add(f);
			tracker.AllNodes.Add(g);
			
			tracker.DirectContingents.Add(a, new List<Node>() { });
			tracker.DirectContingents.Add(_2Node, new List<Node>() { });
			
			tracker.DirectContingents.Add(b, new List<Node>() { a });
			tracker.DirectContingents.Add(c, new List<Node>() { a, _2Node });
			tracker.DirectContingents.Add(d, new List<Node>() { c });
			tracker.DirectContingents.Add(e, new List<Node>() { a, b, d });
			tracker.DirectContingents.Add(f, new List<Node>() { e });
			tracker.DirectContingents.Add(g, new List<Node>() { f });
	
			tracker.DirectDependents.Add(a, new List<Node>() {b, c, e});
			tracker.DirectDependents.Add(b, new List<Node>() {e});
			tracker.DirectDependents.Add(c, new List<Node>() {d});
			tracker.DirectDependents.Add(d, new List<Node>() {e});
			tracker.DirectDependents.Add(e, new List<Node>() {f});
			tracker.DirectDependents.Add(f, new List<Node>() {g});
			tracker.DirectDependents.Add(g, new List<Node>() {});
			
			tracker.DirectDependents.Add(_2Node, new List<Node>() {c});
			
			return tracker;
		}
Esempio n. 4
0
	void LogicalExpression(out Node node) {
		ComparisonExpression(out node);
		while (la.kind == 55 || la.kind == 56) {
			Operator op;
			LogicalOp(out op);
			Node expr2; 
			Expression(out expr2);
			BinaryExpressionNode binaryNode = new BinaryExpressionNode();
			binaryNode.LeftNode = node;
			binaryNode.RightNode = expr2;
			binaryNode.Optr = op;
			node = binaryNode;
			
		}
	}
Esempio n. 5
0
	void ComparisonExpression(out Node node) {
		RangeExpr(out node);
		while (StartOf(9)) {
			Operator op; 
			ComparisonOp(out op);
			Node expr2; 
			RangeExpr(out expr2);
			BinaryExpressionNode binaryNode = new BinaryExpressionNode();
			binaryNode.LeftNode = node;
			binaryNode.RightNode = expr2;
			binaryNode.Optr = op;
			node = binaryNode;
			
		}
	}
Esempio n. 6
0
	void ArgDecl(out Node node, ProtoCore.DSASM.AccessModifier access = ProtoCore.DSASM.AccessModifier.kPublic) {
		IdentifierNode tNode = null; 
		VarDeclNode varDeclNode = new VarDeclNode(); 
		varDeclNode.memregion = ProtoCore.DSASM.MemoryRegion.kMemStack;
		varDeclNode.access = access;
		
		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(71);
		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 == 11) {
				argtype.IsIndexable = true; 
				Get();
				Expect(12);
				argtype.rank = 1; 
				if (la.kind == 11 || la.kind == 21 || la.kind == 35) {
					if (la.kind == 21) {
						Get();
						Expect(11);
						Expect(12);
						argtype.rank = ProtoCore.DSASM.Constants.nDimensionArrayRank; 
					} else {
						while (la.kind == 11) {
							Get();
							Expect(12);
							argtype.rank++; 
						}
					}
				}
			}
		}
		varDeclNode.ArgumentType = argtype; 
		if (la.kind == 35) {
			Get();
			Node rhsNode; 
			Expression(out rhsNode);
			BinaryExpressionNode bNode = new BinaryExpressionNode();
			bNode.LeftNode = tNode;
			bNode.RightNode = rhsNode;
			bNode.Optr = Operator.assign;
			varDeclNode.NameNode = bNode;		
			
		}
		node = varDeclNode; 
	}
Esempio n. 7
0
	void FunctionalStatement(out Node node) {
		while (!(la.kind == 0 || la.kind == 1)) {SynErr(64); Get();}
		node = null; 
		Node leftNode; 
		IdentifierList(out leftNode);
		Expect(35);
		Node rightNode = null; 
		if (la.kind == 11) {
			LanguageBlock(out rightNode);
			BinaryExpressionNode expressionNode = new BinaryExpressionNode(); 
			expressionNode.LeftNode = leftNode; 
			expressionNode.RightNode = rightNode; 
			expressionNode.Optr = Operator.assign; 
			node = expressionNode; 
		} else if (StartOf(4)) {
			Expression(out rightNode);
			BinaryExpressionNode expressionNode = new BinaryExpressionNode(); 
			expressionNode.LeftNode = leftNode; 
			expressionNode.RightNode = rightNode; 
			expressionNode.Optr = Operator.assign; 
			node = expressionNode; 
			while (!(la.kind == 0 || la.kind == 20)) {SynErr(65); Get();}
			Expect(20);
		} else if (la.kind == 41) {
			Get();
			ModifierStackNode mstack = new ModifierStackNode(); 
			string name = ""; 
			Expression(out rightNode);
			if (la.kind == 42) {
				Get();
				Expect(1);
				name = t.val; 
			}
			BinaryExpressionNode expressionNode = new BinaryExpressionNode();
			expressionNode.RightNode = rightNode;
			expressionNode.LeftNode = leftNode; 
			expressionNode.Optr = Operator.assign;
			mstack.AddElementNode(expressionNode, name); 
			
			while (!(la.kind == 0 || la.kind == 20)) {SynErr(66); Get();}
			Expect(20);
			while (StartOf(5)) {
				name = ""; 
				bool bHasOperator = false; 
				Operator op = Operator.add;  
				if (StartOf(6)) {
					bHasOperator = true; 
					BinaryOps(out op);
				}
				Expression(out rightNode);
				if (la.kind == 42) {
					Get();
					Expect(1);
					name = t.val; 
				}
				if(!bHasOperator)
				{
				  expressionNode = new BinaryExpressionNode();
				  expressionNode.RightNode = rightNode;
				  expressionNode.LeftNode = leftNode; 
				  expressionNode.Optr = Operator.assign;
				  mstack.AddElementNode(expressionNode, name);
				}
				else
				{ 
				  BinaryExpressionNode expressionNode2 = new BinaryExpressionNode(); 
				  expressionNode2.LeftNode = leftNode;
				  expressionNode2.RightNode = rightNode;
				  expressionNode2.Optr = op;
				  expressionNode = new BinaryExpressionNode();
				  expressionNode.RightNode = expressionNode2;
				  expressionNode.LeftNode = leftNode; 
				  expressionNode.Optr = Operator.assign;
				  mstack.AddElementNode(expressionNode, name);
				}
				
				while (!(la.kind == 0 || la.kind == 20)) {SynErr(67); Get();}
				Expect(20);
			}
			node = mstack; 
			Expect(33);
		} else SynErr(68);
	}
Esempio n. 8
0
	void interimfactor(out Node node) {
		Factor(out node);
		while (la.kind == 15 || la.kind == 53 || la.kind == 54) {
			Operator op; 
			BitOp(out op);
			Node expr2; 
			Factor(out expr2);
			BinaryExpressionNode binaryNode = new BinaryExpressionNode();
			binaryNode.LeftNode = node;
			binaryNode.RightNode = expr2;
			binaryNode.Optr = op;
			node = binaryNode;
			
		}
	}
Esempio n. 9
0
	void Term(out Node node) {
		interimfactor(out node);
		while (la.kind == 51 || la.kind == 52) {
			Operator op; 
			MulOp(out op);
			Node expr2; 
			interimfactor(out expr2);
			BinaryExpressionNode binaryNode = new BinaryExpressionNode();
			binaryNode.LeftNode = node;
			binaryNode.RightNode = expr2;
			binaryNode.Optr = op;
			node = binaryNode;
			
		}
	}
Esempio n. 10
0
	void ArithmeticExpression(out Node node) {
		Term(out node);
		while (la.kind == 14 || la.kind == 50) {
			Operator op; 
			AddOp(out op);
			Node expr2; 
			Term(out expr2);
			BinaryExpressionNode binaryNode = new BinaryExpressionNode();
			binaryNode.LeftNode = node;
			binaryNode.RightNode = expr2;
			binaryNode.Optr = op;
			node = binaryNode;
			
		}
	}