private void AddComparison(RuleCondition ruleCondition) { switch (_currentToken.Lexicon) { case Lexicon.Object: var objectArgs = _currentToken.Value.Split('.'); ruleCondition.ComparisonTypeName = objectArgs[0]; var targetAttribute = objectArgs[1]; var methodRegex = new Regex("\\w+\\(\\)"); if (methodRegex.IsMatch(targetAttribute)) { ruleCondition.ComparisonType = RuleObject.ObjectMethod; targetAttribute = targetAttribute.Substring(0, targetAttribute.Length - 2); } else { ruleCondition.ComparisonType = RuleObject.ObjectProperty; } ruleCondition.ComparisonAttribute = targetAttribute; DiscardToken(Lexicon.Object); break; case Lexicon.String: ruleCondition.ComparisonType = RuleObject.Constant; ruleCondition.ComparisonTypeName = "string"; ruleCondition.Value = _currentToken.Value; DiscardToken(Lexicon.String); break; case Lexicon.Number: ruleCondition.ComparisonType = RuleObject.Constant; ruleCondition.ComparisonTypeName = "number"; ruleCondition.Value = _currentToken.Value; DiscardToken(Lexicon.Number); break; case Lexicon.Date: ruleCondition.ComparisonType = RuleObject.Constant; ruleCondition.ComparisonTypeName = "date"; ruleCondition.Value = _currentToken.Value; DiscardToken(Lexicon.Date); break; default: throw new ParserException( GetExpectedTokenExceptionMessage(new [] { Lexicon.Object, Lexicon.String, Lexicon.Number, Lexicon.Date }, _previousToken.Lexicon, _currentToken.Lexicon)); } }
private void AddRuleCondition(RuleDefinition ruleDefinition) { var ruleCondition = new RuleCondition(); AddComparatorOperator(ruleCondition); AddComparison(ruleCondition); AddLogicalOperator(ruleCondition); ruleDefinition.RuleConditions.Add(ruleCondition); if (ruleCondition.LogicalOperator != RuleLogicalOperator.None) { AddRuleCondition(ruleDefinition); } }
private void AddLogicalOperator(RuleCondition ruleCondition) { switch (_currentToken.Lexicon) { case Lexicon.And: ruleCondition.LogicalOperator = RuleLogicalOperator.And; DiscardToken(Lexicon.And); break; case Lexicon.Or: ruleCondition.LogicalOperator = RuleLogicalOperator.Or; DiscardToken(Lexicon.Or); break; default: ruleCondition.LogicalOperator = RuleLogicalOperator.None; break; } }
private void AddComparatorOperator(RuleCondition ruleCondition) { switch (_currentToken.Lexicon) { case Lexicon.Within: DiscardToken(Lexicon.Within); DiscardToken(Lexicon.Number); ruleCondition.Operator = RuleComparatorOperator.Within; ruleCondition.Value = _previousToken.Value; DiscardToken(Lexicon.Of); break; case Lexicon.GreaterThan: ruleCondition.Operator = RuleComparatorOperator.GreaterThan; DiscardToken(Lexicon.GreaterThan); break; case Lexicon.GreaterThanOrEqualTo: ruleCondition.Operator = RuleComparatorOperator.GreaterThanOrEqualTo; DiscardToken(Lexicon.GreaterThanOrEqualTo); break; case Lexicon.LessThan: ruleCondition.Operator = RuleComparatorOperator.LessThan; DiscardToken(Lexicon.LessThan); break; case Lexicon.LessThanOrEqualTo: ruleCondition.Operator = RuleComparatorOperator.LessThan; DiscardToken(Lexicon.LessThanOrEqualTo); break; case Lexicon.EqualTo: ruleCondition.Operator = RuleComparatorOperator.EqualTo; DiscardToken(Lexicon.EqualTo); break; } }