@@ -191,61 +191,25 @@ struct structural_parser : structural_iterator {
191191 return parse_number (current (), found_minus);
192192 }
193193
194- WARN_UNUSED really_inline bool parse_atom () {
195- switch (current_char ()) {
196- case ' t' :
197- log_value (" true" );
198- if (!atomparsing::is_valid_true_atom (current ())) { return true ; }
199- append_tape (0 , internal::tape_type::TRUE_VALUE );
200- break ;
201- case ' f' :
202- log_value (" false" );
203- if (!atomparsing::is_valid_false_atom (current ())) { return true ; }
204- append_tape (0 , internal::tape_type::FALSE_VALUE );
205- break ;
206- case ' n' :
207- log_value (" null" );
208- if (!atomparsing::is_valid_null_atom (current ())) { return true ; }
209- append_tape (0 , internal::tape_type::NULL_VALUE );
210- break ;
211- default :
212- log_error (" IMPOSSIBLE: unrecognized parse_atom structural character" );
213- return true ;
214- }
215- return false ;
216- }
217-
218- WARN_UNUSED really_inline bool parse_single_atom () {
219- switch (current_char ()) {
220- case ' t' :
221- log_value (" true" );
222- if (!atomparsing::is_valid_true_atom (current (), remaining_len ())) { return true ; }
223- append_tape (0 , internal::tape_type::TRUE_VALUE );
224- break ;
225- case ' f' :
226- log_value (" false" );
227- if (!atomparsing::is_valid_false_atom (current (), remaining_len ())) { return true ; }
228- append_tape (0 , internal::tape_type::FALSE_VALUE );
229- break ;
230- case ' n' :
231- log_value (" null" );
232- if (!atomparsing::is_valid_null_atom (current (), remaining_len ())) { return true ; }
233- append_tape (0 , internal::tape_type::NULL_VALUE );
234- break ;
235- default :
236- log_error (" IMPOSSIBLE: unrecognized parse_atom structural character" );
237- return true ;
238- }
239- return false ;
240- }
241-
242194 WARN_UNUSED really_inline ret_address_t parse_value (const unified_machine_addresses &addresses, ret_address_t continue_state) {
243- switch (current_char ()) {
195+ switch (advance_char ()) {
244196 case ' "' :
245197 FAIL_IF ( parse_string () );
246198 return continue_state;
247- case ' t' : case ' f' : case ' n' :
248- FAIL_IF ( parse_atom () );
199+ case ' t' :
200+ log_value (" true" );
201+ FAIL_IF ( !atomparsing::is_valid_true_atom (current ()) );
202+ append_tape (0 , internal::tape_type::TRUE_VALUE );
203+ return continue_state;
204+ case ' f' :
205+ log_value (" false" );
206+ FAIL_IF ( !atomparsing::is_valid_false_atom (current ()) );
207+ append_tape (0 , internal::tape_type::FALSE_VALUE );
208+ return continue_state;
209+ case ' n' :
210+ log_value (" null" );
211+ FAIL_IF ( !atomparsing::is_valid_null_atom (current ()) );
212+ append_tape (0 , internal::tape_type::NULL_VALUE );
249213 return continue_state;
250214 case ' 0' : case ' 1' : case ' 2' : case ' 3' : case ' 4' :
251215 case ' 5' : case ' 6' : case ' 7' : case ' 8' : case ' 9' :
@@ -396,8 +360,20 @@ WARN_UNUSED static error_code parse_structurals(dom_parser_implementation &dom_p
396360 case ' "' :
397361 FAIL_IF ( parser.parse_string () );
398362 goto finish;
399- case ' t' : case ' f' : case ' n' :
400- FAIL_IF ( parser.parse_single_atom () );
363+ case ' t' :
364+ parser.log_value (" true" );
365+ FAIL_IF ( !atomparsing::is_valid_true_atom (parser.current (), parser.remaining_len ()) );
366+ parser.append_tape (0 , internal::tape_type::TRUE_VALUE );
367+ goto finish;
368+ case ' f' :
369+ parser.log_value (" false" );
370+ FAIL_IF ( !atomparsing::is_valid_false_atom (parser.current (), parser.remaining_len ()) );
371+ parser.append_tape (0 , internal::tape_type::FALSE_VALUE );
372+ goto finish;
373+ case ' n' :
374+ parser.log_value (" null" );
375+ FAIL_IF ( !atomparsing::is_valid_null_atom (parser.current (), parser.remaining_len ()) );
376+ parser.append_tape (0 , internal::tape_type::NULL_VALUE );
401377 goto finish;
402378 case ' 0' : case ' 1' : case ' 2' : case ' 3' : case ' 4' :
403379 case ' 5' : case ' 6' : case ' 7' : case ' 8' : case ' 9' :
@@ -439,7 +415,6 @@ WARN_UNUSED static error_code parse_structurals(dom_parser_implementation &dom_p
439415
440416object_key_state:
441417 if (parser.advance_char () != ' :' ) { parser.log_error (" Missing colon after key in object" ); goto error; }
442- parser.advance_char ();
443418 GOTO ( parser.parse_value (addresses, addresses.object_continue ) );
444419
445420object_continue:
@@ -464,7 +439,8 @@ WARN_UNUSED static error_code parse_structurals(dom_parser_implementation &dom_p
464439// Array parser states
465440//
466441array_begin:
467- if (parser.advance_char () == ' ]' ) {
442+ if (parser.peek_char () == ' ]' ) {
443+ parser.advance_char ();
468444 parser.end_array ();
469445 goto scope_end;
470446 }
@@ -479,7 +455,6 @@ WARN_UNUSED static error_code parse_structurals(dom_parser_implementation &dom_p
479455 switch (parser.advance_char ()) {
480456 case ' ,' :
481457 parser.increment_count ();
482- parser.advance_char ();
483458 goto main_array_switch;
484459 case ' ]' :
485460 parser.end_array ();
0 commit comments