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); }
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); }
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); }
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); } }