Make top level wrapper value parsing work

pull/13171/head
Bo Yang 7 years ago
parent 20f1b6df41
commit 9449cf68cc
  1. 86
      upb/json/parser.rl

@ -1316,6 +1316,10 @@ static bool does_number_wrapper_end(upb_json_parser *p) {
return p->top->m != NULL && is_number_wrapper(p->top->m);
}
static bool is_number_wrapper_object(upb_json_parser *p) {
return p->top->m != NULL && is_number_wrapper(p->top->m);
}
static bool does_string_wrapper_start(upb_json_parser *p) {
return p->top->f != NULL &&
upb_fielddef_issubmsg(p->top->f) &&
@ -1326,6 +1330,10 @@ static bool does_string_wrapper_end(upb_json_parser *p) {
return p->top->m != NULL && is_string_wrapper(p->top->m);
}
static bool is_string_wrapper_object(upb_json_parser *p) {
return p->top->m != NULL && is_string_wrapper(p->top->m);
}
static bool does_boolean_wrapper_start(upb_json_parser *p) {
return p->top->f != NULL &&
upb_fielddef_issubmsg(p->top->f) &&
@ -1336,6 +1344,10 @@ static bool does_boolean_wrapper_end(upb_json_parser *p) {
return p->top->m != NULL && is_bool_value(p->top->m);
}
static bool is_boolean_wrapper_object(upb_json_parser *p) {
return p->top->m != NULL && is_bool_value(p->top->m);
}
#define CHECK_RETURN_TOP(x) if (!(x)) goto error
@ -1366,10 +1378,10 @@ static bool does_boolean_wrapper_end(upb_json_parser *p) {
exponent = /[eE]/ /[+\-]/? /[0-9]/+;
number_machine :=
("-"? integer decimal? exponent?)
<: any
>{ fhold; fret; }
;
("-"? integer decimal? exponent?)
<: any
>{ fhold; fret; }
;
number = /[0-9\-]/ >{ fhold; fcall number_machine; };
text =
@ -1421,6 +1433,67 @@ static bool does_boolean_wrapper_end(upb_json_parser *p) {
>{ end_object(parser); }
;
true_object =
"true"
>{
CHECK_RETURN_TOP(is_boolean_wrapper_object(parser));
start_wrapper_object(parser);
}
%{
CHECK_RETURN_TOP(parser_putbool(parser, true));
end_wrapper_object(parser);
}
;
false_object =
"false"
>{
CHECK_RETURN_TOP(is_boolean_wrapper_object(parser));
start_wrapper_object(parser);
}
%{
CHECK_RETURN_TOP(parser_putbool(parser, false));
end_wrapper_object(parser);
}
;
number_object_machine :=
("-"? integer decimal? exponent?)
>{
CHECK_RETURN_TOP(is_number_wrapper_object(parser));
start_wrapper_object(parser);
start_number(parser, p);
}
</{
CHECK_RETURN_TOP(end_number(parser, p));
end_wrapper_object(parser);
fhold; fret;
}
;
number_object =
/[0-9\-]/
>{
fhold; fcall number_object_machine;
}
;
string_object_machine :=
(text | unicode_char | escape_char)**
>{
CHECK_RETURN_TOP(is_string_wrapper_object(parser));
start_wrapper_object(parser);
CHECK_RETURN_TOP(start_stringval(parser));
}
'"'
</{
CHECK_RETURN_TOP(end_stringval(parser));
end_wrapper_object(parser);
fhold; fret;
}
;
string_object = '"' @{ fcall string_object_machine; } '"';
element = ws value2 ws;
array =
"["
@ -1501,7 +1574,10 @@ static bool does_boolean_wrapper_end(upb_json_parser *p) {
value
<: any >{ fhold; fret; } ;
main := ws object ws;
main :=
ws
(object | number_object | true_object | false_object | string_object)
ws;
}%%
%% write data noerror nofinal;

Loading…
Cancel
Save