Пример #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);
        }
Пример #2
0
        /// <summary>
        /// Parse the method message pattern.
        /// </summary>
        protected virtual MethodNode ParseMessagePattern()
        {
            // PARSE: <message pattern> ::= <unary pattern> | <binary pattern> | <keyword pattern>
            //      <unary pattern> ::= unarySelector
            //      <binary pattern> ::= binarySelector <method argument>
            //      <keyword pattern> ::= (keyword <method argument>)+
            MethodNode result = new MethodNode();
            List <IMethodSelectorToken> selectorParts = new List <IMethodSelectorToken>();
            List <MethodArgumentNode>   arguments     = new List <MethodArgumentNode>();

            Token token = this.GetNextTokenxx(Preference.Default);

            // PARSE: <message pattern> ::= <unary pattern> | <binary pattern> | <keyword pattern>
            if (token is KeywordToken)
            {
                // <keyword pattern> ::= (keyword <method argument>)+
                selectorParts.Add((IMethodSelectorToken)token);
                token = this.GetNextTokenxx(Preference.Default);
                arguments.Add(this.ParseMethodArgument(result, token));
                while (true)
                {
                    token = this.GetNextTokenxx(Preference.VerticalBar | Preference.NegativeSign);
                    if (token is KeywordToken)
                    {
                        selectorParts.Add((IMethodSelectorToken)token);
                        token = this.GetNextTokenxx(Preference.Default);
                        arguments.Add(this.ParseMethodArgument(result, token));
                    }
                    else
                    {
                        result.SetContents(selectorParts, arguments);
                        this.ResidueToken = token; // temp vars or statement
                        return(result);
                    }
                }
            }
            else if (token is BinarySelectorToken)
            {
                //  <binary pattern> ::= binarySelector <method argument>
                selectorParts.Add((IMethodSelectorToken)token);
                token = this.GetNextTokenxx(Preference.Default);
                arguments.Add(this.ParseMethodArgument(result, token));
                result.SetContents(selectorParts, arguments);
                return(result);
            }
            else if (token is IdentifierToken)
            {
                //  <unary pattern> ::= unarySelector
                selectorParts.Add((IMethodSelectorToken)token);
                result.SetContents(selectorParts, arguments);
                return(result);
            }
            else
            {
                this.ReportParserError(result, SemanticErrors.MissingMethodMessagePattern, token);
                this.ResidueToken = token;
                return(result);
            }
        }