Beispiel #1
0
        public InterOp CompileAssignExpression(SyntaxTreeNode node)
        {
            CodeSymbol symbol = ToIntermediateExpression(node[0]) as CodeSymbol;

            InterCopy copy;

            CodeValue source;

            if (node[2].ValueString == "None")
            {
                source = ToIntermediateExpression(node[1]);
            }
            else
            {
                var i = new InterBinOp(Operator.FromName(node[2].ValueString), symbol, ToIntermediateExpression(node[1]));
                source = new InterOpValue(i, builder.CurrentMethod);
            }
            if (symbol == null)
            {
                copy = new InterCopy(new LateReferenceResolver(node[0], builder.CurrentType.NamespaceContext), source);
            }
            else
            {
                copy = new InterCopy(symbol, source);
            }

            copy.SetOwner(builder.CurrentMethod);
            return(copy);
        }
Beispiel #2
0
        public InterOp CompilePostIncrementOrDecrementExpression(SyntaxTreeNode node)
        {
            var op1  = ToIntermediateExpression(node[0]);
            var op2  = new CodeValue(CodeType.Int32, 1);
            var op   = new InterBinOp(Operator.FromName(node[1].ValueString), op1, op2);
            var copy = new InterCopy((CodeSymbol)ToIntermediateExpression(node[0]), new InterOpValue(op, builder.CurrentMethod));

            copy.SetOwner(builder.CurrentMethod);
            return(copy);
        }
Beispiel #3
0
        public InterOp CompileBinaryExpression(SyntaxTreeNode node)
        {
            var op = new InterBinOp(
                Operator.FromName(node[2].ValueString),
                ToIntermediateExpression(node.Children[0]),
                ToIntermediateExpression(node.Children[1]));

            if (node.Op == "BinaryBoolExpression")
            {
                op.IsBooleanExpression = true;
            }

            return(op);
        }
Beispiel #4
0
        public void CompileSwitchStatement(SyntaxTreeNode node)
        {
            var exp = ToIntermediateExpression(node[0]);
            var loc = builder.AddLocal("switchLocl" + builder.CurrentMethod.Locals.Count, exp);

            builder.AddInstruction(new InterCopy(loc, exp));

            InterBranch[] branches = new InterBranch[node[1].Children.Length];

            SyntaxTreeNode defaultCase   = null;
            InterBranch    defaultBranch = null;

            for (int i = 0; i < branches.Length; i++)
            {
                var sect = node[1][i];

                if (sect[0].Op == "DefaultLabel")
                {
                    defaultCase = sect; continue;
                }

                var bin    = new InterBinOp(new Operator(Operator.OperatorType.Ceq), ToIntermediateExpression(sect[0][0]), loc);
                var branch = new InterBranch(new InterOpValue(bin), InterBranch.BranchCondition.OnTrue);
                builder.AddInstruction(branch);
                branches[i] = branch;
            }

            if (defaultCase == null)
            {
                builder.AddBreakStatement();
            }
            else
            {
                defaultBranch = new InterBranch();
                builder.AddInstruction(defaultBranch);
            }

            for (int i = 0; i < branches.Length; i++)
            {
                var sect = node[1][i];

                if (sect[0].Op == "DefaultLabel")
                {
                    continue;
                }

                string label = builder.CurrentMethod.NextLabel;

                CompileNode(sect[1]);

                branches[i].SetLabel(label);
            }

            if (defaultCase != null)
            {
                string defaultLabel = builder.CurrentMethod.NextLabel;
                CompileNode(defaultCase[1]);
                defaultBranch.SetLabel(defaultLabel);
            }

            string endLabel = builder.CurrentMethod.NextLabel;

            foreach (var b in builder.GetBreaks())
            {
                b.SetLabel(endLabel);
            }
        }