[tracker/wip/carlosg/sparql1.1: 37/113] libtracker-data: Make all rules point to the first non-whitespace char



commit a6520b6e5d4f0a9e8ccfeb2580467cdd7198a5bf
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Jun 10 15:45:49 2019 +0200

    libtracker-data: Make all rules point to the first non-whitespace char
    
    Not doing so may mess up with rollback and error reset, since we rewind
    to a position that is earlier than the current error position, so the
    error still prevails (since we return the error of the most successful
    parsing).
    
    This could be seen with ValuesClause, eg. "VALUES ?u { 2 }". This would
    spuriously error out after trying to parse the second DataBlockValue,
    despite falling back successfully to parsing the '}'.

 src/libtracker-data/tracker-sparql-parser.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-parser.c b/src/libtracker-data/tracker-sparql-parser.c
index 8afee0587..71a963209 100644
--- a/src/libtracker-data/tracker-sparql-parser.c
+++ b/src/libtracker-data/tracker-sparql-parser.c
@@ -598,6 +598,7 @@ tracker_parser_state_iterate (TrackerParserState   *state,
                child = tracker_parser_state_lookup_child (state);
 
                if (child) {
+                       tracker_parser_state_skip_whitespace (state, parser);
                        tracker_parser_state_push (state, child);
                        return TRUE;
                }
@@ -611,6 +612,7 @@ tracker_parser_state_iterate (TrackerParserState   *state,
 
                if (tracker_parser_state_next_child (state, TRUE)) {
                        child = tracker_parser_state_lookup_child (state);
+                       tracker_parser_state_skip_whitespace (state, parser);
                        tracker_parser_state_push (state, child);
                        return TRUE;
                }
@@ -640,6 +642,7 @@ tracker_parser_state_rollback (TrackerParserState   *state,
                        if (tracker_parser_state_next_child (state, FALSE)) {
                                tracker_node_tree_reset (state->node_tree, discard);
                                child = tracker_parser_state_lookup_child (state);
+                               tracker_parser_state_skip_whitespace (state, parser);
                                tracker_parser_state_push (state, child);
                                return TRUE;
                        }
@@ -678,11 +681,9 @@ static gboolean
 tracker_grammar_parser_read (TrackerGrammarParser *parser,
                              TrackerParserState   *state)
 {
-
        while (state->rule_states.len > 0) {
                const TrackerGrammarRule *rule;
 
-               tracker_parser_state_skip_whitespace (state, parser);
                rule = tracker_parser_state_peek_current_rule (state);
 
                if (tracker_grammar_parser_apply_rule (parser, state, rule)) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]