Example #1
0
        public static bool Render(Node n, out string expression, CancellationToken cancel)
        {
            var data    = new PrintData();
            var success = new SuccessToken();

            Factory.Instance.ToAST(n).Compute <PrintData, bool>(
                data,
                (m, d) => Unfold(m, d, success),
                (m, v, children) => true,
                cancel);
            expression = data.Builder.ToString().Trim();
            return(success.Succeeded);
        }
Example #2
0
        private static IEnumerable <Tuple <Node, PrintData> > Unfold(Node n, PrintData d, SuccessToken success)
        {
            string     typename, tag;
            Node       type, prms;
            BigInteger dimen;
            bool       isConst, isVolatile;

            if (IsBaseType(n, out typename))
            {
                d.Builder.Insert(0, d.ModifierString + typename + " ");
                d.ClearModifiers();
                yield break;
            }
            else if (IsNamedType(n, out tag, out typename))
            {
                d.Builder.Insert(0, d.ModifierString + tag + typename + " ");
                d.ClearModifiers();
                yield break;
            }
            else if (IsQualType(n, out type, out isConst, out isVolatile))
            {
                var dnext = new PrintData(d);
                dnext.IsConstModified    |= isConst;
                dnext.IsVolatileModified |= isVolatile;
                yield return(new Tuple <Node, PrintData>(type, dnext));
            }
            else if (IsPtrType(n, out type))
            {
                d.Builder.Insert(0, d.IsModified ? "* " + d.ModifierString : "*");
                d.ClearModifiers();
                var dnext = new PrintData(d);
                dnext.WasPtrExpression = true;
                yield return(new Tuple <Node, PrintData>(type, dnext));
            }
            else if (IsArrayType(n, out type, out dimen))
            {
                if (d.IsModified)
                {
                    success.Failed();
                    yield break;
                }

                if (d.WasPtrExpression)
                {
                    if (d.Builder[d.Builder.Length - 1] == ' ')
                    {
                        d.Builder.Remove(d.Builder.Length - 1, 1);
                    }

                    d.Builder.Insert(0, "(");
                    d.Builder.Append(")");
                }

                if (dimen.Sign < 0)
                {
                    d.Builder.Append("[]");
                }
                else
                {
                    d.Builder.Append("[" + dimen.ToString() + "]");
                }

                var dnext = new PrintData(d);
                dnext.WasPtrExpression = false;
                yield return(new Tuple <Node, PrintData>(type, dnext));
            }
            else if (IsFuncType(n, out type, out prms))
            {
                if (d.IsModified)
                {
                    success.Failed();
                    yield break;
                }

                if (d.WasPtrExpression)
                {
                    if (d.Builder[d.Builder.Length - 1] == ' ')
                    {
                        d.Builder.Remove(d.Builder.Length - 1, 1);
                    }

                    d.Builder.Insert(0, "(");
                    d.Builder.Append(")");
                }

                d.Builder.Append("(");
                string prmRender;
                bool   isPrms = false, isFirst = true, isEllipse = false;
                Node   prmtype, tail;
                while ((isPrms = IsFunPrms(prms, out prmtype, out tail, out isEllipse)))
                {
                    if (isFirst)
                    {
                        isFirst = false;
                    }
                    else
                    {
                        d.Builder.Append(", ");
                    }

                    if (!Render(prmtype, out prmRender, default(CancellationToken)))
                    {
                        isPrms = false;
                        break;
                    }
                    else
                    {
                        d.Builder.Append(prmRender);
                    }

                    if (tail == null)
                    {
                        break;
                    }
                    else
                    {
                        prms = tail;
                    }
                }

                if (isEllipse)
                {
                    d.Builder.Append(", ...");
                }

                d.Builder.Append(")");
                if (!isPrms)
                {
                    success.Failed();
                    yield break;
                }

                var dnext = new PrintData(d);
                dnext.WasPtrExpression = false;
                yield return(new Tuple <Node, PrintData>(type, dnext));
            }
            else
            {
                success.Failed();
                yield break;
            }
        }