protected virtual CascadeMessageSequenceNode ParseCascadeMessageSequenceNode(ICascadeMessageSequenceParentNode parent, Token semicolon) { // PARSE: <cascaded messages> ::= (';' <messages>)* if (!Parser.IsCascadeDelimiter(semicolon)) { this.ResidueToken = semicolon; return(null); // Not a cascade message ... return null. } CascadeMessageSequenceNode result = new CascadeMessageSequenceNode(parent, (SpecialCharacterToken)semicolon); Token token = this.GetNextTokenxx(Preference.Default); MessageSequenceNode messages = this.ParseMessages(result, token); if (messages == null) { this.ReportParserError(result, SemanticErrors.MissingMessagePattern, token); return(result); } token = this.GetNextTokenxx(Preference.Default); CascadeMessageSequenceNode nextCascade = null; if (Parser.IsCascadeDelimiter(token)) { nextCascade = this.ParseCascadeMessageSequenceNode(result, (SpecialCharacterToken)token); } else { this.ResidueToken = token; } result.SetContents(messages, nextCascade); return(result); }
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); }
protected virtual UnaryBinaryKeywordMessageSequenceNode ParseUnaryBinaryKeywordMessageSequence(IMessageSequenceParentNode parent, IdentifierToken selector) { // PARSE: // <unary message>+ <binary message>* [<keyword message>] UnaryBinaryKeywordMessageSequenceNode result = new UnaryBinaryKeywordMessageSequenceNode(parent); // NB: ParseUnaryMessage() cannot fail, so we don't check result UnaryMessageNode message = this.ParseUnaryMessage(result, selector); Token token = this.GetNextTokenxx(Preference.Default); MessageSequenceNode nextMessage = this.ParseMessages(result, token, MessageType.All); result.SetContents(message, nextMessage); return(result); }
protected virtual void ParseBaseicExpressionMessages(BasicExpressionNode expression, IPrimaryNode primary, Token token) { MessageSequenceNode messages = this.ParseMessages(expression, token); if (messages == null) { expression.SetContents(primary, null, null); return; } token = this.GetNextTokenxx(Preference.Default); CascadeMessageSequenceNode cascadeMessages = this.ParseCascadeMessageSequenceNode(expression, token); expression.SetContents(primary, messages, cascadeMessages); }