String EvalExpr::TermStr(CParser& p, int numDigits) { if(p.IsId()) { String strId = p.ReadId(); if(functions.Find(strId) >= 0) { p.PassChar('('); String x = ExpStr(p, numDigits); p.PassChar(')'); return strId + "(" + x + ")"; } if (noCase) strId = ToUpper(strId); if (IsNull(numDigits)) { if (constants.Find(strId) < 0) variables.GetAdd(strId, 0); return strId; } else { if (constants.Find(strId) >= 0) return strId; else { double dat = variables.GetAdd(strId, 0); return FormatDoubleFix(dat, numDigits); } } } if(p.Char('(')) { String x = ExpStr(p, numDigits); p.PassChar(')'); return "(" + x + ")"; } return FormatDoubleFix(p.ReadDouble(), IsNull(numDigits) ? 3 : numDigits); }
void Pdb::ExpandTreeType(int parent, CParser& p) { for(;;) { String id; if(p.Char('*')) id = "*"; if(p.IsId()) id << p.ReadId(); else break; for(;;) if(p.Char('<')) id << '<'; else if(p.Char('>')) id << '>'; else if(p.Char(',')) id << ','; else if(p.IsInt()) id << AsString(p.ReadInt()); else if(p.IsString()) id << '\"' << AsCString(p.ReadString()) << '\"'; else if(p.IsId()) id << p.ReadId(); else break; int n = tree.GetChildCount(parent); for(int i = 0; i < n; i++) { int child = tree.GetChild(parent, i); const NamedVal& nv = ValueTo<NamedVal>(tree.Get(child)); if(nv.name == id) { tree.Open(child); if(p.Char('{')) { ExpandTreeType(child, p); p.PassChar('}'); } break; } } p.Char(';'); } }
double EvalExpr::Term(CParser& p) { if(p.IsId()) { String strId = p.ReadId(); if(double (*function)(double) = functions.Get(strId, 0)) { p.PassChar('('); double x = Exp(p); p.PassChar(')'); return function(x); } if (noCase) strId = ToUpper(strId); double ret = constants.Get(strId, Null); if (IsNull(ret)) ret = variables.GetAdd(strId, 0); return ret; } else if(p.Char('(')) { double x = Exp(p); p.PassChar(')'); return x; } else return p.ReadDouble(); }