Browse Source

Raise parse error.

Stefano Cossu 2 years ago
parent
commit
10467968ae
4 changed files with 16 additions and 8 deletions
  1. 1 0
      include/codec.h
  2. 10 4
      src/codec/grammar_ttl.y
  3. 4 3
      src/codec/lexer_ttl.re
  4. 1 1
      test/test_codec_ttl.c

+ 1 - 0
include/codec.h

@@ -57,6 +57,7 @@ typedef struct {
     LSUP_NSMap *            nsm;    ///< NS map used in the document.
     LSUP_Term *             base;   ///< Base IRI used in the document.
     size_t                  ct;     ///< Statements parsed.
+    LSUP_rc                 rc;     ///< Internal return code.
 } LSUP_TTLParserState;
 
 /** @brief Parse error information.

+ 10 - 4
src/codec/grammar_ttl.y

@@ -16,11 +16,13 @@
 %name TTLParse
 
 %stack_overflow {
-    log_error ("Stack oveflow in TTL parsing. Please jettison the parser.");
+    log_error ("Stack oveflow in TTL parsing.");
+    state->rc = LSUP_MEM_ERR;
 }
 
 %parse_failure {
     log_error ("TTL parse error. Cannot continue.");
+    state->rc = LSUP_PARSE_ERR;
 }
 
 %stack_size CHUNK_SIZE
@@ -81,10 +83,10 @@ base        ::= BASE WS IRIREF(D) . {
                 state->base = LSUP_iriref_new (D, NULL);
             }
 
-// WS before predicate is optional because pred has leading WS already.
-triples 	::= subject(S) predObjList(L) EOS . [EOS] {
+triples 	::= subject(S) predObjList(L) EOS . {
                 size_t ct = LSUP_spo_list_add_triples (state->it, S, L);
                 state->ct += ct;
+                state->rc = LSUP_OK;
                 log_trace ("Added %lu triples.", ct);
                 LSUP_term_free (S);
                 LSUP_pred_obj_list_free (L);
@@ -92,11 +94,15 @@ triples 	::= subject(S) predObjList(L) EOS . [EOS] {
 
 %type predObjList       { LSUP_PredObjList * }
 %destructor predObjList { LSUP_pred_obj_list_free ($$); }
+predObjList(A) ::= predicate(P) WS objectList(O) SEMICOLON . {
+                A = LSUP_pred_obj_list_new();
+                LSUP_pred_obj_list_add (A, P, O);
+            }
 predObjList(A) ::= predicate(P) WS objectList(O) . [SEMICOLON] {
                 A = LSUP_pred_obj_list_new();
                 LSUP_pred_obj_list_add (A, P, O);
             }
-predObjList(A) ::= predObjList(L) SEMICOLON predicate(P) WS objectList(O) . [SEMICOLON] {
+predObjList(A) ::= predObjList(L) SEMICOLON predicate(P) WS objectList(O) . {
                 LSUP_pred_obj_list_add (L, P, O);
                 A = L;
             }

+ 4 - 3
src/codec/lexer_ttl.re

@@ -398,6 +398,7 @@ LSUP_ttl_parse_doc (FILE *fh, LSUP_Graph **gr_p, size_t *ct, char **err_p)
     }
     state->base = NULL;
     state->ct = 0;
+    state->rc = LSUP_NORESULT;
 
     state->nsm = LSUP_nsmap_new();
     // TODO add basic NS, critically xsd: and rdf:
@@ -424,7 +425,7 @@ LSUP_ttl_parse_doc (FILE *fh, LSUP_Graph **gr_p, size_t *ct, char **err_p)
             char token[16] = {'\0'};
             strncpy (token, (const char *)parse_it.tok, 15);
 
-            char *err_start = "Parse error near token `";
+            char *err_start = "Lexer error near token `";
 
             char err_info [64];
             sprintf(
@@ -435,7 +436,7 @@ LSUP_ttl_parse_doc (FILE *fh, LSUP_Graph **gr_p, size_t *ct, char **err_p)
             char *err_str = malloc (err_size);
             sprintf (err_str, "%s%s%s", err_start, token, err_info);
 
-            rc = LSUP_VALUE_ERR;
+            rc = LSUP_PARSE_ERR;
             *err_p = err_str;
 
             goto finally;
@@ -451,12 +452,12 @@ LSUP_ttl_parse_doc (FILE *fh, LSUP_Graph **gr_p, size_t *ct, char **err_p)
     log_info ("Parsed %u triples.", state->ct);
     log_debug ("Graph size: %lu", LSUP_graph_size (gr));
 
-    rc = state->ct > 0 ? LSUP_OK : LSUP_NORESULT;
     *gr_p = gr;
 
 finally:
     TTLParse (parser, 0, NULL, state);
     TTLParseFree (parser, free);
+    rc = state->rc;
 
     LSUP_graph_add_done (state->it);
     free (state);

+ 1 - 1
test/test_codec_ttl.c

@@ -45,7 +45,7 @@ test_w3c_pos()
 
         LSUP_rc rc = codec.decode_graph (test_stream, &gr, &ct, &err);
         log_info ("rc: %d", rc);
-        ASSERT (rc != LSUP_OK, "Test meant to fail passed!");
+        ASSERT (rc == LSUP_PARSE_ERR, "Bad test did not raise a parse error!");
     }
 
     return 0;