Exemplo n.º 1
0
 public QuadrupleNode(QuadrupleType type, Object arg1 = null, Object arg2 = null)
 {
     Type         = type;
     Arg1         = arg1;
     Arg2         = arg2;
     Active       = false;
     CurrentValue = null;
     Result       = null;//表示未初始化
 }
Exemplo n.º 2
0
        /// <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;
            }
        }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 private bool IsJumpInstruction(QuadrupleType type)
 {
     return(Convert.ToInt32(type) <= Convert.ToInt32(QuadrupleType.JMP));
 }