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. }
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); }
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; }
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(); }