public Translator(ICriterionParser parser)
 {
     if (parser == null)
     {
         return;
     }
     this._parser = parser;
 }
        /// <summary>
        /// Recursively convert groups into criteria
        /// </summary>
        /// <param name="groups"></param>
        /// <returns></returns>
        private IEnumerable <ICriterion> ConvertGroupsToCriteria(IEnumerable <IGroup> groups)
        {
            IGroup previousGroup = null;
            var    criteria      = new List <ICriterion>();

            foreach (var group in groups)
            {
                if (group is CriterionGroup criterionGroup)
                {
                    ICriterion criterion = null;
                    if (group.HasNestedGroups)
                    {
                        criterion = new NestedCriterion()
                        {
                            Criteria = this.ConvertGroupsToCriteria(group.NestedGroups)
                        };
                    }
                    else
                    {
                        ICriterionParser criterionParser = null;
                        if (group.Tokens.Any(i => i is RangeToken))
                        {
                            criterionParser = new RangeCriterionParser();
                        }
                        else
                        {
                            criterionParser = new CriterionParser();
                        }
                        criterion     = criterionParser.Parse(group.Tokens);
                        criterion.Raw = group.Value;
                    }

                    // Join multiple conditions with a logical And/Or
                    if (previousGroup != null && previousGroup is LogicGroup logicGroup)
                    {
                        criterion.LogicOperator = ((LogicToken)logicGroup.Tokens[0]).Operator;
                    }

                    criteria.Add(criterion);
                }

                previousGroup = group;
            }

            return(criteria);
        }