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