Requirement is to convert Prefix operators like AND(a,b)
, OR(a,b)
or NOT(a)
to infix, like this: (a && b)
, (a || b)
, (!(a))
I've written below code, but it works if the expression isn't too complicated. I was able to convert:
AND(OR(1<2, OR(3<4, 1<2, FUNC(5<6, 2<3))), 2<3)
to
(((1<2 || ((3<4 || (1<2 || FUNC(5<6, 2<3))))))&& 2<3))
except those extra brackets, this expression is acceptable. But when I run this code for expression a little complicated, that have too many functions and brackets within it either fails or returns the expression as is. For example this expr:
AND(OR((NOT(A != null)), OR(FUNC(3<4, 1==1), 1<2, FUNC(5<6, 2<3))), 2<3)
It should ignore other functions apart from And/Or/Not. For example FUNC(5<6, 2<3)
should be output as FUNC(5<6, 2<3)
as I mentioned in the above example.
Code:
public String ConvertToJS(String sExpr, String Operator)
{
//String subExpr[] = sExpr.split(",");
sExpr = sExpr.trim();
String resolved = "";
String resolved2 = "";
if(sExpr.indexOf(",") != -1 || sExpr.indexOf("(") != -1)
{
if((sExpr.indexOf(",") != -1 && sExpr.indexOf("(") != -1 && sExpr.indexOf(",") < sExpr.indexOf("(")) || sExpr.indexOf("(") == -1)
{
if(sExpr.indexOf(",") > 0)
{
if("AND".equalsIgnoreCase(Operator))
return "(" + sExpr.substring(0, sExpr.indexOf(",")) + " && " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else if("OR".equalsIgnoreCase(Operator))
return "(" + sExpr.substring(0, sExpr.indexOf(",")) + " || " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else
return sExpr;
}
else
{
if("AND".equalsIgnoreCase(Operator))
return " && " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else if("OR".equalsIgnoreCase(Operator))
return " || " + ConvertToJS(sExpr.substring(sExpr.indexOf(",")+1, sExpr.length()), Operator) + ")";
else
return sExpr;
}
}
else
{
if(sExpr.indexOf("(") < 2)
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else if(sExpr.indexOf("(") == 2)
{
if(sExpr.substring(0, sExpr.indexOf("(")).equalsIgnoreCase("OR"))
{
resolved = "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "OR") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
}
else if(sExpr.indexOf("(") == 3)
{
if(sExpr.substring(0, sExpr.indexOf("(")).equalsIgnoreCase("AND"))
{
resolved = "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "AND") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else if(sExpr.substring(0, sExpr.indexOf("(")).equalsIgnoreCase("NOT"))
{
resolved = "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "NOT") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
else
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
}
else
{
resolved = sExpr.substring(0, sExpr.indexOf("(")) + "(" + ConvertToJS(sExpr.substring(sExpr.indexOf("(")+1, sExpr.lastIndexOf(")")), "") + ")";
if(sExpr.lastIndexOf(")")< sExpr.length()-1)
resolved += ConvertToJS(sExpr.substring(sExpr.lastIndexOf(")") + 1), Operator);
return resolved;
}
}
}
else
{
if("NOT".equalsIgnoreCase(Operator))
return " !(" + sExpr + ") ";
else
return sExpr;
}
}