1
0
mirror of https://github.com/stedolan/jq.git synced 2024-05-11 05:55:39 +00:00

Add a Boolean "not" operator.

Not wholly convinced this is a good idea, maybe "not" should be a
builtin function instead? 'not (.a == .b)' vs. '.a == .b | not'
This commit is contained in:
Stephen Dolan
2012-09-04 20:43:40 +01:00
parent 6e6ea50763
commit da5d653de8
5 changed files with 16 additions and 1 deletions

@ -383,7 +383,11 @@ block gen_or(block a, block b) {
block_append(&code, gen_condbranch(block_join(gen_op_simple(POP), gen_op_const(LOADK, jv_true())),
if_a_false));
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) {

@ -29,6 +29,7 @@ block gen_assign(block expr);
block gen_definedor(block a, block b);
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);

@ -19,6 +19,7 @@
"elif" { return ELSE_IF; }
"and" { return AND; }
"or" { return OR; }
"not" { return NOT; }
"end" { return END; }
"//" { return DEFINEDOR; }
"."|"="|";"|"["|"]"|","|":"|"("|")"|"{"|"}"|"|"|"+"|"\$" { return yytext[0];}

@ -36,6 +36,7 @@
%token END "end"
%token AND "and"
%token OR "or"
%token NOT "not"
%right "//"
%nonassoc '=' SETPIPE
%nonassoc EQ
@ -111,6 +112,10 @@ Exp "and" Exp {
$$ = gen_and($1, $3);
} |
"not" Exp {
$$ = gen_not($2);
} |
Exp "//" Exp {
$$ = gen_definedor($1, $3);
} |

@ -260,3 +260,7 @@ def inc(x): x |= .+1; inc(.[].a)
[false,true]
[false,true]
[false,false]
[.[] | not .]
[1,0,false,null,true,"hello"]
[false,false,true,true,false,false]