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); }
/// <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); } }