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); }
/// <summary> /// Visits the Unary-Binary-Keyword Message Sequence node. /// </summary> /// <param name="node">The node to visit.</param> public virtual TResult VisitUnaryBinaryKeywordMessageSequence(UnaryBinaryKeywordMessageSequenceNode node) { if (node.Message != null) { node.Message.Accept(this); } if (node.NextMessage != null) { node.NextMessage.Accept(this); } return(default(TResult)); // The default naive implementation }
/// <summary> /// Visits the Unary-Binary-Keyword Message Sequence node. /// </summary> /// <param name="node">The node to visit.</param> public override bool VisitUnaryBinaryKeywordMessageSequence(UnaryBinaryKeywordMessageSequenceNode node) { if (node.Parent == null) { return(false); } if ((node.Message == null) || !node.Message.Accept(this)) { return(false); } if ((node.NextMessage != null) && !node.NextMessage.Accept(this)) { return(false); } return(true); }
/// <summary> /// Visits the Unary-Binary-Keyword Message Sequence node. /// </summary> /// <param name="node">The node to visit.</param> public virtual TResult VisitUnaryBinaryKeywordMessageSequence(UnaryBinaryKeywordMessageSequenceNode node) { throw new NotImplementedException(); }
private Expression EncodeInlinedLoop(BasicExpressionNode node) { if (node.CascadeMessages != null) { return(null); } if (node.Messages == null) { return(null); } BlockNode conditionBlock = node.Primary as BlockNode; if (conditionBlock == null) { return(null); } if (conditionBlock.Arguments.Count != 0) { return(null); } UnaryBinaryKeywordMessageSequenceNode unarySeq = node.Messages as UnaryBinaryKeywordMessageSequenceNode; if (unarySeq != null) { string selector = unarySeq.Message.SelectorToken.Value; if ((selector != "whileTrue") && (selector != "whileFalse")) { return(null); } return(this.EncodeInlineWhile(conditionBlock, null, (selector == "whileFalse"))); } KeywordMessageSequenceNode keywordSeq = node.Messages as KeywordMessageSequenceNode; if (keywordSeq != null) { if (keywordSeq.Message.SelectorTokens.Count != 1) { return(null); } string selector = keywordSeq.Message.SelectorTokens[0].Value; if ((selector != "whileTrue:") && (selector != "whileFalse:")) { return(null); } if (keywordSeq.Message.Arguments.Count != 1) { return(null); } KeywordArgumentNode arg = keywordSeq.Message.Arguments[0]; if (arg.Messages != null) { return(null); } BlockNode valueBlock = arg.Primary as BlockNode; if (valueBlock == null) { return(null); } if (valueBlock.Arguments.Count != 0) { return(null); } return(this.EncodeInlineWhile(conditionBlock, valueBlock, (selector == "whileFalse:"))); } return(null); }