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

Literal strings and better literal numbers.

This commit is contained in:
Stephen Dolan
2012-09-03 13:36:12 +01:00
parent 52487ff812
commit 6041fd7661
4 changed files with 23 additions and 6 deletions

2
c/jv.h
View File

@@ -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);

View 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));
}

View File

@@ -15,9 +15,15 @@
"|=" { 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... */
/*

View 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)));