Пример #1
0
        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));
        }
Пример #2
0
        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);
        }