private void SplitBSkyFormat(string command, out string sub, out string varname, out string BSkyLeftVar)
{
/// patterns is like: "BSkyFormat(var.name <- func.name("
string pattern = @"BSkyFormat\(\s*[A-Za-z0-9_\.]+\s*(<-|=)\s*[A-Za-z0-9_\.]+\(";
int firstindex = command.IndexOf('(');
int lastindex = command.LastIndexOf(')');
sub = "";
varname = "";
BSkyLeftVar = "";
if (firstindex == -1 || lastindex == -1)//21May2014 This check is important to stop app crash.
{
return;
}
#region Finding what's passed in 'BSkyFormat(param)' as parameter.
sub = command.Substring(firstindex + 1, lastindex - firstindex - 1);
/// sub can be one of :
/// sub = df
/// sub = df <- data.frame(...)
/// sub = data.frame(...)
#endregion
#region Finding Leftvar in Leftvar <- BSkyFormat
///See if BSkyFormat is assigned to any leftvar. eg.. leftvar <- BSkyFormat(....)
int assignmentIndex, BSkyIndex;
BSkyLeftVar = "";
BSkyIndex = command.Trim().IndexOf("BSkyFormat");
assignmentIndex = command.Trim().LastIndexOf("<-", BSkyIndex);
if (assignmentIndex < 0)//arrow is not there
{
assignmentIndex = command.Trim().LastIndexOf("=", BSkyIndex);
}
if (assignmentIndex > 0)//<- or = before BSkyFormat found. ie. leftvar <- BskyFromat
{
///find 'leftvar' name now
BSkyLeftVar = command.Trim().Substring(0, assignmentIndex).Trim();
}
#endregion
#region Finding varname in BSkyFormat(varname <- data.frame(...) )
/// looking for parameter of type df <- data.frame(...)
bool str = Regex.IsMatch(command, pattern);
MatchCollection mc = Regex.Matches(command, pattern);
int asnmntindex = 0;
if (str)
{
asnmntindex = sub.IndexOf("<-");
if (asnmntindex < 0)
{
asnmntindex = sub.IndexOf('=');
}
varname = sub.Substring(0, asnmntindex);
}
else // for BSkyFormat(m) then varname = m
{
pattern = @"\s*\G[A-Za-z0-9_\.]+\s*[^\(\)\:,;=]?";
str = Regex.IsMatch(sub, pattern);
mc = Regex.Matches(sub, pattern);
if (str && mc.Count == 1 && (sub.Trim().Length == mc[0].ToString().Trim().Length))
{
varname = mc[0].ToString();
}
}
#endregion
varname = varname.Trim();//01Jul2013
return;
}