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