Example #1
0
        protected virtual KeywordArgumentNode ParseKeywordArgument(KeywordMessageNode parent, Token token)
        {
            // PARSE: <keyword argument> ::= <primary> <unary message>* <binary message>*
            KeywordArgumentNode result = new KeywordArgumentNode(parent);

            IPrimaryNode primary = this.ParsePrimary(result, token);

            if (primary == null)
            {
                this.ReportParserError(result, SemanticErrors.MissingPrimary, token);
                return(result);
            }

            token = this.GetNextTokenxx(Preference.Default);

            BinaryOrBinaryUnaryMessageSequenceNode messages = null;

            if (token is IdentifierToken)
            {
                // <unary message>*
                messages = this.ParseUnaryBinaryMessageSequence(result, (IdentifierToken)token);
            }
            else if (token is BinarySelectorToken)
            {
                messages = this.ParseBinaryMessageSequence(result, (BinarySelectorToken)token);
            }
            else
            {
                this.ResidueToken = token;
            }

            result.SetContents(primary, messages);
            return(result);
        }
Example #2
0
        /// <summary>
        /// Visits the Keyword Message Argument node.
        /// </summary>
        /// <param name="node">The node to visit.</param>
        public virtual TResult VisitKeywordArgument(KeywordArgumentNode node)
        {
            if (node.Primary != null)
            {
                node.Primary.Accept(this);
            }

            if (node.Messages != null)
            {
                node.Messages.Accept(this);
            }

            return(default(TResult));            // The default naive implementation
        }
Example #3
0
        /// <summary>
        /// Visits the Keyword Message Argument node.
        /// </summary>
        /// <param name="node">The node to visit.</param>
        public override bool VisitKeywordArgument(KeywordArgumentNode node)
        {
            if (node.Parent == null)
            {
                return(false);
            }

            if ((node.Primary == null) || !node.Primary.Accept(this))
            {
                return(false);
            }
            if ((node.Messages != null) && !node.Messages.Accept(this))
            {
                return(false);
            }

            return(true);
        }
Example #4
0
 /// <summary>
 /// Visits the Keyword Message Argument node.
 /// </summary>
 /// <param name="node">The node to visit.</param>
 public virtual TResult VisitKeywordArgument(KeywordArgumentNode node)
 {
     throw new NotImplementedException();
 }
Example #5
0
        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);
        }