Exemplo n.º 1
0
        public ImportStmt(BasicLit src, TokenPos pos)
        {
            Source    = src;
            ImportPos = pos;

            BuildRelation();
        }
Exemplo n.º 2
0
        List <ImportStmt> ParseImportStmt( )
        {
            var importList = new List <ImportStmt>();

            while (CurrTokenType == TokenType.Import &&
                   CurrTokenType != TokenType.EOF)
            {
                var defpos = CurrTokenPos;
                Expect(TokenType.Import);


                var tk = Expect(TokenType.QuotedString);

                var pkgName = new BasicLit(tk.Value, (TokenType)tk.MatcherID, tk.Pos);

                var n = new ImportStmt(pkgName, defpos);
                importList.Add(n);

                ScopeManager.Declare(n, ScopeMgr.PackageScope, tk.Value, defpos, SymbolUsage.Package);

                // 如果包存在, 就不会在定义
                var pkg = Exe.GetPackageByName(tk.Value);
                if (pkg == null)
                {
                    Compiler.Import(_exe, _loader, tk.Value, tk.Value, ImportMode.Directory);
                }
            }

            return(importList);
        }
Exemplo n.º 3
0
        BasicLit ParseBasicLit()
        {
            switch (CurrTokenType)
            {
            case TokenType.Number:
            case TokenType.QuotedString:
            {
                var x = new BasicLit(_token.Value, CurrTokenType, CurrTokenPos);
                Next();
                return(x);
            }
            }

            throw new CompileException("Expect Literal value", CurrTokenPos);
        }
Exemplo n.º 4
0
        Expr ParseOperand(bool lhs)
        {
            var defPos = CurrTokenPos;

            switch (CurrTokenType)
            {
            case TokenType.Identifier:     // a = b
            {
                var x = ParseIdent();

                ScopeMgr.Resolve(x);

                return(x);
            }

            case TokenType.Base:     // a= base.foo()
            {
                Next();

                return(new BaseLit(defPos));
            }

            case TokenType.Number:
            case TokenType.QuotedString:
            {
                var x = new BasicLit(_token.Value, CurrTokenType, CurrTokenPos);
                Next();
                return(x);
            }

            case TokenType.LParen:     // () 括号表达式
            {
                Next();

                var x = ParseExpr(false);

                var rparenPos = CurrTokenPos;
                Expect(TokenType.RParen);

                return(new ParenExpr(x, defPos, rparenPos));
            }

            case TokenType.LBracket:     // a = [] 数组初始化
            {
                Next();

                List <Expr> values = new List <Expr>();

                while (CurrTokenType != TokenType.RBracket &&
                       CurrTokenType != TokenType.EOF)
                {
                    values.Add(ParseOperand(false));


                    if (CurrTokenType == TokenType.RBracket ||
                        CurrTokenType == TokenType.EOF)
                    {
                        break;
                    }

                    Expect(TokenType.Comma);
                }


                var rPos = CurrTokenPos;
                Expect(TokenType.RBracket);

                return(new ArrayExpr(values, defPos, rPos));
            }

            case TokenType.LBrace:     // a = {} Map初始化
            {
                Next();

                Dictionary <BasicLit, Expr> mapValues = new Dictionary <BasicLit, Expr>();

                while (CurrTokenType != TokenType.RBrace &&
                       CurrTokenType != TokenType.EOF)
                {
                    var key = ParseBasicLit();

                    Expect(TokenType.Colon);

                    var value = ParseRHS();

                    mapValues.Add(key, value);

                    if (CurrTokenType == TokenType.RBrace ||
                        CurrTokenType == TokenType.EOF)
                    {
                        break;
                    }

                    Expect(TokenType.Comma);
                }


                var rPos = CurrTokenPos;
                Expect(TokenType.RBrace);

                return(new MapExpr(mapValues, defPos, rPos));
            }

            case TokenType.Func:     // a = func( ) {}
            {
                Next();

                var scope     = ScopeMgr.OpenScope(ScopeType.Closure, defPos);
                var paramlist = ParseParameters(scope, false);

                var body = ParseBody(scope);

                var funclit = new FuncLit(body, new FuncType(defPos, paramlist, scope));

                return(funclit);
            }
            }

            throw new CompileException("Unknown operand", CurrTokenPos);
        }