internal void Goto(IList <Tree> trees) { var T = new Assembler(); T.Set("goto"); T.Param1 = trees[1]; Add("jmp", "", new Tree(trees[1].Content, Kind.Label)); }
internal Tree Caller(IList <Tree> trees, Kind kind = Kind.Caller, string name = "") { var dname = name == ""; var T = new Assembler(dname ? "L" + ++_count : name); T.Set(trees[0].Content); for (int j = 0; j < trees[1].Count; j++) { trees[1][j] = Compiler(trees[1][j]); } T.Param1 = trees[1]; var h = new Tree(new Builder(T.Name), trees[0].Parent, Kind.Variable) { Start = 0, End = T.Name.Length - 1 }; foreach (var item in T.Param1) { Add("push", "", new Tree(item.Content, Kind.Variable)); } Add("push", "", new Tree("IP", Kind.Register)); if (kind == Kind.Caller) { Add("call", "", new Tree(T.Fn, Kind.Variable)); } else { Add("push", "", new Tree(T.Fn, Kind.Variable)); Add("call", "", new Tree("Get_Array", Kind.Variable)); } Add("pop", "", new Tree(T.Name, Kind.Variable)); if (dname) { _count -= 1; } return(h); }