static Expression CompileBinaryExpression(Ast.BinaryExpression expr, Expression Context) { var left = CompileSingleExpression(expr.Left, Context); var right = CompileSingleExpression(expr.Right, Context); switch (expr.Operation) { case BinaryOp.Addition: return(Expression.Add(left, right)); case BinaryOp.And: return(Expression.And(left, right)); case BinaryOp.Concat: return(Expression.Call(LuaEvents_concat, left, right)); case BinaryOp.Different: return(Expression.Not(Expression.Call(LuaEvents_eq, left, right))); case BinaryOp.Division: return(Expression.Divide(left, right)); case BinaryOp.Equal: return(Expression.Call(LuaEvents_eq, left, right)); case BinaryOp.GreaterOrEqual: return(Expression.GreaterThanOrEqual(left, right)); case BinaryOp.GreaterThan: return(Expression.GreaterThan(left, right)); case BinaryOp.LessOrEqual: return(Expression.LessThanOrEqual(left, right)); case BinaryOp.LessThan: return(Expression.LessThan(left, right)); case BinaryOp.Modulo: return(Expression.Modulo(left, right)); case BinaryOp.Multiplication: return(Expression.Multiply(left, right)); case BinaryOp.Or: return(Expression.Or(left, right)); case BinaryOp.Power: return(Expression.ExclusiveOr(left, right)); case BinaryOp.Subtraction: return(Expression.Subtract(left, right)); default: throw new NotImplementedException(); } }
public string iterateBinOp(BinaryExpression bb, string name, List<string> Lines) { var line = ""; string a = ""; string b = ""; if (bb.Left is BinaryExpression) { a = name + "_opt_" + optc; optc++; //Lines.Add("/scoreboard objectives remove " + a); Lines.Add("/scoreboard objectives add " + a + " dummy"); var ln = iterateBinOp(bb.Left as BinaryExpression, a , Lines); Lines.Add("/scoreboard players operation lua " + a + " " + "+=" + " lua " + ln); } else { if(char.IsDigit(TypeToString(bb.Left)[0])) { //and new var //Lines.Add("/scoreboard objectives remove con_" + ConstantCount); Lines.Add("/scoreboard objectives add con_" + ConstantCount + " dummy"); Lines.Add("/scoreboard players set lua con_" + ConstantCount + " " + TypeToString(bb.Left)); a = "con_" + ConstantCount; ConstantCount++; } else { a = TypeToString(bb.Left); } } if (bb.Right is BinaryExpression) { b = name + "_opt_" + optc; optc++; // Lines.Add("/scoreboard objectives remove " + b); Lines.Add("/scoreboard objectives add " + b + " dummy"); var ln = iterateBinOp(bb.Right as BinaryExpression, b, Lines); Lines.Add("/scoreboard players operation lua " + b + " " + "+=" + " lua " + ln); } else { if (char.IsDigit(TypeToString(bb.Right)[0])) { //and new var // Lines.Add("/scoreboard objectives remove con_" + ConstantCount); Lines.Add("/scoreboard objectives add con_" + ConstantCount + " dummy"); Lines.Add("/scoreboard players set lua con_" + ConstantCount + " " + TypeToString(bb.Right)); b = "con_" + ConstantCount; ConstantCount++; } else { b = TypeToString(bb.Right); } } Lines.Add("/scoreboard players operation lua " + a + " " + BuildBOp(bb.Operation) + " lua " + b ); line = a; return line; }