public static List<Value> ParseExpression(String expression)
{
var numbers = new List<Value>();
String qualifier = "";
String[] parts = expression.Split(' ');
Value v = null;
bool isBuildingRange = false;
bool isBuildingRangeTo = false;
bool isBuildingErrLimit = false;
bool isBuildingResolution = false;
int i = 0;
foreach (String part in parts)
{
if (0 == i++)
{
}
//Test for qualifier - resets everything
if (IsQualifier(part))
{
qualifier = part;
}
else if (IsResolution(part))
{
if (v == null)
{
v = new Value();
numbers.Add(v);
}
v.resoluion = new Value();
isBuildingResolution = true;
}
else if (IsRange(part))
{
isBuildingRange = true;
isBuildingRangeTo = false;
Console.WriteLine("Start Building Range");
if (v == null)
{
v = new Value();
numbers.Add(v);
}
v.currentRange = new Range();
v.ranges.Add(v.currentRange);
}
else if (IsTo(part) && isBuildingRange)
{
isBuildingRangeTo = true;
Console.WriteLine("Working on Range");
v.currentRange.to = new Value();
}
else if (IsErrorLimit(part))
{
if (v == null)
{
v = new Value();
numbers.Add(v);
}
isBuildingErrLimit = true;
Console.WriteLine("Start Building ErrLmt");
if (isBuildingRange)
v.currentRange.errorLimit = new ErrorLimit();
else
v.errorLimit = new ErrorLimit();
}
else
{
String val = null;
String unit = null;
String prefix = null;
String standardUnit = null;
ParseWord(part, out val, out standardUnit);
if (!String.IsNullOrEmpty(standardUnit))
ParseUnit(standardUnit, out prefix, out unit);
//--- Add To Error Limit ---//
if (isBuildingResolution)
{
if (!String.IsNullOrEmpty(val))
v.resoluion.value += val;
if (!String.IsNullOrEmpty(prefix))
v.resoluion.prefix += prefix;
if (!String.IsNullOrEmpty(unit))
{
v.resoluion.unit += unit;
v.standardUnit = standardUnit;
isBuildingResolution = false;
}
}
else if (isBuildingErrLimit)
{
if (isBuildingRange)
{
if (v.currentRange.errorLimit == null)
v.currentRange.errorLimit = new ErrorLimit();
if (!String.IsNullOrEmpty(val))
v.currentRange.errorLimit.From.value += val;
if (!String.IsNullOrEmpty(prefix))
v.currentRange.errorLimit.From.prefix += prefix;
if (!String.IsNullOrEmpty(unit))
{
v.currentRange.errorLimit.From.unit += unit;
v.currentRange.errorLimit.From.standardUnit = standardUnit;
isBuildingErrLimit = false;
}
}
else
{
if (v.errorLimit == null)
v.errorLimit = new ErrorLimit();
if (!String.IsNullOrEmpty(val))
v.errorLimit.From.value += val;
if (!String.IsNullOrEmpty(prefix))
v.errorLimit.From.prefix += prefix;
if (!String.IsNullOrEmpty(unit))
{
v.errorLimit.From.unit += unit;
v.errorLimit.From.standardUnit = standardUnit;
isBuildingErrLimit = false;
}
}
}
//--- Add To Range ---//
else if (isBuildingRange)
{
if (!isBuildingRangeTo)
{
if (!String.IsNullOrEmpty(val))
v.currentRange.from.value += val;
if (!String.IsNullOrEmpty(prefix))
v.currentRange.from.prefix += prefix;
if (!String.IsNullOrEmpty(unit))
{
v.currentRange.from.unit += unit;
v.currentRange.from.standardUnit = standardUnit;
}
}
else
{
if (!String.IsNullOrEmpty(val))
v.currentRange.to.value += val;
if (!String.IsNullOrEmpty(prefix))
v.currentRange.to.prefix += prefix;
if (!String.IsNullOrEmpty(unit))
{
v.currentRange.to.unit += unit;
v.currentRange.to.standardUnit = standardUnit;
//isBuildingRange = false;
//isBuildingRangeTo = false;
//v.currentRange = null;
}
}
}
//--- Add To Value ---//
else
{
if (!String.IsNullOrEmpty(val))
{
v = new Value();
numbers.Add(v);
v.value += val;
}
if (v != null)
{
if (!String.IsNullOrEmpty( prefix ))
{
v.prefix += prefix;
}
if (!String.IsNullOrEmpty( unit ))
{
v.unit += unit;
v.standardUnit = standardUnit;
}
}
}
}
}
if (v != null && v.errorLimit != null && v.value != null )
{
v.errorLimit.ErrorLimitOf = double.Parse(v.value);
v.errorLimit.StandardUnit = v.standardUnit;
}
Console.WriteLine("\tqualifier: " + qualifier);
foreach (Value vv in numbers)
Console.WriteLine("Value: " + vv.ToString());
return numbers;
}