Esempio n. 1
0
        public static void parse(TokenCode stop1, TokenCode stop2, TokenCode stop3, iSCOPE context)
        {
            Debug.Indent();
            Debug.WriteLine("Entering BODY.parse");

            Token token;
            Token start = get();

            while (true)
            {
                bool res = STATEMENT.parse(context, stop1, stop2, stop3);

                if (!res)
                {
                    // Neither a statement nor a simple declaration.
                    // Perhaps, a nested/local function?
                    token = get();
                    switch (token.code)
                    {
                    case TokenCode.Routine:
                    case TokenCode.Safe:
                    case TokenCode.Pure:
                        forget();
                        int pure_safe = 0;
                        switch (token.code)
                        {
                        case TokenCode.Pure: pure_safe = 1; break;

                        case TokenCode.Safe: pure_safe = 2; break;
                        }
                        ROUTINE.parse(null, false, false, false, pure_safe, context);
                        break;

                    case TokenCode.Unit:
                    case TokenCode.Ref:
                    case TokenCode.Val:
                        // A _local_ unit???
                        UNIT.parse(context);
                        break;

                    default:
                        // What's this?
                        break;
                    }
                }

                token = get();
                if (token.code == TokenCode.Semicolon /*|| wasEOL*/)
                {
                    forget();
                }
                if (token.code == stop1)
                {
                    break;                        // don't 'forget()'
                }
                if (stop2 != TokenCode.ERROR && token.code == stop2)
                {
                    break;                                                    // don't 'forget()'
                }
                if (stop3 != TokenCode.ERROR && token.code == stop3)
                {
                    break;                                                    // don't 'forget()'
                }
            }

            BODY body = context as BODY;

            if (body == null) /* A system error */ } {
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public static COMPILATION parse()
        {
            Debug.Indent();
            Debug.WriteLine("Entering COMPILATION.parse");

            COMPILATION compilation = new COMPILATION();

            Context.enter(compilation);

            Token start     = get();
            Token startAnon = null;
            Token endAnon   = null;

            int pure_safe = 0;

            while (true)
            {
                Token token = get();
                Token begin = token;
                switch (token.code)
                {
                case TokenCode.Final:
                    forget();
                    token = get();
                    switch (token.code)
                    {
                    case TokenCode.Unit:
                    case TokenCode.Package:
                    case TokenCode.Ref:
                    case TokenCode.Val:
                    case TokenCode.Concurrent:
                        // Don't forget()
                        UNIT.parse(false, true, false, compilation);
                        break;

                    case TokenCode.Abstract:
                        forget();
                        UNIT.parse(false, true, true, compilation);
                        break;

                    case TokenCode.Safe:
                    case TokenCode.Pure:
                    case TokenCode.Routine:
                        forget();
                        switch (token.code)
                        {
                        case TokenCode.Pure: pure_safe = 1; break;

                        case TokenCode.Safe: pure_safe = 2; break;
                        }
                        ROUTINE.parse(null, false, true, false, pure_safe, compilation);
                        pure_safe = 0;
                        break;
                    }
                    break;

                case TokenCode.Ref:
                case TokenCode.Val:
                case TokenCode.Concurrent:
                case TokenCode.Unit:
                case TokenCode.Package:
                    UNIT.parse(false, false, false, compilation);
                    break;

                case TokenCode.Abstract:
                    forget();
                    UNIT.parse(false, false, true, compilation);
                    break;

                case TokenCode.Use:
                    USE.parse(compilation);
                    break;

                case TokenCode.Routine:
                case TokenCode.Safe:
                case TokenCode.Pure:
                    forget();
                    switch (token.code)
                    {
                    case TokenCode.Pure: pure_safe = 1; break;

                    case TokenCode.Safe: pure_safe = 2; break;
                    }
                    ROUTINE.parse(null, false, false, false, pure_safe, compilation);
                    pure_safe = 0;
                    break;

                case TokenCode.EOS:
                    goto Finish;

                case TokenCode.EOL:
                    forget();
                    break;

                default:
                    // A call/assignment statement, or an error
                    if (startAnon == null)
                    {
                        startAnon = get();
                    }
                    bool result = STATEMENT.parse(compilation.anonymous.routineBody,
                                                  TokenCode.EOS, TokenCode.ERROR, TokenCode.ERROR);
                    if (!result)
                    {
                        // There was not a statement:
                        // apparently, this is a syntax error
                        goto Finish;
                    }
                    endAnon = get();
                    break;
                }
            }
Finish:
            compilation.setSpan(start, get());
            if (startAnon != null && endAnon != null)
            {
                compilation.anonymous.setSpan(startAnon, endAnon);
            }

            Debug.WriteLine("Exiting COMPILATION.parse");
            Debug.Unindent();

            Context.exit();
            return(compilation);
        }