Ver código fonte

Use DIV for integers, forbid /

Vladislav Folts 12 anos atrás
pai
commit
e037ff44fb

+ 8 - 2
src/context.js

@@ -609,8 +609,14 @@ exports.MulOperator = ChainedContext.extend({
         var o;
         if (s == "*")
             o = (type == basicTypes.set) ? op.setIntersection : op.mul;
-        else if (s == "/")
-            o = (type == basicTypes.set) ? op.setSymmetricDiff : op.divFloat;
+        else if (s == "/"){
+            if (type == basicTypes.set)
+                o = op.setSymmetricDiff;
+            else if (type == basicTypes.int)
+                throw new Errors.Error("operator DIV expected for integer division");
+            else
+                o = op.divFloat;
+        }
         else if (s == "DIV")
             o = op.div;
         else if (s == "MOD")

+ 3 - 3
src/operator.js

@@ -52,10 +52,10 @@ var operators = {
     sub: makeBinary(function(x, y){return x - y;}, " - ", precedence.addSub),
     mul: makeBinary(function(x, y){return x * y;}, " * ", precedence.mulDivMod),
     div: makeBinary(
-            function(x, y){return (x / y) >> 0;},
-            function(x, y){return x + " / " + y + " >> 0";},
+            function(x, y){return (x / y) | 0;},
+            function(x, y){return x + " / " + y + " | 0";},
             precedence.mulDivMod,
-            precedence.shift),
+            precedence.bitOr),
     divFloat:   makeBinary(function(x, y){return x / y;}, " / ", precedence.mulDivMod),
     mod:        makeBinary(function(x, y){return x % y;}, " % ", precedence.mulDivMod),
     setUnion:   makeBinary(function(x, y){return x | y;}, " | ", precedence.bitOr),

+ 1 - 1
test/expected/arithmetic.js

@@ -6,7 +6,7 @@ i2 = 2;
 i1 = i1 + i2;
 i1 = i1 - i2;
 i1 = i1 * i2;
-i1 = i1 / i2 >> 0;
+i1 = i1 / i2 | 0;
 i1 = i1 % i2;
 r1 = 1;
 r2 = 2;

+ 2 - 2
test/expected/blur.js

@@ -37,14 +37,14 @@ function Blur2DArray(){
 			for (y = 1; y <= H - 2; ++y){
 				for (x = 1; x <= W - 2; ++x){
 					for (color = 0; color <= 2; ++color){
-						b[x * 3 + color][y] = (a[x * 3 + color][y + 1] + a[x * 3 + color][y - 1] + a[(x - 1) * 3][y] + a[(x + 1) * 3][y]) / 4 >> 0;
+						b[x * 3 + color][y] = (a[x * 3 + color][y + 1] + a[x * 3 + color][y - 1] + a[(x - 1) * 3][y] + a[(x + 1) * 3][y]) / 4 | 0;
 					}
 				}
 			}
 			for (y = 1; y <= H - 2; ++y){
 				for (x = 1; x <= W - 2; ++x){
 					for (color = 0; color <= 2; ++color){
-						a[x * 3 + color][y] = (b[x * 3 + color][y + 1] + b[x * 3 + color][y - 1] + b[(x - 1) * 3][y] + b[(x + 1) * 3][y]) / 4 >> 0;
+						a[x * 3 + color][y] = (b[x * 3 + color][y + 1] + b[x * 3 + color][y - 1] + b[(x - 1) * 3][y] + b[(x + 1) * 3][y]) / 4 | 0;
 					}
 				}
 			}

+ 3 - 3
test/expected/parentheses.js

@@ -32,15 +32,15 @@ var s = 0;
 var a = RTL$.makeArray(10, 0);
 i = 65;
 ch = i;
-i = (ch + i) / 2;
+i = (ch + i) / 2 | 0;
 RTL$.assert(i == 65);
 a[(i - 64) * 3] = i;
 i = i + (i - 1);
 i = i - i + 1;
 i = i * i + 1;
 i = i * (i + 1);
-i = (i / 2 >> 0) + 1;
-i = i / (2 + 1) >> 0;
+i = (i / 2 | 0) + 1;
+i = i / (2 + 1) | 0;
 r = r / 2 + 1;
 r = r / (2 + 1);
 i = i % 2 + 1;

+ 1 - 1
test/expected/var_parameter.js

@@ -67,7 +67,7 @@ function p3(i/*VAR INTEGER*/, b/*VAR BOOLEAN*/){
 	var ai = RTL$.makeArray(5, 0);
 	j = i.get() + 1;
 	j = 2 * i.get();
-	j = i.get() / 2;
+	j = i.get() / 2 | 0;
 	j = -i.get();
 	b.set(!b.get());
 	a[i.get()] = i.get();

+ 1 - 1
test/input/parentheses.ob

@@ -5,7 +5,7 @@ VAR ch: CHAR; i: INTEGER; b: BOOLEAN; r: REAL; s: SET; a: ARRAY 10 OF INTEGER;
 BEGIN
     i := 65;
     ch := CHR(i);
-	i := (ORD(ch) + i) / 2;
+	i := (ORD(ch) + i) DIV 2;
     ASSERT(i = 65);
 
 	a[(i - 64) * 3] := i;

+ 1 - 1
test/input/var_parameter.ob

@@ -32,7 +32,7 @@ VAR j: INTEGER;
 BEGIN
 	j := i + 1;
 	j := 2 * i;
-	j := i / 2;
+	j := i DIV 2;
 	j := -i;
 	b := ~b;
 	a[i] := i;

+ 1 - 0
test/test_unit.js

@@ -567,6 +567,7 @@ identifier: function(){
 	test.parse("i1 := i1 * i2");
 	test.parse("i1 := i1 DIV i2");
 	test.parse("i1 := i1 MOD i2");
+	test.expectError("i1 := i1 / i2", "operator DIV expected for integer division");
 	test.parse("r1 := r1 + r2");
 	test.parse("r1 := r1 - r2");
 	test.parse("r1 := r1 * r2");