Пример #1
0
        internal int CompileSelfParameter(CompileParameter param)
        {
            var xident = X as Ident;

            if (xident != null)
            {
                if (xident.Symbol == null)
                {
                    throw new CompileException("undefined symbol: " + xident.Name, DotPos);
                }

                // a.Do()的a 放入
                switch (xident.Symbol.Usage)
                {
                case SymbolUsage.Parameter:
                case SymbolUsage.Variable:
                {
                    X.Compile(param.SetLHS(false));
                    return(1);
                }
                }
            }

            return(0);
        }
Пример #2
0
        internal override void Compile(CompileParameter param)
        {
            var newset = new ValuePhoFunc(new ObjectName("fakepkg", "constcalc"), ConstPos, 0, null);


            var funcParam = param.SetCmdSet(newset);

            // 用空的常量表
            funcParam.Constants = new ConstantSet();

            // 生成表达式计算指令
            Value.Compile(funcParam);

            try
            {
                var eval = VMachine.MiniExec(newset, funcParam.Constants);

                var ci = param.Constants.Add(eval);
                Name.Symbol.RegIndex = ci;
            }
            catch (RuntimeException)
            {
                throw new CompileException("Expect constant value to caculate value", ConstPos);
            }
        }
Пример #3
0
        internal override void Compile(CompileParameter param)
        {
            Condition.Compile(param.SetLHS(false));

            var jnzCmd = param.CS.Add(new Command(Opcode.JZ, 0))
                         .SetCodePos(IfPos)
                         .SetComment("if condition false");

            Body.Compile(param.SetLHS(false));

            var jmpCmd = param.CS.Add(new Command(Opcode.JMP, 0))
                         .SetCodePos(IfPos)
                         .SetComment("if condition true");

            // false body跳入
            jnzCmd.DataA = param.CS.CurrCmdID;

            if (ElseBody.Stmts.Count > 0)
            {
                ElseBody.Compile(param.SetLHS(false));
            }

            // true body执行完毕跳出
            jmpCmd.DataA = param.CS.CurrCmdID;
        }
Пример #4
0
        internal static void Import(Executable exe, ContentLoader loader, string packageName, string sourceName, ImportMode mode)
        {
            var pkg = new Package(packageName, false);

            var parser = new Parser(exe, loader, pkg.ScopeMgr);

            loader.Load(pkg, parser, sourceName, mode);

            exe.AddPackage(pkg);

            var initPos = TokenPos.Init;

            initPos.SourceName = sourceName;

            // 全局入口( 不进入函数列表, 只在Package上保存 )
            var cs = new ValuePhoFunc(new ObjectName(pkg.Name, "@init"), initPos, pkg.PackageScope.RegCount, pkg.PackageScope);

            pkg.InitEntry = cs;

            var param = new CompileParameter();

            param.Pkg       = pkg;
            param.CS        = cs;
            param.Exe       = exe;
            param.Constants = exe.Constants;

            pkg.Compile(param);

            cs.Add(new Command(Opcode.EXIT).SetCodePos(parser.CurrTokenPos));
        }
Пример #5
0
 internal override void Compile(CompileParameter param)
 {
     foreach (var b in Stmts)
     {
         b.Compile(param.SetLHS(false));
     }
 }
Пример #6
0
 internal void Compile(CompileParameter param)
 {
     foreach (var f in _code)
     {
         f.AST.Compile(param);
     }
 }
Пример #7
0
        internal override void Compile(CompileParameter param)
        {
            int SelfCount = 0;


            // 尝试放入self作为第一个参数
            var selector = Func as SelectorExpr;

            if (selector != null)
            {
                SelfCount += selector.CompileSelfParameter(param.SetLHS(false));
            }


            // 先放参数
            foreach (var arg in Args)
            {
                arg.Compile(param.SetLHS(false));
            }

            // 本包及动态闭包调用
            Func.Compile(param.SetLHS(false));

            param.CS.Add(new Command(Opcode.CALL, Args.Count + SelfCount, GetReceiverCount())).SetCodePos(LParen);
        }
