summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Dolan <mu@netsoc.tcd.ie>2012-09-17 21:08:43 +0100
committerStephen Dolan <mu@netsoc.tcd.ie>2012-09-17 21:08:43 +0100
commit830610cef8d830841bdd2dd4d7bf7cbdf504f20d (patch)
tree2fac3bb0ee8b60601933811f868a08e609351d95
parent297a0679d1f7268e7ef0be8653748f8d22b8bda8 (diff)
Make "not" a builtin function rather than syntax.
Fixes a really awkward grammar issue.
-rw-r--r--c/builtin.c7
-rw-r--r--c/compile.c7
-rw-r--r--c/compile.h2
-rw-r--r--c/lexer.l1
-rw-r--r--c/parser.y5
-rw-r--r--c/testdata2
6 files changed, 10 insertions, 14 deletions
diff --git a/c/builtin.c b/c/builtin.c
index 5b329fbd..ddac58f9 100644
--- a/c/builtin.c
+++ b/c/builtin.c
@@ -159,6 +159,12 @@ static block j_null() {
gen_op_simple(RET)));
}
+static block j_not() {
+ return gen_op_block_defn(CLOSURE_CREATE, "not",
+ block_join(gen_condbranch(gen_op_const(LOADK, jv_false()),
+ gen_op_const(LOADK, jv_true())),
+ gen_op_simple(RET)));
+}
static struct cfunction function_list[] = {
{f_plus, "_plus", CALL_BUILTIN_3_1},
@@ -179,6 +185,7 @@ static bytecoded_builtin bytecoded_builtins[] = {
j_false,
j_true,
j_null,
+ j_not,
};
diff --git a/c/compile.c b/c/compile.c
index c45d45a1..023acb95 100644
--- a/c/compile.c
+++ b/c/compile.c
@@ -361,7 +361,7 @@ block gen_definedor(block a, block b) {
return c;
}
-static block gen_condbranch(block iftrue, block iffalse) {
+block gen_condbranch(block iftrue, block iffalse) {
block b = gen_noop();
block_append(&iftrue, gen_op_target(JUMP, iffalse));
block_append(&b, gen_op_target(JUMP_F, iftrue));
@@ -398,11 +398,6 @@ block gen_or(block a, block b) {
return code;
}
-block gen_not(block a) {
- return block_join(a, gen_condbranch(gen_op_const(LOADK, jv_false()),
- gen_op_const(LOADK, jv_true())));
-}
-
block gen_cond(block cond, block iftrue, block iffalse) {
block b = gen_op_simple(DUP);
block_append(&b, cond);
diff --git a/c/compile.h b/c/compile.h
index 28249e8f..411654fe 100644
--- a/c/compile.h
+++ b/c/compile.h
@@ -32,9 +32,9 @@ block gen_both(block a, block b);
block gen_collect(block expr);
block gen_assign(block expr);
block gen_definedor(block a, block b);
+block gen_condbranch(block iftrue, block iffalse);
block gen_and(block a, block b);
block gen_or(block a, block b);
-block gen_not(block a);
block gen_cond(block cond, block iftrue, block iffalse);
diff --git a/c/lexer.l b/c/lexer.l
index 94196146..412d9065 100644
--- a/c/lexer.l
+++ b/c/lexer.l
@@ -40,7 +40,6 @@
"elif" { return ELSE_IF; }
"and" { return AND; }
"or" { return OR; }
-"not" { return NOT; }
"end" { return END; }
"//" { return DEFINEDOR; }
"|=" { return SETPIPE; }
diff --git a/c/parser.y b/c/parser.y
index 2684a26e..822a3385 100644
--- a/c/parser.y
+++ b/c/parser.y
@@ -53,7 +53,6 @@
%token END "end"
%token AND "and"
%token OR "or"
-%token NOT "not"
%token SETPIPE "|="
%token SETPLUS "+="
%token SETMINUS "-="
@@ -210,10 +209,6 @@ Exp "and" Exp {
$$ = gen_and($1, $3);
} |
-"not" Exp {
- $$ = gen_not($2);
-} |
-
Exp "//" Exp {
$$ = gen_definedor($1, $3);
} |
diff --git a/c/testdata b/c/testdata
index c83ef9c5..72367bbf 100644
--- a/c/testdata
+++ b/c/testdata
@@ -331,6 +331,6 @@ def inc(x): x |= .+1; inc(.[].a)
[false,true]
[false,false]
-[.[] | not .]
+[.[] | not]
[1,0,false,null,true,"hello"]
[false,false,true,true,false,false]