コード例 #1
0
        /// <summary>
        /// Visits the Keyword Message node.
        /// </summary>
        /// <param name="node">The node to visit.</param>
        public override bool VisitKeywordMessage(KeywordMessageNode node)
        {
            if (node.Parent == null)
            {
                return(false);
            }

            if (node.Arguments.Count < 1)
            {
                return(false);
            }
            if (node.Arguments.Count != node.SelectorTokens.Count)
            {
                return(false);
            }
            foreach (KeywordArgumentNode arg in node.Arguments)
            {
                if (!arg.Accept(this))
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #2
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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        /// <summary>
        /// Visits the Keyword Message node.
        /// </summary>
        /// <param name="node">The node to visit.</param>
        public virtual TResult VisitKeywordMessage(KeywordMessageNode node)
        {
            foreach (KeywordArgumentNode arg in node.Arguments)
            {
                arg.Accept(this);
            }

            return(default(TResult));            // The default naive implementation
        }
コード例 #5
0
        protected virtual KeywordMessageSequenceNode ParseKeywordMessageSequence(IMessageSequenceParentNode parent, KeywordToken token)
        {
            // PARSE: <keyword message>
            KeywordMessageSequenceNode result = new KeywordMessageSequenceNode(parent);

            // NB: ParseKeywordMessage() cannot fail, so we don't check result
            KeywordMessageNode message = this.ParseKeywordMessage(result, token);

            result.SetContents(message);
            return(result);
        }
コード例 #6
0
 /// <summary>
 /// Visits the Keyword Message node.
 /// </summary>
 /// <param name="node">The node to visit.</param>
 public virtual TResult VisitKeywordMessage(KeywordMessageNode node)
 {
     throw new NotImplementedException();
 }