Пример #8
0
        internal void GenDefaultRet(IEnumerable <Node> nodeEnum, CompileParameter param)
        {
            bool anyCode = false;

            foreach (var c in nodeEnum)
            {
                anyCode = true;

                var retStmt = c as ReturnStmt;
                if (retStmt != null)
                {
                    return;
                }
            }

            var cmd = param.CS.Add(new Command(Opcode.RET));

            // 有任意代码, 且有指令, 用最后的代码位置生成RET的代码位置
            if (anyCode && param.CS.CurrCmdID > 1)
            {
                cmd.SetCodePos(param.CS.Commands[param.CS.CurrCmdID - 2].CodePos);
            }
            else
            {
                // 使用函数定义地方做exit位置
                cmd.SetCodePos(FuncPos);
            }
        }
Пример #9
0
        internal override void Compile(CompileParameter param)
        {
            var c = Lit2Const( );

            _constIndex = param.Constants.Add(c);

            param.CS.Add(new Command(Opcode.LOADK, _constIndex)).SetComment(c.ToString()).SetCodePos(Pos);
        }
Пример #10
0
        internal override void Compile(CompileParameter param)
        {
            foreach (var im in Imports)
            {
                im.Compile(param);
            }

            Block.Compile(param);
        }
Пример #11
0
        internal override void Compile(CompileParameter param)
        {
            X.Compile(param);
            Y.Compile(param);


            param.CS.Add(new Command(Token2OpCode(Op)))
            .SetCodePos(OpPos);
        }
Пример #12
0
        internal void AddSecondPass(Node n, CompileParameter cp)
        {
            CompileContext ctx;

            ctx.node      = n;
            ctx.parameter = cp;

            _secondPass.Add(ctx);
        }
Пример #13
0
        internal override void Resolve(CompileParameter param)
        {
            // 故地重游, 再次拨叫
            if (Symbol == null && BaseScope != null)
            {
                Symbol = BaseScope.FindSymbolOutter(Name);
            }

            GenCode(param, 2);
        }
Пример #14
0
        internal override void Compile(CompileParameter param)
        {
            for (int i = Results.Count - 1; i >= 0; i--)
            {
                Results[i].Compile(param.SetLHS(false));
            }


            param.CS.Add(new Command(Opcode.RET)).SetCodePos(RetPos);
        }
Пример #15
0
        internal override void Compile(CompileParameter param)
        {
            nearestForStmt = LoopStmt.FindLoop(this);
            if (nearestForStmt == null)
            {
                throw new CompileException("'continue' should in for statement", Pos);
            }

            param.NextPassToResolve(this);

            cmd = param.CS.Add(new Command(Opcode.JMP, -1))
                  .SetCodePos(Pos).SetComment("continue");
        }
Пример #16
0
        internal override void Compile(CompileParameter param)
        {
            foreach (var b in X)
            {
                // ExprStmt下不出现CallExpr可能是-foo();  1+foo() 这种奇葩写法
                // 返回值无法被回收, 所以直接报错
                if (!(b is CallExpr))
                {
                    throw new CompileException("invalid expression statement", DefPos);
                }

                b.Compile(param.SetLHS(false));
            }
        }
Пример #17
0
        internal override void Compile(CompileParameter param)
        {
            // 占位
            CmdGen = param.CS.Add(new Command(Opcode.NOP))
                     .SetComment(string.Format("{0}.{1}", param.Pkg.Name, Name))
                     .SetCodePos(DefinePos);

            GenCode(param, 1);

            if (CmdGen.Op == Opcode.NOP && !param.IsNodeInNextPass(this))
            {
                throw new CompileException("code not resolve", DefinePos);
            }
        }
Пример #18
0
        internal override void Resolve(CompileParameter param)
        {
            var c = param.Exe.GetClassTypeByName(new ObjectName(param.Pkg.Name, ClassName.Name));

            if (c == null)
            {
                throw new CompileException("unknown class name: " + ClassName.Name, TypeInfo.FuncPos);
            }
            else
            {
                int nameKey = param.Constants.AddString(Name.Name);
                var cc      = c as ValuePhoClassType;
                cc.AddMethod(nameKey, _proc);
            }
        }
