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:
2
c/jv.h
2
c/jv.h
@@ -86,7 +86,7 @@ int jv_get_refcnt(jv);
|
|||||||
|
|
||||||
void jv_dump(jv);
|
void jv_dump(jv);
|
||||||
jv jv_parse(const char* string);
|
jv jv_parse(const char* string);
|
||||||
|
jv jv_parse_sized(const char* string, int length);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
15
c/jv_parse.c
15
c/jv_parse.c
@@ -1,5 +1,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include "jv.h"
|
#include "jv.h"
|
||||||
#include "jv_dtoa.h"
|
#include "jv_dtoa.h"
|
||||||
#include "jv_parse.h"
|
#include "jv_parse.h"
|
||||||
@@ -345,25 +346,31 @@ static pfunc finish(struct jv_parser* p) {
|
|||||||
return 0;
|
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;
|
struct jv_parser parser;
|
||||||
jv_parser_init(&parser);
|
jv_parser_init(&parser);
|
||||||
|
|
||||||
const char* p = string;
|
const char* p = string;
|
||||||
char ch;
|
char ch;
|
||||||
while ((ch = *p++)) {
|
while (p < string + length) {
|
||||||
|
ch = *p++;
|
||||||
presult msg = scan(&parser, ch);
|
presult msg = scan(&parser, ch);
|
||||||
if (msg){
|
if (msg){
|
||||||
printf("ERROR: %s (parsing [%s])\n", msg, string);
|
printf("ERROR: %s (parsing '%s')\n", msg, string);
|
||||||
return jv_null();
|
return jv_null();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
presult msg = finish(&parser);
|
presult msg = finish(&parser);
|
||||||
if (msg) {
|
if (msg) {
|
||||||
printf("ERROR: %s (parsing [%s])\n", msg, string);
|
printf("ERROR: %s (parsing '%s')\n", msg, string);
|
||||||
return jv_null();
|
return jv_null();
|
||||||
}
|
}
|
||||||
jv value = jv_copy(parser.next);
|
jv value = jv_copy(parser.next);
|
||||||
jv_parser_free(&parser);
|
jv_parser_free(&parser);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jv jv_parse(const char* string) {
|
||||||
|
return jv_parse_sized(string, strlen(string));
|
||||||
|
}
|
||||||
|
@@ -15,9 +15,15 @@
|
|||||||
"|=" { return SETPIPE; }
|
"|=" { return SETPIPE; }
|
||||||
"."|"="|";"|"["|"]"|","|":"|"("|")"|"{"|"}"|"|"|"+"|"\$" { return yytext[0];}
|
"."|"="|";"|"["|"]"|","|":"|"("|")"|"{"|"}"|"|"|"+"|"\$" { 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;}
|
[[:alnum:]]+ { yylval->literal = jv_string(yytext); return IDENT;}
|
||||||
|
|
||||||
[ \n\t]+ {}
|
[ \n\t]+ {}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
/* perhaps these should be calls... */
|
/* perhaps these should be calls... */
|
||||||
/*
|
/*
|
||||||
|
@@ -189,6 +189,10 @@ MkDictPair
|
|||||||
: IDENT ':' ExpD {
|
: IDENT ':' ExpD {
|
||||||
$$ = gen_dictpair(gen_op_const(LOADK, $1), $3);
|
$$ = 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 {
|
| IDENT {
|
||||||
$$ = gen_dictpair(gen_op_const(LOADK, jv_copy($1)),
|
$$ = gen_dictpair(gen_op_const(LOADK, jv_copy($1)),
|
||||||
gen_index(gen_noop(), gen_op_const(LOADK, $1)));
|
gen_index(gen_noop(), gen_op_const(LOADK, $1)));
|
||||||
|
Reference in New Issue
Block a user