public static PatternMatchingExpression Create(
            AphidExpressionContext context_aphidExpressionContext,
            AphidExpression testExpression_aphidExpression,
            List <PatternExpression> patterns_list,
            int value_i,
            int value_i1
            )
        {
            PatternMatchingExpression patternMatchingExpression
                = new PatternMatchingExpression(context_aphidExpressionContext,
                                                testExpression_aphidExpression, patterns_list);

            ((AphidExpression)patternMatchingExpression).Index  = value_i;
            ((AphidExpression)patternMatchingExpression).Length = value_i1;
            return(patternMatchingExpression);

            // TODO: Edit factory method of PatternMatchingExpression
            // This method should be able to configure the object in all possible ways.
            // Add as many parameters as needed,
            // and assign their values to each field by using the API.
        }
Example #2
0
        public Expression ParseFactor()
        {
            Expression exp;

            switch (_currentToken.TokenType)
            {
            case AphidTokenType.LeftBrace:
                exp = ParseObjectExpression();
                break;

            case AphidTokenType.LeftBracket:
                exp = ParseArrayExpression();
                break;

            case AphidTokenType.LeftParenthesis:
                NextToken();
                exp = ParseExpression();
                Match(AphidTokenType.RightParenthesis);
                break;

            case AphidTokenType.String:
                exp = ParseStringExpression();
                break;

            case AphidTokenType.Number:
                exp = ParseNumberExpression();
                break;

            case AphidTokenType.MinusOperator:
                NextToken();
                var numExp = ParseNumberExpression();
                numExp.Value *= -1;
                exp           = numExp;
                break;

            case AphidTokenType.Identifier:
                exp = ParseIdentifierExpression();

                if (_currentToken.TokenType == AphidTokenType.definedKeyword)
                {
                    NextToken();
                    exp = new UnaryOperatorExpression(AphidTokenType.definedKeyword, exp)
                    {
                        IsPostfix = true
                    };
                }

                break;

            case AphidTokenType.functionOperator:
                exp = ParseFunctionExpression();
                break;

            //case AphidTokenType.forKeyword:
            //    exp = ParseForExpression();
            //    break;

            case AphidTokenType.retKeyword:
            case AphidTokenType.deleteKeyword:
                exp = ParseUnaryExpression();
                break;

            case AphidTokenType.trueKeyword:
                exp = new BooleanExpression(true);
                NextToken();
                break;

            case AphidTokenType.falseKeyword:
                exp = new BooleanExpression(false);
                NextToken();
                break;

            case AphidTokenType.thisKeyword:
                exp = new ThisExpression();
                NextToken();
                break;

            //case AphidTokenType.extendKeyword:
            //    exp = ParseExtendExpression();
            //    break;

            //case AphidTokenType.ifKeyword:
            //    exp = ParseIfExpression();
            //    break;

            case AphidTokenType.LoadScriptOperator:
                exp = ParseLoadScriptExpression();
                break;

            case AphidTokenType.LoadLibraryOperator:
                exp = ParseLoadLibraryExpression();
                break;

            case AphidTokenType.nullKeyword:
                exp = new NullExpression();
                NextToken();
                break;

            case AphidTokenType.breakKeyword:
                exp = new BreakExpression();
                NextToken();
                break;

            case AphidTokenType.HexNumber:
                exp = new NumberExpression((decimal)Convert.ToInt64(_currentToken.Lexeme.Substring(2), 16));
                NextToken();
                break;

            case AphidTokenType.PatternMatchingOperator:
                var matchExp = new PatternMatchingExpression();
                NextToken();
                Match(AphidTokenType.LeftParenthesis);
                matchExp.TestExpression = ParseExpression();
                Match(AphidTokenType.RightParenthesis);

                while (true)
                {
                    var tests = new List <Expression>();

                    while (true)
                    {
                        tests.Add(ParseExpression());

                        if (_currentToken.TokenType == AphidTokenType.Comma)
                        {
                            NextToken();
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (_currentToken.TokenType == AphidTokenType.ColonOperator)
                    {
                        NextToken();

                        var b = ParseExpression();

                        foreach (var t in tests)
                        {
                            matchExp.Patterns.Add(new Tuple <Expression, Expression>(t, b));
                        }
                    }
                    else
                    {
                        matchExp.Patterns.Add(new Tuple <Expression, Expression>(null, tests[0]));
                    }

                    if (_currentToken.TokenType == AphidTokenType.Comma)
                    {
                        NextToken();
                    }
                    else
                    {
                        break;
                    }
                }

                exp = matchExp;
                break;

            default:
                throw new AphidParserException(_currentToken);
            }

            return(exp);
        }
Example #3
0
        public Expression ParseFactor()
        {
            Expression exp;
            switch (_currentToken.TokenType)
            {
                case AphidTokenType.LeftBrace:
                    exp = ParseObjectExpression();
                    break;

                case AphidTokenType.LeftBracket:
                    exp = ParseArrayExpression();
                    break;

                case AphidTokenType.LeftParenthesis:
                    NextToken();
                    exp = ParseExpression();
                    Match(AphidTokenType.RightParenthesis);
                    break;

                case AphidTokenType.String:
                    exp = ParseStringExpression();
                    break;

                case AphidTokenType.Number:
                    exp = ParseNumberExpression();
                    break;

                case AphidTokenType.Identifier:
                    exp = ParseIdentifierExpression();
                    break;

                case AphidTokenType.functionOperator:
                    exp = ParseFunctionExpression();
                    break;

                case AphidTokenType.forKeyword:
                    exp = ParseForExpression();
                    break;

                case AphidTokenType.retKeyword:
                    exp = ParseReturnExpression();
                    break;

                case AphidTokenType.trueKeyword:
                    exp = new BooleanExpression(true);
                    NextToken();
                    break;

                case AphidTokenType.falseKeyword:
                    exp = new BooleanExpression(false);
                    NextToken();
                    break;

                case AphidTokenType.thisKeyword:
                    exp = new ThisExpression();
                    NextToken();
                    break;

                case AphidTokenType.ifKeyword:
                    exp = ParseIfExpression();
                    break;

                case AphidTokenType.LoadScriptOperator:
                    exp = ParseLoadScriptExpression();
                    break;

                case AphidTokenType.LoadLibraryOperator:
                    exp = ParseLoadLibraryExpression();
                    break;

                case AphidTokenType.nullKeyword:
                    exp = new NullExpression();
                    NextToken();
                    break;

                case AphidTokenType.breakKeyword:
                    exp = new BreakExpression();
                    NextToken();
                    break;

                case AphidTokenType.HexNumber:
                    exp = new NumberExpression((decimal)Convert.ToInt64(_currentToken.Lexeme.Substring(2), 16));
                    NextToken();
                    break;

                case AphidTokenType.PatternMatchingOperator:
                    var matchExp = new PatternMatchingExpression();
                    NextToken();
                    Match(AphidTokenType.LeftParenthesis);
                    matchExp.TestExpression = ParseExpression();
                    Match(AphidTokenType.RightParenthesis);

                    while (true)
                    {
                        var tests = new List<Expression>();

                        while (true)
                        {
                            tests.Add(ParseExpression());

                            if (_currentToken.TokenType == AphidTokenType.Comma)
                            {
                                NextToken();
                            }
                            else
                            {
                                break;
                            }
                        }

                        if (_currentToken.TokenType == AphidTokenType.ColonOperator)
                        {
                            NextToken();

                            var b = ParseExpression();

                            foreach (var t in tests)
                            {
                                matchExp.Patterns.Add(new Tuple<Expression, Expression>(t, b));
                            }
                        }
                        else
                        {
                            matchExp.Patterns.Add(new Tuple<Expression,Expression>(null, tests[0]));
                        }

                        if (_currentToken.TokenType == AphidTokenType.Comma)
                        {
                            NextToken();
                        }
                        else
                        {
                            break;
                        }
                    }

                    exp = matchExp;
                    break;

                default:
                    throw new AphidParserException(_currentToken);
            }

            return exp;
        }
Example #4
0
        private AphidObject InterpretPatternMatchingExpression(PatternMatchingExpression expression)
        {
            var left = (AphidObject)InterpretExpression(expression.TestExpression);

            foreach (var pattern in expression.Patterns)
            {
                if (pattern.Patterns != null)
                {
                    foreach (var patternTest in pattern.Patterns)
                    {
                        var right = (AphidObject)InterpretExpression(patternTest);

                        var b = left.Value != null ?
                            left.Value.Equals(right.Value) :
                            (null == right.Value && left.Count == 0 && right.Count == 0);

                        if (b)
                        {
                            return ValueHelper.Wrap(InterpretExpression(pattern.Value));
                        }
                    }
                }
                else
                {
                    return ValueHelper.Wrap(InterpretExpression(pattern.Value));
                }
            }

            return new AphidObject();
        }