Пример #19
0
        internal override void Compile(CompileParameter param)
        {
            var opcode = Token2OpCode(Op);

            if (opcode != Opcode.NOP)
            {
                X.Compile(param);
            }
            else
            {
                throw new CompileException("Unknown unary operator", OpPos);
            }

            param.CS.Add(new Command(opcode)).SetCodePos(OpPos);
        }
Пример #20
0
        internal override void Compile(CompileParameter param)
        {
            Index.Compile(param.SetLHS(false));

            X.Compile(param.SetLHS(false));

            if (param.LHS)
            {
                // 赋值
                param.CS.Add(new Command(Opcode.SETI)).SetCodePos(LBrackPos);
            }
            else
            {
                // 取值
                param.CS.Add(new Command(Opcode.LOADI)).SetCodePos(LBrackPos);
            }
        }
Пример #21
0
        internal override void Compile(CompileParameter param)
        {
            var cmd = param.CS.Add(new Command(Opcode.NEW)).SetCodePos(LBracketPos).SetComment("Builtin.Array");

            cmd.EntryName = new ObjectName("Builtin", "Array");


            foreach (var v in Values)
            {
                v.Compile(param);
            }

            if (Values.Count > 0)
            {
                param.CS.Add(new Command(Opcode.SETA, Values.Count)).SetCodePos(LBracketPos);
            }
        }
Пример #22
0
        internal override void Compile(CompileParameter param)
        {
            var cmd = param.CS.Add(new Command(Opcode.NEW)).SetCodePos(LBracePos).SetComment("Builtin.Map");

            cmd.EntryName = new ObjectName("Builtin", "Map");


            var kvParam = param.SetLHS(false);

            foreach (var kv in Values)
            {
                kv.Key.Compile(kvParam);
                kv.Value.Compile(kvParam);
            }

            param.CS.Add(new Command(Opcode.SETD, Values.Count)).SetCodePos(LBracePos);
        }
Пример #23
0
        bool ResolveParent(CompileParameter param, int pass)
        {
            var parent = param.Exe.GetClassTypeByName(new ObjectName(param.Pkg.Name, ParentName.Name)) as ValuePhoClassType;

            if (parent != null)
            {
                _class.ParentID = parent.ID;
                _class.Parent   = param.Exe.FindClassByPersistantID(parent.ID);

                return(true);
            }

            if (pass > 1)
            {
                throw new CompileException("unknown parent class: " + ParentName.Name, ColonPos);
            }

            return(false);
        }
Пример #24
0
        internal override void Compile(CompileParameter param)
        {
            ObjectName on = ObjectName.Empty;

            on.EntryName = ClassName.Name;
            if (PackageName != null)
            {
                on.PackageName = PackageName.Name;
            }
            else
            {
                on.PackageName = param.Pkg.Name;
            }

            _cmd = param.CS.Add(new Command(Opcode.NEW))
                   .SetCodePos(NewPos);

            _cmd.EntryName = on;

            _cmd.SetComment(on.ToString());
        }
Пример #25
0
        internal override void Compile(CompileParameter param)
        {
            LoopBeginCmdID = param.CS.CurrCmdID;

            Condition.Compile(param.SetLHS(false));

            var jzCmd = param.CS.Add(new Command(Opcode.JZ, 0))
                        .SetCodePos(Pos)
                        .SetComment("while condition");

            param.LHS = false;
            Body.Compile(param.SetLHS(false));

            param.CS.Add(new Command(Opcode.JMP, LoopBeginCmdID))
            .SetCodePos(Pos)
            .SetComment("while loop");

            // false body跳入
            LoopEndCmdID = param.CS.CurrCmdID;
            jzCmd.DataA  = LoopEndCmdID;
        }
Пример #26
0
        internal override void Compile(CompileParameter param)
        {
            _class = new ValuePhoClassType(param.Pkg, new ObjectName(param.Pkg.Name, Name.Name));

            _class.ID = param.Exe.GenPersistantID();

            foreach (var m in Member)
            {
                var ki = param.Constants.AddString(m.Name);

                _class.AddMemeber(ki, m.Name);
            }

            param.Exe.AddClassType(_class);


            if (ParentName != null && !ResolveParent(param, 1))
            {
                param.NextPassToResolve(this);
            }
        }
