public QuadrupleNode(QuadrupleType type, Object arg1 = null, Object arg2 = null) { Type = type; Arg1 = arg1; Arg2 = arg2; Active = false; CurrentValue = null; Result = null;//表示未初始化 }
/// <summary> /// 产生中间代码(可以选择优化等级) /// </summary> /// <param name="Text">优化代码</param> /// <param name="Level">优化等级为0 ~ 3</param> public void GenerateCode(string Text, int Level) { Parse(Text); Done = true; OptimizationLevel = Level; if (NumOfError != 0) { return; } Clear(); GetQuadruples(Root, 0); LocateJumpNodeAndDetermineNodeOffset();//获取四元式后,回填跳转地址并且对每个节点赋于地址值 Optimize optimize = new Optimize(CodeSeg, VarSeg, CodeEntrance); if (Level > 0) { optimize.LocalOptimization(); } if (Level > 1) { optimize.LoopOptimization(); } if (Level > 2) { optimize.GlobalOptimization();//O(n^4警告) } if (Level > 3) { Console.WriteLine("4级别优化请给Jeff Dean发邮件"); } if (Level > 0) { CodeSeg = optimize.GenerateCode(); } else { //添加程序入口 List <QuadrupleNode> Code = new List <QuadrupleNode>(); Code.Add(new QuadrupleNode(QuadrupleType.JMP) { Result = CodeEntrance + 1 }); int JumpValue = Convert.ToInt32(QuadrupleType.JMP); foreach (var i in CodeSeg) { QuadrupleType type = i.Type; int v = Convert.ToInt32(type); if (v <= JumpValue || type == QuadrupleType.Call) { i.Result++; } Code.Add(i); } CodeSeg = Code; } }
public QuadrupleNode(QuadrupleNode old, int level) { Type = old.Type; Arg1 = old.Arg1; Arg2 = old.Arg2; Value = old.Value; Offset = old.Offset; Level = level - old.Level; AddressOffset = old.AddressOffset; }
private bool IsJumpInstruction(QuadrupleType type) { return(Convert.ToInt32(type) <= Convert.ToInt32(QuadrupleType.JMP)); }