Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }