Пример #1
0
        public string Visit(CIL_FunctionDef node)
        {
            string solve = "";

            context_function = new Dictionary <string, string>();
            ReservLocalArgs  = 4 * node.Locals.Params.Count;
            int idx = 0;

            foreach (var item in node.Params.Params)
            {
                context_function.Add(item, $"{4 * (idx++)}($fp)");
            }

            idx = 0;
            foreach (var item in node.Locals.Params)
            {
                context_function.Add(item, $"{4 * (idx++)}($sp)");
            }
            solve += $"\t {node.Name}:\n";
            // reserv global variable
            solve += $"\t addiu $sp, $sp, -{ ReservLocalArgs }\n";


            foreach (var item in node.Corpus.ListNode)
            {
                var subsolve = item?.Visit(this);
                if (subsolve != null)
                {
                    solve += subsolve;
                }
            }

            return(solve);
        }
Пример #2
0
        public string Visit(CIL_FunctionDef node)
        {
            Dictionary <string, int> PosMem = new Dictionary <string, int>();
            int esp = mem.GetESP();

            esp += node.Params.Params.Count;
            for (int i = 0; i < node.Params.Params.Count; i++)
            {
                PosMem.Add(node.Params.Params[i], esp--);
            }
            foreach (var item in node.Locals.Params)
            {
                PosMem.Add(item, mem.Push(0));
            }
            Dictionary <string, int> LabelsDir = new Dictionary <string, int>();

            for (int i = 0; i < node.Corpus.ListNode.Count; i++)
            {
                if (node.Corpus.ListNode[i] is CIL_Label)
                {
                    LabelsDir.Add(((CIL_Label)node.Corpus.ListNode[i]).Label, i + 1);
                }
            }
            variableaddr.Push(PosMem);
            int idx = 0;

            while (true)
            {
                var st = node.Corpus.ListNode[idx];
                if (st is CIL_Goto)
                {
                    idx = LabelsDir[((CIL_Goto)st).Label];
                }
                else if (st is CIL_If_Goto)
                {
                    var n    = (CIL_If_Goto)st;
                    var idx1 = LabelsDir[((CIL_If_Goto)st).Label];
                    int v    = GetValueFromId(n.Condition);
                    if (v != 0)
                    {
                        idx = idx1;
                    }
                    else
                    {
                        idx++;
                    }
                }
                else if (st is CIL_Return)
                {
                    st.Visit(this);
                    break;
                }
                else
                {
                    st.Visit(this);
                    idx++;
                }
            }
            variableaddr.Pop();
            return("");
        }