コード例 #1
0
        private void EmitBinaryExpNode(Operator node, out AssociativeNode outnode)
        {
            Validity.Assert(node != null);

            Dictionary <int, Node> nodes = node.GetChildrenWithIndices();

            Validity.Assert(nodes.Count <= 2);

            BinaryExpressionNode expressionNode = new BinaryExpressionNode();

            // Create operator from input node
            switch (node.Name)
            {
            case "=":
                expressionNode.Optr = ProtoCore.DSASM.Operator.assign;
                break;

            case "+":
                expressionNode.Optr = ProtoCore.DSASM.Operator.add;
                break;

            case "-":
                expressionNode.Optr = ProtoCore.DSASM.Operator.sub;
                break;

            case "*":
                expressionNode.Optr = ProtoCore.DSASM.Operator.mul;
                break;

            case "/":
                expressionNode.Optr = ProtoCore.DSASM.Operator.div;
                break;

            case "%":
                expressionNode.Optr = ProtoCore.DSASM.Operator.mod;
                break;

            case "==":
                expressionNode.Optr = ProtoCore.DSASM.Operator.eq;
                break;

            case "!=":
                expressionNode.Optr = ProtoCore.DSASM.Operator.nq;
                break;

            case ">=":
                expressionNode.Optr = ProtoCore.DSASM.Operator.ge;
                break;

            case ">":
                expressionNode.Optr = ProtoCore.DSASM.Operator.gt;
                break;

            case "<=":
                expressionNode.Optr = ProtoCore.DSASM.Operator.le;
                break;

            case "<":
                expressionNode.Optr = ProtoCore.DSASM.Operator.lt;
                break;

            case "&&":
                expressionNode.Optr = ProtoCore.DSASM.Operator.and;
                break;

            case "||":
                expressionNode.Optr = ProtoCore.DSASM.Operator.or;
                break;

            case "&":
                expressionNode.Optr = ProtoCore.DSASM.Operator.bitwiseand;
                break;

            case "|":
                expressionNode.Optr = ProtoCore.DSASM.Operator.bitwiseor;
                break;

            case "^":
                expressionNode.Optr = ProtoCore.DSASM.Operator.bitwisexor;
                break;

            default: break;
            }

            AssociativeNode identNode1 = new NullNode();
            AssociativeNode identNode2 = new NullNode();

            if (nodes.Count == 2)
            {
                // Create BinaryExpressionNode from identNode1, identNode2 and operator
                DFSTraverse(nodes[0], out identNode1);
                DFSTraverse(nodes[1], out identNode2);
            }
            else if (nodes.Count == 1)
            {
                // Create BinaryExpressionNode from identNode1, null
                DFSTraverse(nodes[0], out identNode1);
            }
            expressionNode.LeftNode  = identNode1;
            expressionNode.RightNode = identNode2;

            //(AstRootNode as CodeBlockNode).Body.Add(expressionNode);
            BinaryExpressionNode assignmentNode = new BinaryExpressionNode();

            assignmentNode.LeftNode  = new IdentifierNode(node.tempName);
            assignmentNode.Optr      = ProtoCore.DSASM.Operator.assign;
            assignmentNode.RightNode = expressionNode;
            assignmentNode.Guid      = node.Guid;

            Validity.Assert(gc != null);
            gc.HandleNewNode(assignmentNode);

            outnode = assignmentNode;
        }
コード例 #2
0
        private void EmitBinaryExpNode(Operator node, out AssociativeNode outnode)
        {
            Validity.Assert(node != null);

            Dictionary<int, Node> nodes = node.GetChildrenWithIndices();
            Validity.Assert(nodes.Count <= 2);

            BinaryExpressionNode expressionNode = new BinaryExpressionNode();

            // Create operator from input node
            switch (node.Name)
            {
                case "=":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.assign;
                    break;
                case "+":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.add;
                    break;
                case "-":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.sub;
                    break;
                case "*":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.mul;
                    break;
                case "/":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.div;
                    break;
                case "%":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.mod;
                    break;
                case "==":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.eq;
                    break;
                case "!=":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.nq;
                    break;
                case ">=":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.ge;
                    break;
                case ">":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.gt;
                    break;
                case "<=":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.le;
                    break;
                case "<":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.lt;
                    break;
                case "&&":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.and;
                    break;
                case "||":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.or;
                    break;
                case "&":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.bitwiseand;
                    break;
                case "|":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.bitwiseor;
                    break;
                case "^":
                    expressionNode.Optr = ProtoCore.DSASM.Operator.bitwisexor;
                    break;
                default: break;
            }

            AssociativeNode identNode1 = new NullNode();
            AssociativeNode identNode2 = new NullNode();

            if (nodes.Count == 2)
            {
                // Create BinaryExpressionNode from identNode1, identNode2 and operator                
                DFSTraverse(nodes[0], out identNode1);
                DFSTraverse(nodes[1], out identNode2);
                
            }
            else if (nodes.Count == 1)
            {
                // Create BinaryExpressionNode from identNode1, null 
                DFSTraverse(nodes[0], out identNode1);
            }
            expressionNode.LeftNode = identNode1;
            expressionNode.RightNode = identNode2;

            //(AstRootNode as CodeBlockNode).Body.Add(expressionNode);
            BinaryExpressionNode assignmentNode = new BinaryExpressionNode();
            assignmentNode.LeftNode = new IdentifierNode(node.tempName);
            assignmentNode.Optr = ProtoCore.DSASM.Operator.assign;
            assignmentNode.RightNode = expressionNode;
            assignmentNode.Guid = node.Guid;

            Validity.Assert(gc != null);
            gc.HandleNewNode(assignmentNode);

            outnode = assignmentNode;
        }