mirror of
https://github.com/stedolan/jq.git
synced 2024-05-11 05:55:39 +00:00
'==' operator, tests for equality and operator precedence.
This commit is contained in:
@ -100,6 +100,11 @@ static void f_divide(jv input[], jv output[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void f_equal(jv input[], jv output[]) {
|
||||||
|
jv_free(input[0]);
|
||||||
|
output[0] = jv_bool(jv_equal(input[2], input[1]));
|
||||||
|
}
|
||||||
|
|
||||||
static void f_tonumber(jv input[], jv output[]) {
|
static void f_tonumber(jv input[], jv output[]) {
|
||||||
if (jv_get_kind(input[0]) == JV_KIND_NUMBER) {
|
if (jv_get_kind(input[0]) == JV_KIND_NUMBER) {
|
||||||
output[0] = input[0];
|
output[0] = input[0];
|
||||||
@ -133,5 +138,6 @@ struct cfunction function_list[] = {
|
|||||||
{f_multiply, "_multiply", CALL_BUILTIN_3_1},
|
{f_multiply, "_multiply", CALL_BUILTIN_3_1},
|
||||||
{f_divide, "_divide", CALL_BUILTIN_3_1},
|
{f_divide, "_divide", CALL_BUILTIN_3_1},
|
||||||
{f_tonumber, "tonumber", CALL_BUILTIN_1_1},
|
{f_tonumber, "tonumber", CALL_BUILTIN_1_1},
|
||||||
|
{f_equal, "_equal", CALL_BUILTIN_3_1},
|
||||||
};
|
};
|
||||||
struct symbol_table builtins = {function_list, sizeof(function_list)/sizeof(function_list[0])};
|
struct symbol_table builtins = {function_list, sizeof(function_list)/sizeof(function_list[0])};
|
||||||
|
19
c/parser.y
19
c/parser.y
@ -19,11 +19,6 @@
|
|||||||
%token <literal> IDENT
|
%token <literal> IDENT
|
||||||
%token <literal> LITERAL
|
%token <literal> LITERAL
|
||||||
|
|
||||||
/* revolting hack */
|
|
||||||
%left ';'
|
|
||||||
|
|
||||||
%left '|'
|
|
||||||
%left ','
|
|
||||||
%token EQ "=="
|
%token EQ "=="
|
||||||
%token DEFINEDOR "//"
|
%token DEFINEDOR "//"
|
||||||
%token AS "as"
|
%token AS "as"
|
||||||
@ -37,6 +32,12 @@
|
|||||||
%token AND "and"
|
%token AND "and"
|
||||||
%token OR "or"
|
%token OR "or"
|
||||||
%token NOT "not"
|
%token NOT "not"
|
||||||
|
|
||||||
|
|
||||||
|
/* revolting hack */
|
||||||
|
%left ';'
|
||||||
|
%left '|'
|
||||||
|
%left ','
|
||||||
%right "//"
|
%right "//"
|
||||||
%nonassoc '=' SETPIPE
|
%nonassoc '=' SETPIPE
|
||||||
%nonassoc EQ
|
%nonassoc EQ
|
||||||
@ -64,13 +65,14 @@ static block gen_index(block obj, block key) {
|
|||||||
return block_join(obj, block_join(gen_subexp(key), gen_op_simple(INDEX)));
|
return block_join(obj, block_join(gen_subexp(key), gen_op_simple(INDEX)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static block gen_binop(block a, block b, char op) {
|
static block gen_binop(block a, block b, int op) {
|
||||||
const char* funcname = 0;
|
const char* funcname = 0;
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case '+': funcname = "_plus"; break;
|
case '+': funcname = "_plus"; break;
|
||||||
case '-': funcname = "_minus"; break;
|
case '-': funcname = "_minus"; break;
|
||||||
case '*': funcname = "_multiply"; break;
|
case '*': funcname = "_multiply"; break;
|
||||||
case '/': funcname = "_divide"; break;
|
case '/': funcname = "_divide"; break;
|
||||||
|
case EQ: funcname = "_equal"; break;
|
||||||
}
|
}
|
||||||
assert(funcname);
|
assert(funcname);
|
||||||
|
|
||||||
@ -129,6 +131,7 @@ Exp "and" Exp {
|
|||||||
$$ = gen_and($1, $3);
|
$$ = gen_and($1, $3);
|
||||||
} |
|
} |
|
||||||
|
|
||||||
|
|
||||||
"not" Exp {
|
"not" Exp {
|
||||||
$$ = gen_not($2);
|
$$ = gen_not($2);
|
||||||
} |
|
} |
|
||||||
@ -168,6 +171,10 @@ Exp '/' Exp {
|
|||||||
$$ = gen_binop($1, $3, '/');
|
$$ = gen_binop($1, $3, '/');
|
||||||
} |
|
} |
|
||||||
|
|
||||||
|
Exp "==" Exp {
|
||||||
|
$$ = gen_binop($1, $3, EQ);
|
||||||
|
} |
|
||||||
|
|
||||||
Term {
|
Term {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
|
17
c/testdata
17
c/testdata
@ -183,10 +183,27 @@ null
|
|||||||
null
|
null
|
||||||
10
|
10
|
||||||
|
|
||||||
|
[16 / 4 / 2, 16 / 4 * 2, 16 - 4 - 2, 16 - 4 + 2]
|
||||||
|
null
|
||||||
|
[2, 8, 10, 14]
|
||||||
|
|
||||||
1 + tonumber + ("10" | tonumber)
|
1 + tonumber + ("10" | tonumber)
|
||||||
4
|
4
|
||||||
15
|
15
|
||||||
|
|
||||||
|
[{"a":42},.object,10,.num,false,true,null,"b",[1,4]] | .[] as $x | [$x == .[]]
|
||||||
|
{"object": {"a":42}, "num":10.0}
|
||||||
|
[true, true, false, false, false, false, false, false, false]
|
||||||
|
[true, true, false, false, false, false, false, false, false]
|
||||||
|
[false, false, true, true, false, false, false, false, false]
|
||||||
|
[false, false, true, true, false, false, false, false, false]
|
||||||
|
[false, false, false, false, true, false, false, false, false]
|
||||||
|
[false, false, false, false, false, true, false, false, false]
|
||||||
|
[false, false, false, false, false, false, true, false, false]
|
||||||
|
[false, false, false, false, false, false, false, true, false]
|
||||||
|
[false, false, false, false, false, false, false, false, true ]
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# User-defined functions
|
# User-defined functions
|
||||||
# Oh god.
|
# Oh god.
|
||||||
|
Reference in New Issue
Block a user