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