|
@@ -5,20 +5,11 @@
|
|
* The `lemon' parser generator executable must be in your PATH:
|
|
* The `lemon' parser generator executable must be in your PATH:
|
|
* https://sqlite.org/src/doc/trunk/doc/lemon.html
|
|
* https://sqlite.org/src/doc/trunk/doc/lemon.html
|
|
*
|
|
*
|
|
- * To generate the parser, run: `make parsers'
|
|
|
|
- *
|
|
|
|
* TTL EBNF: https://www.w3.org/TeamSubmission/turtle/#sec-grammar-grammar
|
|
* TTL EBNF: https://www.w3.org/TeamSubmission/turtle/#sec-grammar-grammar
|
|
*/
|
|
*/
|
|
|
|
|
|
#include "codec.h"
|
|
#include "codec.h"
|
|
|
|
|
|
-/*
|
|
|
|
- * Disable all error recovery processing in the parser push-down
|
|
|
|
- * automaton. From SQLite grammar file parse.y
|
|
|
|
- */
|
|
|
|
-// FIXME This throws a compile error.
|
|
|
|
-//#define YYNOERRORRECOVERY 1
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
%name TTLParse
|
|
%name TTLParse
|
|
@@ -34,17 +25,11 @@
|
|
}
|
|
}
|
|
|
|
|
|
%syntax_error {
|
|
%syntax_error {
|
|
- log_warn ("Syntax error. Attempting recovery.");
|
|
|
|
|
|
+ // Fail immediately on first error.
|
|
|
|
+ yy_parse_failed (yypParser);
|
|
}
|
|
}
|
|
|
|
|
|
-%stack_size CHUNK_SIZE
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
-%syntax_error {
|
|
|
|
- if (TOKEN[0]) log_error ("near \"%T\": syntax error", &TOKEN);
|
|
|
|
- else log_error ("incomplete input");
|
|
|
|
-}
|
|
|
|
-*/
|
|
|
|
|
|
+//%stack_size 1024
|
|
|
|
|
|
%token_prefix "T_"
|
|
%token_prefix "T_"
|
|
%token_type { char * }
|
|
%token_type { char * }
|
|
@@ -83,7 +68,7 @@ statement ::= base .
|
|
statement ::= triples .
|
|
statement ::= triples .
|
|
statement ::= WS .
|
|
statement ::= WS .
|
|
|
|
|
|
-prefixID ::= PREFIX(P) WS IRIREF(N) ows PERIOD . {
|
|
|
|
|
|
+prefixID ::= PREFIX(P) WS IRIREF(N) PERIOD . {
|
|
LSUP_nsmap_add (state->nsm, P, N);
|
|
LSUP_nsmap_add (state->nsm, P, N);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -91,7 +76,7 @@ base ::= BASE WS IRIREF(D) PERIOD . {
|
|
state->base = LSUP_iriref_new (D, NULL);
|
|
state->base = LSUP_iriref_new (D, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
-triples ::= subject(S) WS predObjList(L) PERIOD . {
|
|
|
|
|
|
+triples ::= subject(S) ows predObjList(L) PERIOD . {
|
|
size_t ct = LSUP_spo_list_add_triples (state->it, S, L);
|
|
size_t ct = LSUP_spo_list_add_triples (state->it, S, L);
|
|
state->ct += ct;
|
|
state->ct += ct;
|
|
state->rc = LSUP_OK;
|
|
state->rc = LSUP_OK;
|
|
@@ -99,7 +84,7 @@ triples ::= subject(S) WS predObjList(L) PERIOD . {
|
|
LSUP_term_free (S);
|
|
LSUP_term_free (S);
|
|
LSUP_pred_obj_list_free (L);
|
|
LSUP_pred_obj_list_free (L);
|
|
}
|
|
}
|
|
-triples ::= subject(S) WS predObjList(L) SEMICOLON PERIOD . [PERIOD] {
|
|
|
|
|
|
+triples ::= subject(S) ows predObjList(L) SEMICOLON PERIOD . [PERIOD] {
|
|
size_t ct = LSUP_spo_list_add_triples (state->it, S, L);
|
|
size_t ct = LSUP_spo_list_add_triples (state->it, S, L);
|
|
state->ct += ct;
|
|
state->ct += ct;
|
|
state->rc = LSUP_OK;
|
|
state->rc = LSUP_OK;
|
|
@@ -107,17 +92,14 @@ triples ::= subject(S) WS predObjList(L) SEMICOLON PERIOD . [PERIOD] {
|
|
LSUP_term_free (S);
|
|
LSUP_term_free (S);
|
|
LSUP_pred_obj_list_free (L);
|
|
LSUP_pred_obj_list_free (L);
|
|
}
|
|
}
|
|
-triples ::= subject WS error EOF . {
|
|
|
|
- log_warn ("Error symbol popped.");
|
|
|
|
- }
|
|
|
|
|
|
|
|
%type predObjList { LSUP_PredObjList * }
|
|
%type predObjList { LSUP_PredObjList * }
|
|
%destructor predObjList { LSUP_pred_obj_list_free ($$); }
|
|
%destructor predObjList { LSUP_pred_obj_list_free ($$); }
|
|
-predObjList(A) ::= predicate(P) WS objectList(O) . [SEMICOLON] {
|
|
|
|
|
|
+predObjList(A) ::= predicate(P) ows objectList(O) . [SEMICOLON] {
|
|
A = LSUP_pred_obj_list_new();
|
|
A = LSUP_pred_obj_list_new();
|
|
LSUP_pred_obj_list_add (A, P, O);
|
|
LSUP_pred_obj_list_add (A, P, O);
|
|
}
|
|
}
|
|
-predObjList(A) ::= predObjList(L) SEMICOLON predicate(P) WS objectList(O) . {
|
|
|
|
|
|
+predObjList(A) ::= predObjList(L) SEMICOLON predicate(P) ows objectList(O) . {
|
|
LSUP_pred_obj_list_add (L, P, O);
|
|
LSUP_pred_obj_list_add (L, P, O);
|
|
A = L;
|
|
A = L;
|
|
}
|
|
}
|
|
@@ -148,12 +130,15 @@ object ::= literal .
|
|
%type literal { LSUP_Term * }
|
|
%type literal { LSUP_Term * }
|
|
literal(A) ::= STRING(D) . {
|
|
literal(A) ::= STRING(D) . {
|
|
A = LSUP_term_new (LSUP_TERM_LITERAL, D, NULL);
|
|
A = LSUP_term_new (LSUP_TERM_LITERAL, D, NULL);
|
|
|
|
+ log_trace ("Created plain literal: \"%s\"", A->data);
|
|
}
|
|
}
|
|
literal(A) ::= STRING(D) LANGTAG(L) . {
|
|
literal(A) ::= STRING(D) LANGTAG(L) . {
|
|
A = LSUP_term_new (LSUP_TERM_LT_LITERAL, D, L);
|
|
A = LSUP_term_new (LSUP_TERM_LT_LITERAL, D, L);
|
|
|
|
+ log_trace ("Created LT-literal: \"%s\"@%s", A->data, A->lang);
|
|
}
|
|
}
|
|
literal(A) ::= STRING(D) DTYPE_MARKER resource(M) . {
|
|
literal(A) ::= STRING(D) DTYPE_MARKER resource(M) . {
|
|
A = LSUP_term_new (LSUP_TERM_LITERAL, D, M);
|
|
A = LSUP_term_new (LSUP_TERM_LITERAL, D, M);
|
|
|
|
+ log_trace ("Created DT-literal: \"%s\"^^%s", A->data, A->datatype);
|
|
}
|
|
}
|
|
literal(A) ::= INTEGER(D) . {
|
|
literal(A) ::= INTEGER(D) . {
|
|
A = LSUP_term_new (
|
|
A = LSUP_term_new (
|
|
@@ -179,19 +164,23 @@ literal(A) ::= BOOLEAN(D) . {
|
|
%type blank { LSUP_Term * }
|
|
%type blank { LSUP_Term * }
|
|
blank(A) ::= BNODE_ID(D) . {
|
|
blank(A) ::= BNODE_ID(D) . {
|
|
A = LSUP_term_new (LSUP_TERM_BNODE, D, NULL);
|
|
A = LSUP_term_new (LSUP_TERM_BNODE, D, NULL);
|
|
|
|
+ log_trace ("Created blank node: _:%s", A->data);
|
|
}
|
|
}
|
|
blank(A) ::= LBRACKET RBRACKET . [BNODE_ID] {
|
|
blank(A) ::= LBRACKET RBRACKET . [BNODE_ID] {
|
|
A = LSUP_term_new (LSUP_TERM_BNODE, NULL, NULL);
|
|
A = LSUP_term_new (LSUP_TERM_BNODE, NULL, NULL);
|
|
|
|
+ log_trace ("Created empty list BN: _:%s", A->data);
|
|
}
|
|
}
|
|
blank(A) ::= LBRACKET predObjList(L) RBRACKET . [BNODE_ID] {
|
|
blank(A) ::= LBRACKET predObjList(L) RBRACKET . [BNODE_ID] {
|
|
A = LSUP_term_new (LSUP_TERM_BNODE, NULL, NULL);
|
|
A = LSUP_term_new (LSUP_TERM_BNODE, NULL, NULL);
|
|
state->ct += LSUP_spo_list_add_triples (state->it, A, L);
|
|
state->ct += LSUP_spo_list_add_triples (state->it, A, L);
|
|
|
|
+ log_trace ("Created list BN: _:%s", A->data);
|
|
|
|
|
|
LSUP_pred_obj_list_free (L);
|
|
LSUP_pred_obj_list_free (L);
|
|
}
|
|
}
|
|
blank ::= collection . [BNODE_ID]
|
|
blank ::= collection . [BNODE_ID]
|
|
blank(A) ::= LPAREN RPAREN . [BNODE_ID] {
|
|
blank(A) ::= LPAREN RPAREN . [BNODE_ID] {
|
|
A = LSUP_iriref_new ("rdf:nil", state->nsm);
|
|
A = LSUP_iriref_new ("rdf:nil", state->nsm);
|
|
|
|
+ log_trace ("Created list terminator: %s", A->data);
|
|
}
|
|
}
|
|
|
|
|
|
// "collection" is the subject of the first collection item.
|
|
// "collection" is the subject of the first collection item.
|
|
@@ -204,7 +193,7 @@ collection(A) ::= LPAREN itemList(L) RPAREN . {
|
|
%type itemList { LSUP_Term ** }
|
|
%type itemList { LSUP_Term ** }
|
|
// Freed when the item list in the collection gets added to the graph.
|
|
// Freed when the item list in the collection gets added to the graph.
|
|
%destructor itemList {}
|
|
%destructor itemList {}
|
|
-itemList(A) ::= itemList(L) WS object(O) . { A = LSUP_obj_list_add (L, O); }
|
|
|
|
|
|
+itemList(A) ::= itemList(L) ows object(O) . { A = LSUP_obj_list_add (L, O); }
|
|
itemList(A) ::= object(O) . {
|
|
itemList(A) ::= object(O) . {
|
|
A = calloc (sizeof (*A), 2);
|
|
A = calloc (sizeof (*A), 2);
|
|
A[0] = O;
|
|
A[0] = O;
|
|
@@ -220,8 +209,12 @@ resource(A) ::= IRIREF(D) . {
|
|
} else {
|
|
} else {
|
|
A = rel_iri;
|
|
A = rel_iri;
|
|
}
|
|
}
|
|
|
|
+ log_trace ("Created IRI: <%s>", A->data);
|
|
|
|
+ }
|
|
|
|
+resource(A) ::= QNAME(D) . {
|
|
|
|
+ A = LSUP_iriref_new (D, state->nsm);
|
|
|
|
+ log_trace ("Created IRI: %s", A->data);
|
|
}
|
|
}
|
|
-resource(A) ::= QNAME(D) . { A = LSUP_iriref_new (D, state->nsm); }
|
|
|
|
|
|
|
|
ows ::= WS .
|
|
ows ::= WS .
|
|
ows ::= .
|
|
ows ::= .
|