Пример #27
0
        internal override void Compile(CompileParameter param)
        {
            if (Init != null)
            {
                Init.Compile(param.SetLHS(false));
            }

            LoopBeginCmdID = param.CS.CurrCmdID;

            Command jzCmd = null;

            if (Condition != null)
            {
                Condition.Compile(param.SetLHS(false));

                jzCmd = param.CS.Add(new Command(Opcode.JZ, -1))
                        .SetCodePos(Pos)
                        .SetComment("for condition");
            }

            Body.Compile(param.SetLHS(false));

            if (Post != null)
            {
                Post.Compile(param.SetLHS(false));
            }


            param.CS.Add(new Command(Opcode.JMP, LoopBeginCmdID))
            .SetCodePos(Pos)
            .SetComment("for loop");

            // false body跳入
            if (jzCmd != null)
            {
                jzCmd.DataA = param.CS.CurrCmdID;
            }

            LoopEndCmdID = param.CS.CurrCmdID;
        }
Пример #28
0
        internal override void Compile(CompileParameter param)
        {
            switch (Op)
            {
            case TokenType.Assign:
            {
                foreach (var e in RHS)
                {
                    e.Compile(param.SetLHS(false));
                }
            }
            break;

            case TokenType.AddAssign:
            case TokenType.SubAssign:
            case TokenType.MulAssign:
            case TokenType.QuoAssign:
            {
                // 这种操作只允许一个一个来
                if (LHS.Count != 1 || RHS.Count != 1)
                {
                    throw new CompileException("assignment require 1 operand", AssignPos);
                }

                LHS[0].Compile(param.SetLHS(false));

                RHS[0].Compile(param.SetLHS(false));

                param.CS.Add(new Command(Token2OpCode(Op)))
                .SetCodePos(AssignPos);
            }
            break;
            }

            foreach (var e in LHS)
            {
                e.Compile(param.SetLHS(true));
            }
        }
Пример #29
0
        // 手动分配1个iterator变量
        // k, v, iter = ITER( x, iter )
        //
        internal override void Compile(CompileParameter param)
        {
            var iterVar = DelcareIteratorVar();

            param.CS.Add(new Command(Opcode.INITR, iterVar.Symbol.RegIndex))
            .SetCodePos(Pos)
            .SetComment("init iterator");


            LoopBeginCmdID = param.CS.CurrCmdID;

            X.Compile(param);

            iterVar.Compile(param);

            var jmpCmd = param.CS.Add(new Command(Opcode.VISIT, -1))
                         .SetCodePos(Pos)
                         .SetComment("for kv");

            Key.Compile(param.SetLHS(true));

            Value.Compile(param.SetLHS(true));

            iterVar.Compile(param.SetLHS(true));

            Body.Compile(param.SetLHS(false));


            param.CS.Add(new Command(Opcode.JMP, LoopBeginCmdID))
            .SetCodePos(Pos)
            .SetComment("for kv loop");

            // 循环结束
            LoopEndCmdID = param.CS.CurrCmdID;
            jmpCmd.DataA = LoopEndCmdID;
        }
Пример #30
0
        internal override void Compile(CompileParameter param)
        {
            ObjectName on = new ObjectName(param.Pkg.Name, Name.Name);

            if (ClassName != null)
            {
                // 成员函数必须有至少1个参数(self)
                if (TypeInfo.Params.Count < 1)
                {
                    throw new CompileException("Expect 'self' in method", TypeInfo.FuncPos);
                }

                on.ClassName = ClassName.Name;
            }

            var newset = new ValuePhoFunc(on, TypeInfo.FuncPos, TypeInfo.ScopeInfo.CalcUsedReg(), TypeInfo.ScopeInfo);

            bodyCS = newset;

            _proc = param.Exe.AddFunc(newset);

            if (ClassName != null)
            {
                param.NextPassToResolve(this);
            }

            var funcParam = param.SetLHS(false).SetCmdSet(newset);

            Body.Compile(funcParam);

            TypeInfo.GenDefaultRet(Body.Child(), funcParam);

            newset.InputValueCount = TypeInfo.Params.Count;

            newset.OutputValueCount = FuncType.CalcReturnValueCount(Body.Child());
        }