]> granicus.if.org Git - jq/commitdiff
Fix negative number syntax. Add a unary '-' operator.
authorStephen Dolan <mu@netsoc.tcd.ie>
Thu, 3 Jan 2013 12:53:06 +0000 (12:53 +0000)
committerStephen Dolan <mu@netsoc.tcd.ie>
Thu, 3 Jan 2013 12:53:23 +0000 (12:53 +0000)
Closes #63.

builtin.c
lexer.l
parser.y
testdata

index 32b67ccc0b9c362c19af5495f516f40636ccb608..76e559eaa209332b927cf01ab7236909614aaf10 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -65,6 +65,15 @@ static jv f_plus(jv input, jv a, jv b) {
   }
 }
 
+static jv f_negate(jv input) {
+  if (jv_get_kind(input) != JV_KIND_NUMBER) {
+    return type_error(input, "cannot be negated");
+  }
+  jv ret = jv_number(-jv_number_value(input));
+  jv_free(input);
+  return ret;
+}
+
 static jv f_minus(jv input, jv a, jv b) {
   jv_free(input);
   if (jv_get_kind(a) == JV_KIND_NUMBER && jv_get_kind(b) == JV_KIND_NUMBER) {
@@ -462,6 +471,7 @@ static jv f_error(jv input, jv msg) {
 
 static struct cfunction function_list[] = {
   {(cfunction_ptr)f_plus, "_plus", 3},
+  {(cfunction_ptr)f_negate, "_negate", 1},
   {(cfunction_ptr)f_minus, "_minus", 3},
   {(cfunction_ptr)f_multiply, "_multiply", 3},
   {(cfunction_ptr)f_divide, "_divide", 3},
diff --git a/lexer.l b/lexer.l
index fd0e120e36a2d36618c8ebd5f49e8772a42cdade..9d826efade6f47f50ca532d00ee61991df54ee10 100644 (file)
--- a/lexer.l
+++ b/lexer.l
@@ -73,7 +73,7 @@ struct lexer_param;
   yylval->literal = jv_string_sized(yytext + 1, yyleng - 1); return FORMAT;
 }
 
--?[0-9.]+([eE][+-]?[0-9]+)? { 
+[0-9.]+([eE][+-]?[0-9]+)? { 
    yylval->literal = jv_parse_sized(yytext, yyleng); return LITERAL; 
 }
 
index a1be0b7fd3617e3f28bc6f32e5e0e4bfbf7bdb41..92cd9db8840fe9e89a976260592d92ab34a47b6b 100644 (file)
--- a/parser.y
+++ b/parser.y
@@ -260,6 +260,10 @@ Exp "+=" Exp {
   $$ = gen_update($1, $3, '+');
 } |
 
+'-' Exp {
+  $$ = BLOCK($2, gen_call("_negate", gen_noop()));
+} |
+
 Exp '-' Exp {
   $$ = gen_binop($1, $3, '-');
 } |
index 4a998d8e28de49db0e1bd3c1f68fdbe378d619eb..83f91dae8ffb015e933c9ffd40e0df733a4105da 100644 (file)
--- a/testdata
+++ b/testdata
@@ -21,6 +21,11 @@ null
 null
 1
 
+
+-1
+null
+-1
+
 # FIXME: much more number testing needed
 
 {}
@@ -197,6 +202,14 @@ null
 "wtasdf"
 2.0
 
+2-1
+null
+1
+
+2-(-1)
+null
+3
+
 1e+0+0.001e3
 "I wonder what this will be?"
 20e-1