From 2cf7443b91f3638e18a39f7fbc9f0e7dc74fd41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Barzowski?= Date: Tue, 19 Sep 2017 13:50:08 -0400 Subject: [PATCH] Add support for % operator --- builtins.go | 2 +- testdata/percent_bad.golden | 1 + testdata/percent_bad.input | 1 + testdata/percent_bad2.golden | 1 + testdata/percent_bad2.input | 1 + testdata/percent_bad3.golden | 1 + testdata/percent_bad3.input | 1 + testdata/percent_format_str.golden | 1 + testdata/percent_format_str.input | 1 + testdata/percent_format_str2.golden | 1 + testdata/percent_format_str2.input | 1 + testdata/percent_format_str3.golden | 1 + testdata/percent_format_str3.input | 1 + testdata/percent_format_str4.golden | 1 + testdata/percent_format_str4.input | 1 + testdata/percent_format_str5.golden | 1 + testdata/percent_format_str5.input | 1 + testdata/percent_format_str6.golden | 1 + testdata/percent_format_str6.input | 1 + testdata/percent_format_str7.golden | 1 + testdata/percent_format_str7.input | 1 + testdata/percent_format_str8.golden | 1 + testdata/percent_format_str8.input | 1 + testdata/percent_mod_int.golden | 1 + testdata/percent_mod_int.input | 1 + testdata/percent_mod_int2.golden | 1 + testdata/percent_mod_int2.input | 1 + testdata/percent_mod_int3.golden | 1 + testdata/percent_mod_int3.input | 1 + testdata/percent_mod_int4.golden | 1 + testdata/percent_mod_int4.input | 1 + testdata/percent_mod_int5.golden | 1 + testdata/percent_mod_int5.input | 1 + testdata/percent_mod_int6.golden | 1 + testdata/percent_mod_int6.input | 1 + testdata/std.mod_int.golden | 1 + testdata/std.mod_int.input | 1 + testdata/std.mod_string.golden | 1 + testdata/std.mod_string.input | 1 + 39 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 testdata/percent_bad.golden create mode 100644 testdata/percent_bad.input create mode 100644 testdata/percent_bad2.golden create mode 100644 testdata/percent_bad2.input create mode 100644 testdata/percent_bad3.golden create mode 100644 testdata/percent_bad3.input create mode 100644 testdata/percent_format_str.golden create mode 100644 testdata/percent_format_str.input create mode 100644 testdata/percent_format_str2.golden create mode 100644 testdata/percent_format_str2.input create mode 100644 testdata/percent_format_str3.golden create mode 100644 testdata/percent_format_str3.input create mode 100644 testdata/percent_format_str4.golden create mode 100644 testdata/percent_format_str4.input create mode 100644 testdata/percent_format_str5.golden create mode 100644 testdata/percent_format_str5.input create mode 100644 testdata/percent_format_str6.golden create mode 100644 testdata/percent_format_str6.input create mode 100644 testdata/percent_format_str7.golden create mode 100644 testdata/percent_format_str7.input create mode 100644 testdata/percent_format_str8.golden create mode 100644 testdata/percent_format_str8.input create mode 100644 testdata/percent_mod_int.golden create mode 100644 testdata/percent_mod_int.input create mode 100644 testdata/percent_mod_int2.golden create mode 100644 testdata/percent_mod_int2.input create mode 100644 testdata/percent_mod_int3.golden create mode 100644 testdata/percent_mod_int3.input create mode 100644 testdata/percent_mod_int4.golden create mode 100644 testdata/percent_mod_int4.input create mode 100644 testdata/percent_mod_int5.golden create mode 100644 testdata/percent_mod_int5.input create mode 100644 testdata/percent_mod_int6.golden create mode 100644 testdata/percent_mod_int6.input create mode 100644 testdata/std.mod_int.golden create mode 100644 testdata/std.mod_int.input create mode 100644 testdata/std.mod_string.golden create mode 100644 testdata/std.mod_string.input diff --git a/builtins.go b/builtins.go index 7065d05..bae54fc 100644 --- a/builtins.go +++ b/builtins.go @@ -592,7 +592,7 @@ func todoFunc(e *evaluator, x, y potentialValue) (value, error) { var todo = &BinaryBuiltin{function: todoFunc, parameters: ast.Identifiers{"x", "y"}} var desugaredBop = map[ast.BinaryOp]ast.Identifier{ - //bopPercent, + ast.BopPercent: "mod", ast.BopManifestEqual: "equals", ast.BopManifestUnequal: "notEquals", // Special case } diff --git a/testdata/percent_bad.golden b/testdata/percent_bad.golden new file mode 100644 index 0000000..9aa2829 --- /dev/null +++ b/testdata/percent_bad.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Operator % cannot be used on types number and string. diff --git a/testdata/percent_bad.input b/testdata/percent_bad.input new file mode 100644 index 0000000..84a1dde --- /dev/null +++ b/testdata/percent_bad.input @@ -0,0 +1 @@ +42 % "x" diff --git a/testdata/percent_bad2.golden b/testdata/percent_bad2.golden new file mode 100644 index 0000000..ff20313 --- /dev/null +++ b/testdata/percent_bad2.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Too many values to format: 1, expected 0 diff --git a/testdata/percent_bad2.input b/testdata/percent_bad2.input new file mode 100644 index 0000000..2204832 --- /dev/null +++ b/testdata/percent_bad2.input @@ -0,0 +1 @@ +"x" % 42 diff --git a/testdata/percent_bad3.golden b/testdata/percent_bad3.golden new file mode 100644 index 0000000..4d46db2 --- /dev/null +++ b/testdata/percent_bad3.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Operator % cannot be used on types function and number. diff --git a/testdata/percent_bad3.input b/testdata/percent_bad3.input new file mode 100644 index 0000000..624aa10 --- /dev/null +++ b/testdata/percent_bad3.input @@ -0,0 +1 @@ +(function(x) x) % 42 diff --git a/testdata/percent_format_str.golden b/testdata/percent_format_str.golden new file mode 100644 index 0000000..f72ec60 --- /dev/null +++ b/testdata/percent_format_str.golden @@ -0,0 +1 @@ +"x y" diff --git a/testdata/percent_format_str.input b/testdata/percent_format_str.input new file mode 100644 index 0000000..1d9e658 --- /dev/null +++ b/testdata/percent_format_str.input @@ -0,0 +1 @@ +"x %s" % ["y"] diff --git a/testdata/percent_format_str2.golden b/testdata/percent_format_str2.golden new file mode 100644 index 0000000..f72ec60 --- /dev/null +++ b/testdata/percent_format_str2.golden @@ -0,0 +1 @@ +"x y" diff --git a/testdata/percent_format_str2.input b/testdata/percent_format_str2.input new file mode 100644 index 0000000..2b523de --- /dev/null +++ b/testdata/percent_format_str2.input @@ -0,0 +1 @@ +"x %s" % "y" diff --git a/testdata/percent_format_str3.golden b/testdata/percent_format_str3.golden new file mode 100644 index 0000000..b973f01 --- /dev/null +++ b/testdata/percent_format_str3.golden @@ -0,0 +1 @@ +"x y z" diff --git a/testdata/percent_format_str3.input b/testdata/percent_format_str3.input new file mode 100644 index 0000000..cf2614a --- /dev/null +++ b/testdata/percent_format_str3.input @@ -0,0 +1 @@ +"x %s %s" % ["y", "z"] diff --git a/testdata/percent_format_str4.golden b/testdata/percent_format_str4.golden new file mode 100644 index 0000000..ed9364b --- /dev/null +++ b/testdata/percent_format_str4.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Too many values to format: 2, expected 1 diff --git a/testdata/percent_format_str4.input b/testdata/percent_format_str4.input new file mode 100644 index 0000000..9c4d9e4 --- /dev/null +++ b/testdata/percent_format_str4.input @@ -0,0 +1 @@ +"x %s" % ["y", "z"] diff --git a/testdata/percent_format_str5.golden b/testdata/percent_format_str5.golden new file mode 100644 index 0000000..edf3953 --- /dev/null +++ b/testdata/percent_format_str5.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Not enough values to format, got 1 diff --git a/testdata/percent_format_str5.input b/testdata/percent_format_str5.input new file mode 100644 index 0000000..104f7fa --- /dev/null +++ b/testdata/percent_format_str5.input @@ -0,0 +1 @@ +"x %s %s" % ["y"] diff --git a/testdata/percent_format_str6.golden b/testdata/percent_format_str6.golden new file mode 100644 index 0000000..edf3953 --- /dev/null +++ b/testdata/percent_format_str6.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Not enough values to format, got 1 diff --git a/testdata/percent_format_str6.input b/testdata/percent_format_str6.input new file mode 100644 index 0000000..35b065d --- /dev/null +++ b/testdata/percent_format_str6.input @@ -0,0 +1 @@ +"x %s %s" % "y" diff --git a/testdata/percent_format_str7.golden b/testdata/percent_format_str7.golden new file mode 100644 index 0000000..b348175 --- /dev/null +++ b/testdata/percent_format_str7.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Format required number at 0, got string diff --git a/testdata/percent_format_str7.input b/testdata/percent_format_str7.input new file mode 100644 index 0000000..f6d0ae2 --- /dev/null +++ b/testdata/percent_format_str7.input @@ -0,0 +1 @@ +"x %d" % ["y"] diff --git a/testdata/percent_format_str8.golden b/testdata/percent_format_str8.golden new file mode 100644 index 0000000..b973f01 --- /dev/null +++ b/testdata/percent_format_str8.golden @@ -0,0 +1 @@ +"x y z" diff --git a/testdata/percent_format_str8.input b/testdata/percent_format_str8.input new file mode 100644 index 0000000..5eb21f9 --- /dev/null +++ b/testdata/percent_format_str8.input @@ -0,0 +1 @@ +"x %(a)s %(b)s" % {a: "y", b: "z"} diff --git a/testdata/percent_mod_int.golden b/testdata/percent_mod_int.golden new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/testdata/percent_mod_int.golden @@ -0,0 +1 @@ +2 diff --git a/testdata/percent_mod_int.input b/testdata/percent_mod_int.input new file mode 100644 index 0000000..ca415dc --- /dev/null +++ b/testdata/percent_mod_int.input @@ -0,0 +1 @@ +42 % 5 diff --git a/testdata/percent_mod_int2.golden b/testdata/percent_mod_int2.golden new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/testdata/percent_mod_int2.golden @@ -0,0 +1 @@ +2 diff --git a/testdata/percent_mod_int2.input b/testdata/percent_mod_int2.input new file mode 100644 index 0000000..72eff8b --- /dev/null +++ b/testdata/percent_mod_int2.input @@ -0,0 +1 @@ +42 % -5 diff --git a/testdata/percent_mod_int3.golden b/testdata/percent_mod_int3.golden new file mode 100644 index 0000000..3fbedf6 --- /dev/null +++ b/testdata/percent_mod_int3.golden @@ -0,0 +1 @@ +-2 diff --git a/testdata/percent_mod_int3.input b/testdata/percent_mod_int3.input new file mode 100644 index 0000000..dccbe2e --- /dev/null +++ b/testdata/percent_mod_int3.input @@ -0,0 +1 @@ +-42 % 5 diff --git a/testdata/percent_mod_int4.golden b/testdata/percent_mod_int4.golden new file mode 100644 index 0000000..3fbedf6 --- /dev/null +++ b/testdata/percent_mod_int4.golden @@ -0,0 +1 @@ +-2 diff --git a/testdata/percent_mod_int4.input b/testdata/percent_mod_int4.input new file mode 100644 index 0000000..4c3bbc2 --- /dev/null +++ b/testdata/percent_mod_int4.input @@ -0,0 +1 @@ +-42 % -5 diff --git a/testdata/percent_mod_int5.golden b/testdata/percent_mod_int5.golden new file mode 100644 index 0000000..f64d92c --- /dev/null +++ b/testdata/percent_mod_int5.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Division by zero. diff --git a/testdata/percent_mod_int5.input b/testdata/percent_mod_int5.input new file mode 100644 index 0000000..bb46fb9 --- /dev/null +++ b/testdata/percent_mod_int5.input @@ -0,0 +1 @@ +42 % 0 diff --git a/testdata/percent_mod_int6.golden b/testdata/percent_mod_int6.golden new file mode 100644 index 0000000..573541a --- /dev/null +++ b/testdata/percent_mod_int6.golden @@ -0,0 +1 @@ +0 diff --git a/testdata/percent_mod_int6.input b/testdata/percent_mod_int6.input new file mode 100644 index 0000000..98a7800 --- /dev/null +++ b/testdata/percent_mod_int6.input @@ -0,0 +1 @@ +0 % 42 diff --git a/testdata/std.mod_int.golden b/testdata/std.mod_int.golden new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/testdata/std.mod_int.golden @@ -0,0 +1 @@ +2 diff --git a/testdata/std.mod_int.input b/testdata/std.mod_int.input new file mode 100644 index 0000000..01a3999 --- /dev/null +++ b/testdata/std.mod_int.input @@ -0,0 +1 @@ +std.mod(42, 5) diff --git a/testdata/std.mod_string.golden b/testdata/std.mod_string.golden new file mode 100644 index 0000000..7c824fe --- /dev/null +++ b/testdata/std.mod_string.golden @@ -0,0 +1 @@ +"abcd xxx 042" diff --git a/testdata/std.mod_string.input b/testdata/std.mod_string.input new file mode 100644 index 0000000..264ceb3 --- /dev/null +++ b/testdata/std.mod_string.input @@ -0,0 +1 @@ +std.mod("abcd %s %03d", ["xxx", 42])