]> granicus.if.org Git - jq/commitdiff
Literal strings and better literal numbers.
authorStephen Dolan <mu@netsoc.tcd.ie>
Mon, 3 Sep 2012 12:36:12 +0000 (13:36 +0100)
committerStephen Dolan <mu@netsoc.tcd.ie>
Mon, 3 Sep 2012 12:57:47 +0000 (13:57 +0100)
c/jv.h
c/jv_parse.c
c/lexer.l
c/parser.y

diff --git a/c/jv.h b/c/jv.h
index c03967b19a53a79dc59e577ce4e6d4a19b1b1b3f..8fbc77abcd78640a944be11cb49c3a00d3250b2c 100644 (file)
--- a/c/jv.h
+++ b/c/jv.h
@@ -86,7 +86,7 @@ int jv_get_refcnt(jv);
 
 void jv_dump(jv);
 jv jv_parse(const char* string);
-
+jv jv_parse_sized(const char* string, int length);
 
 
 
index 2c2da39588e795dfa0a2a25cc92c2dc402e52a08..1f6a20aaaedda199c220305edbee993320a8c53b 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include "jv.h"
 #include "jv_dtoa.h"
 #include "jv_parse.h"
@@ -345,25 +346,31 @@ static pfunc finish(struct jv_parser* p) {
   return 0;
 }
 
-jv jv_parse(const char* string) {
+jv jv_parse_sized(const char* string, int length) {
+  printf("'%s' [%d]", string, length);
   struct jv_parser parser;
   jv_parser_init(&parser);
 
   const char* p = string;
   char ch;
-  while ((ch = *p++)) {
+  while (p < string + length) {
+    ch = *p++;
     presult msg = scan(&parser, ch);
     if (msg){
-      printf("ERROR: %s (parsing [%s])\n", msg, string);
+      printf("ERROR: %s (parsing '%s')\n", msg, string);
       return jv_null();
     }
   }
   presult msg = finish(&parser);
   if (msg) {
-    printf("ERROR: %s (parsing [%s])\n", msg, string);
+    printf("ERROR: %s (parsing '%s')\n", msg, string);
     return jv_null();
   }
   jv value = jv_copy(parser.next);
   jv_parser_free(&parser);
   return value;
 }
+
+jv jv_parse(const char* string) {
+  return jv_parse_sized(string, strlen(string));
+}
index 34253b01f72f50a0c79482daf6b3843d48cf967a..550ad85d03d3f88b9f858e195f024fa19317486b 100644 (file)
--- a/c/lexer.l
+++ b/c/lexer.l
 "|=" { return SETPIPE; }
 "."|"="|";"|"["|"]"|","|":"|"("|")"|"{"|"}"|"|"|"+"|"\$" { return yytext[0];}
 
-[[:digit:]]+  { yylval->literal = jv_number((double)atoi(yytext));   return LITERAL;}
+\"(\\.|[^\\"])*\" |
+[+-]?[0-9.]+([eE][+-]?[0-9]+)? { 
+   yylval->literal = jv_parse_sized(yytext, yyleng); return LITERAL; 
+}
+
 [[:alnum:]]+  { yylval->literal = jv_string(yytext); return IDENT;}
+
 [ \n\t]+  {}
+
 %%
 /* perhaps these should be calls... */
 /*
index 14a338a743c157205acba76285dd766d939a3490..3629245397f378d6dd983c2c1ea17a92cd21b9e8 100644 (file)
@@ -189,6 +189,10 @@ MkDictPair
 : IDENT ':' ExpD { 
   $$ = gen_dictpair(gen_op_const(LOADK, $1), $3);
  }
+| LITERAL ':' ExpD {
+  assert(jv_get_kind($1) == JV_KIND_STRING);
+  $$ = gen_dictpair(gen_op_const(LOADK, $1), $3);
+  }
 | IDENT {
   $$ = gen_dictpair(gen_op_const(LOADK, jv_copy($1)),
                     gen_index(gen_noop(), gen_op_const(LOADK, $1)));