protected virtual KeywordMessageNode ParseKeywordMessage(MessageSequenceNode parent, KeywordToken selector) { // PARSE: <keyword message> ::= (keyword <keyword argument> )+ KeywordMessageNode result = new KeywordMessageNode(parent); List<KeywordToken> selectorTokens = new List<KeywordToken>(); List<KeywordArgumentNode> arguments = new List<KeywordArgumentNode>(); Token token = this.GetNextTokenxx(Preference.NegativeSign); selectorTokens.Add(selector); arguments.Add(this.ParseKeywordArgument(result, token)); // NB: ParseKeywordArgument() may not fail. token = this.GetNextTokenxx(Preference.Default); while (token is KeywordToken) { selectorTokens.Add((KeywordToken)token); token = this.GetNextTokenxx(Preference.NegativeSign); arguments.Add(this.ParseKeywordArgument(result, token)); // NB: ParseKeywordArgument() may not fail. token = this.GetNextTokenxx(Preference.Default); } result.SetContents(selectorTokens, arguments); this.ResidueToken = token; return result; }