Пример #1
0
        protected virtual MethodNode ParseMethod()
        {
            // PARSE X3J20: <method definition> ::= <message pattern> [<temporaries> ] [<statements>]
            // NB: We've extended the method definition to allow API calls into the .Net Framework,
            // PARSE: <method definition> ::= <message pattern> [<temporaries>] [<api call>] [<statements>]
            MethodNode result = this.ParseMessagePattern();
            Token      token  = this.GetNextTokenxx(Preference.NegativeSign | Preference.VerticalBar);

            // PARSE: [<temporaries>]
            ParseTemporariesResult ptr = this.ParseTemporaries(result, token);

            // PARSE [<api call>]
            token = this.GetNextTokenxx(Preference.NegativeSign);
            if (Parser.IsApiOpeningDelimiter(token))
            {
                result.SetContents(this.ParseApiCall(result, (BinarySelectorToken)token));
                token = this.GetNextTokenxx(Preference.NegativeSign);
            }

            // PARSE: <statements>
            StatementNode statements = this.ParseStatement(result, token);

            // Should be done.
            token = this.GetNextTokenxx(Preference.Default);
            if (!(token is EofToken))
            {
                this.ReportParserError(result, SemanticErrors.UnexpectedCodeAfterMethodDefinition, token);
            }

            result.SetContents(ptr.LeftBar, ptr.Temporaries, ptr.RightBar, statements);
            return(result);
        }