コード例 #1
0
ファイル: Parser.cs プロジェクト: vladimirmmm/Kraken
        public Expression ParseHierarchy(Expression parentexpression, BaseModel.Hier <string> exprstringtree)
        {
            if (parentexpression == null)
            {
                //parentexpression = ParseExpressionString(exprstringtree.Item);
            }
            var expr = ParseExpressionString(exprstringtree.Item);

            var ix = 0;

            foreach (var item in exprstringtree.HChildren)
            {
                var subexpr         = ParseHierarchy(parentexpression, item);
                var exprplaceholder = expr.GetExpressionForPlaceHolder(ix);
                if (exprplaceholder != null)
                {
                    exprplaceholder.SubExpressions.Add(subexpr);
                }
                else
                {
                }
                //expr.SubExpressions.Add(subexpr);
                ix++;
            }
            //parentexpression.SubExpressions.Add(expr);
            return(expr);
        }
コード例 #2
0
ファイル: Parser.cs プロジェクト: vladimirmmm/Kraken
 public void PutbackStrings(BaseModel.Hier <String> h, Dictionary <string, string> d)
 {
     foreach (var ditem in d)
     {
         h.Item = h.Item.Replace(ditem.Key, ditem.Value);
     }
     foreach (var ch in h.HChildren)
     {
         PutbackStrings(ch, d);
     }
 }
コード例 #3
0
ファイル: Parser.cs プロジェクト: vladimirmmm/Kraken
        public virtual BaseModel.Hier <String> GetTreeString(string expression)
        {
            expression = Utilities.Strings.HtmlDecode(expression);
            var thenelses = Utilities.Strings.TextsBetween(expression, Syntax.Then, Syntax.Else);

            foreach (var thenelse in thenelses)
            {
                var part = thenelse.Trim();
                if (!part.StartsWith(Syntax.ExpressionContainer_Left))
                {
                    part       = Syntax.ExpressionContainer_Left + part + Syntax.ExpressionContainer_Right;
                    expression = expression.Replace(Syntax.Then + thenelse + Syntax.Else, Syntax.Then + part + Syntax.Else);
                }
            }
            var item = new BaseModel.Hier <String>();
            var leftexprcontainercount  = 0;
            var rightexprcontainercount = 0;
            var leftcontainerix         = -1;
            var subexpressions          = new List <string>();

            var strings          = Utilities.Strings.TextsBetween(expression, Literals.Quote, Literals.Quote);
            var stringdictionary = new Dictionary <string, string>();
            var c = 0;

            foreach (var str in strings)
            {
                var key   = String.Format(Literals.PlaceholderFormat, c);
                var value = Literals.Quote + str + Literals.Quote;
                expression = expression.Replace(value, key);
                stringdictionary.Add(key, value);
                c++;
            }
            for (int i = 0; i < expression.Length; i++)
            {
                var character = expression[i].ToString();

                if (character == Syntax.ExpressionContainer_Left)
                {
                    leftexprcontainercount++;
                    if (leftcontainerix == -1)
                    {
                        leftcontainerix = i;
                    }
                }
                if (character == Syntax.ExpressionContainer_Right)
                {
                    rightexprcontainercount++;
                }
                if (rightexprcontainercount > leftexprcontainercount)
                {
                    throw new Exception("InvalidExpression");
                }
                if (leftexprcontainercount > 0 && leftexprcontainercount == rightexprcontainercount)
                {
                    var ix1           = leftcontainerix + 1;
                    var ix2           = i - ix1;
                    var subexpression = expression.Substring(ix1, ix2);
                    if (!String.IsNullOrEmpty(subexpression.Trim()))
                    {
                        var parameter = Syntax.ExpressionPlaceholder + subexpressions.Count;
                        subexpressions.Add(subexpression);

                        expression              = expression.Remove(ix1, ix2);
                        expression              = expression.Insert(ix1, parameter);
                        i                       = leftcontainerix + parameter.Length + 1;
                        leftexprcontainercount  = 0;
                        rightexprcontainercount = 0;
                        leftcontainerix         = -1;
                        var subtree = GetTreeString(subexpression);
                        item.AddChildren(subtree);
                    }
                    //item.Children.Add(subtree);
                }
            }

            //foreach (var ditem in stringdictionary)
            //{
            //    foreach (var ch in item.HChildren)
            //    {
            //        ch.Item = ch.Item.Replace(ditem.Key, ditem.Value);
            //    }
            //}
            item.Item = expression;
            PutbackStrings(item, stringdictionary);

            return(item);
        }