Browse Source

Fix ttl tests with BNodes.

scossu 1 week ago
parent
commit
6347cf5add
7 changed files with 663 additions and 665 deletions
  1. 7 6
      include/volksdata/codec/tokens_ttl.h
  2. 316 299
      src/codec/grammar_ttl.c
  3. 14 3
      src/codec/grammar_ttl.y
  4. 11 12
      src/codec/lexer_ttl.re
  5. 4 4
      src/codec/parser_nt.c
  6. 310 340
      src/codec/parser_ttl.c
  7. 1 1
      src/term.c

+ 7 - 6
include/volksdata/codec/tokens_ttl.h

@@ -6,8 +6,8 @@
 #define T_DOUBLE                           6
 #define T_DECIMAL                          7
 #define T_BOOLEAN                          8
-#define T_QNAME                            9
-#define T_BNODE_ID                        10
+#define T_BNODE_ID                         9
+#define T_QNAME                           10
 #define T_IRIREF                          11
 #define T_LANGTAG                         12
 #define T_PREFIX                          13
@@ -17,7 +17,8 @@
 #define T_BASE                            17
 #define T_RDF_TYPE                        18
 #define T_DTYPE_MARKER                    19
-#define T_LBRACKET                        20
-#define T_RBRACKET                        21
-#define T_LPAREN                          22
-#define T_RPAREN                          23
+#define T_ANON                            20
+#define T_LBRACKET                        21
+#define T_RBRACKET                        22
+#define T_LPAREN                          23
+#define T_RPAREN                          24

+ 316 - 299
src/codec/grammar_ttl.c

@@ -23,8 +23,8 @@
 #define T_DOUBLE                          6
 #define T_DECIMAL                         7
 #define T_BOOLEAN                         8
-#define T_QNAME                           9
-#define T_BNODE_ID                       10
+#define T_BNODE_ID                        9
+#define T_QNAME                          10
 #define T_IRIREF                         11
 #define T_LANGTAG                        12
 #define T_PREFIX                         13
@@ -34,10 +34,11 @@
 #define T_BASE                           17
 #define T_RDF_TYPE                       18
 #define T_DTYPE_MARKER                   19
-#define T_LBRACKET                       20
-#define T_RBRACKET                       21
-#define T_LPAREN                         22
-#define T_RPAREN                         23
+#define T_ANON                           20
+#define T_LBRACKET                       21
+#define T_RBRACKET                       22
+#define T_LPAREN                         23
+#define T_RPAREN                         24
 #endif
 /**************** End token definitions ***************************************/
 
@@ -97,16 +98,16 @@
 #endif
 /************* Begin control #defines *****************************************/
 #define YYCODETYPE unsigned char
-#define YYNOCODE 41
+#define YYNOCODE 42
 #define YYACTIONTYPE unsigned char
 #define TTLParseTOKENTYPE  char * 
 typedef union {
   int yyinit;
   TTLParseTOKENTYPE yy0;
-  VOLK_LinkMap * yy2;
-  VOLK_Term * yy12;
-  char * yy33;
-  VOLK_TermSet * yy60;
+  char * yy1;
+  VOLK_TermSet * yy22;
+  VOLK_LinkMap * yy34;
+  VOLK_Term * yy50;
 } YYMINORTYPE;
 #ifndef YYSTACKDEPTH
 #define YYSTACKDEPTH 100
@@ -121,18 +122,18 @@ typedef union {
 #define TTLParseCTX_PARAM
 #define TTLParseCTX_FETCH
 #define TTLParseCTX_STORE
-#define YYNSTATE             28
+#define YYNSTATE             31
 #define YYNRULE              41
 #define YYNRULE_WITH_ACTION  27
-#define YYNTOKEN             24
-#define YY_MAX_SHIFT         27
-#define YY_MIN_SHIFTREDUCE   63
-#define YY_MAX_SHIFTREDUCE   103
-#define YY_ERROR_ACTION      104
-#define YY_ACCEPT_ACTION     105
-#define YY_NO_ACTION         106
-#define YY_MIN_REDUCE        107
-#define YY_MAX_REDUCE        147
+#define YYNTOKEN             25
+#define YY_MAX_SHIFT         30
+#define YY_MIN_SHIFTREDUCE   66
+#define YY_MAX_SHIFTREDUCE   106
+#define YY_ERROR_ACTION      107
+#define YY_ACCEPT_ACTION     108
+#define YY_NO_ACTION         109
+#define YY_MIN_REDUCE        110
+#define YY_MAX_REDUCE        150
 /************* End control #defines *******************************************/
 #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
 
@@ -199,56 +200,60 @@ typedef union {
 **  yy_default[]       Default action for each state.
 **
 *********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (111)
+#define YY_ACTTAB_COUNT (124)
 static const YYACTIONTYPE yy_action[] = {
- /*     0 */   105,    1,   65,    9,   17,   77,   78,   79,   80,   89,
- /*    10 */    81,   88,   17,   77,   78,   79,   80,   89,   81,   88,
- /*    20 */     7,   14,    2,   84,   14,   89,   81,   88,    7,   26,
- /*    30 */     2,   27,   96,   23,    5,  120,    7,  102,    2,  135,
- /*    40 */   135,  135,  135,   15,  130,  130,  130,  130,  130,  115,
- /*    50 */   116,    3,  116,  131,  131,  131,  131,  131,   11,   10,
- /*    60 */    19,  114,  114,  114,  114,  114,   20,  114,  114,  114,
- /*    70 */   114,  114,  113,  113,  113,  113,  113,   89,   83,   88,
- /*    80 */    16,   13,    4,   89,   13,   88,   73,    8,   66,   82,
- /*    90 */    18,   13,   73,  102,   13,   89,   89,   88,   88,    6,
- /*   100 */    85,   75,   64,   21,   22,   73,   63,   25,   12,   24,
- /*   110 */   134,
+ /*     0 */   108,    1,   68,    9,   19,   80,   81,   82,   83,   84,
+ /*    10 */    92,   91,   19,   80,   81,   82,   83,   84,   92,   91,
+ /*    20 */    85,   16,   17,   14,   87,   17,   11,   15,   85,   16,
+ /*    30 */    15,   14,   88,   19,   80,   81,   82,   83,   84,   92,
+ /*    40 */    91,   10,   21,  138,  138,  138,  138,   18,  123,   85,
+ /*    50 */    16,    5,   14,  118,  119,  105,  119,   92,   91,   84,
+ /*    60 */    92,   91,  105,   29,    2,   30,   99,   26,   20,   15,
+ /*    70 */    85,   16,   15,   14,  134,  134,  134,  134,  134,   13,
+ /*    80 */    22,  117,  117,  117,  117,  117,   23,  117,  117,  117,
+ /*    90 */   117,  117,    3,  133,  133,  133,  133,  133,  116,  116,
+ /*   100 */   116,  116,  116,   69,   78,    7,   92,   91,    4,    8,
+ /*   110 */    86,   12,   92,   91,   76,    6,   67,   24,   66,   25,
+ /*   120 */    76,   27,  137,   28,
 };
 static const YYCODETYPE yy_lookahead[] = {
- /*     0 */    24,   25,    1,    2,    4,    5,    6,    7,    8,    9,
+ /*     0 */    25,   26,    1,    2,    4,    5,    6,    7,    8,    9,
  /*    10 */    10,   11,    4,    5,    6,    7,    8,    9,   10,   11,
- /*    20 */    20,   33,   22,   23,   36,    9,   10,   11,   20,   13,
- /*    30 */    22,   15,   16,   17,   31,   36,   20,   16,   22,   26,
- /*    40 */    27,   28,   29,   30,   35,   36,   37,   38,   39,   36,
- /*    50 */    37,   31,   39,   35,   36,   37,   38,   39,   40,    2,
- /*    60 */    34,   35,   36,   37,   38,   39,   34,   35,   36,   37,
- /*    70 */    38,   39,   35,   36,   37,   38,   39,    9,   21,   11,
- /*    80 */    32,   33,   31,    9,   36,   11,   18,   31,    1,   21,
- /*    90 */    32,   33,   18,   16,   36,    9,    9,   11,   11,    3,
- /*   100 */    23,   12,    1,   11,   16,   18,    1,   16,   19,   11,
- /*   110 */     0,   41,   41,   41,   41,   41,   41,   41,   41,   41,
- /*   120 */    41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
- /*   130 */    41,   41,   41,   41,   41,
+ /*    20 */    20,   21,   34,   23,   24,   37,   33,   34,   20,   21,
+ /*    30 */    37,   23,   24,    4,    5,    6,    7,    8,    9,   10,
+ /*    40 */    11,    2,   32,   27,   28,   29,   30,   31,   37,   20,
+ /*    50 */    21,   32,   23,   37,   38,   16,   40,   10,   11,    9,
+ /*    60 */    10,   11,   16,   13,   32,   15,   16,   17,   33,   34,
+ /*    70 */    20,   21,   37,   23,   36,   37,   38,   39,   40,   41,
+ /*    80 */    35,   36,   37,   38,   39,   40,   35,   36,   37,   38,
+ /*    90 */    39,   40,   32,   36,   37,   38,   39,   40,   36,   37,
+ /*   100 */    38,   39,   40,    1,   12,   32,   10,   11,   32,   32,
+ /*   110 */    22,   19,   10,   11,   18,    3,    1,   11,    1,   16,
+ /*   120 */    18,   11,    0,   16,   42,   42,   42,   42,   42,   42,
+ /*   130 */    42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
+ /*   140 */    42,   42,   42,   42,   42,   42,   42,   42,   42,
 };
-#define YY_SHIFT_COUNT    (27)
+#define YY_SHIFT_COUNT    (30)
 #define YY_SHIFT_MIN      (0)
-#define YY_SHIFT_MAX      (110)
+#define YY_SHIFT_MAX      (122)
 static const unsigned char yy_shift_ofst[] = {
- /*     0 */   111,   16,    0,    8,    8,    8,    8,   68,   74,   87,
- /*    10 */    74,   77,   86,   21,   21,   21,   57,   89,    1,   96,
- /*    20 */    96,  101,   92,   88,  105,   98,   91,  110,
+ /*     0 */   124,   50,    0,   29,   29,    8,   29,   96,   96,  102,
+ /*    10 */    96,   39,   47,   46,   46,   46,   46,   46,   46,   92,
+ /*    20 */     1,   88,  112,  112,  115,  106,  103,  117,  110,  107,
+ /*    30 */   122,
 };
-#define YY_REDUCE_COUNT (15)
-#define YY_REDUCE_MIN   (-24)
-#define YY_REDUCE_MAX   (58)
+#define YY_REDUCE_COUNT (18)
+#define YY_REDUCE_MIN   (-25)
+#define YY_REDUCE_MAX   (77)
 static const signed char yy_reduce_ofst[] = {
- /*     0 */   -24,   13,   18,   26,   32,    9,   37,   48,   58,  -12,
- /*    10 */   -12,    3,   -1,   20,   51,   56,
+ /*     0 */   -25,   16,   38,   45,   51,   57,   62,   -7,   35,  -12,
+ /*    10 */   -12,   10,   11,   19,   32,   60,   73,   76,   77,
 };
 static const YYACTIONTYPE yy_default[] = {
- /*     0 */   136,  104,  104,  104,  104,  104,  104,  104,  104,  104,
- /*    10 */   104,  147,  104,  147,  147,  147,  104,  118,  104,  111,
- /*    20 */   112,  104,  104,  104,  104,  104,  104,  104,
+ /*     0 */   139,  107,  107,  107,  107,  107,  107,  107,  107,  107,
+ /*    10 */   107,  150,  107,  150,  150,  150,  150,  150,  150,  121,
+ /*    20 */   107,  107,  114,  115,  107,  107,  107,  107,  107,  107,
+ /*    30 */   107,
 };
 /********** End of lemon-generated parsing tables *****************************/
 
@@ -365,8 +370,8 @@ static const char *const yyTokenName[] = {
   /*    6 */ "DOUBLE",
   /*    7 */ "DECIMAL",
   /*    8 */ "BOOLEAN",
-  /*    9 */ "QNAME",
-  /*   10 */ "BNODE_ID",
+  /*    9 */ "BNODE_ID",
+  /*   10 */ "QNAME",
   /*   11 */ "IRIREF",
   /*   12 */ "LANGTAG",
   /*   13 */ "PREFIX",
@@ -376,27 +381,28 @@ static const char *const yyTokenName[] = {
   /*   17 */ "BASE",
   /*   18 */ "RDF_TYPE",
   /*   19 */ "DTYPE_MARKER",
-  /*   20 */ "LBRACKET",
-  /*   21 */ "RBRACKET",
-  /*   22 */ "LPAREN",
-  /*   23 */ "RPAREN",
-  /*   24 */ "turtleDoc",
-  /*   25 */ "statements",
-  /*   26 */ "statement",
-  /*   27 */ "prefixID",
-  /*   28 */ "base",
-  /*   29 */ "triples",
-  /*   30 */ "subject",
-  /*   31 */ "ows",
-  /*   32 */ "predObjList",
-  /*   33 */ "predicate",
-  /*   34 */ "objectList",
-  /*   35 */ "object",
-  /*   36 */ "resource",
-  /*   37 */ "blank",
-  /*   38 */ "literal",
-  /*   39 */ "collection",
-  /*   40 */ "itemList",
+  /*   20 */ "ANON",
+  /*   21 */ "LBRACKET",
+  /*   22 */ "RBRACKET",
+  /*   23 */ "LPAREN",
+  /*   24 */ "RPAREN",
+  /*   25 */ "turtleDoc",
+  /*   26 */ "statements",
+  /*   27 */ "statement",
+  /*   28 */ "prefixID",
+  /*   29 */ "base",
+  /*   30 */ "triples",
+  /*   31 */ "subject",
+  /*   32 */ "ows",
+  /*   33 */ "predObjList",
+  /*   34 */ "predicate",
+  /*   35 */ "objectList",
+  /*   36 */ "object",
+  /*   37 */ "resource",
+  /*   38 */ "blank",
+  /*   39 */ "literal",
+  /*   40 */ "collection",
+  /*   41 */ "itemList",
 };
 #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
 
@@ -423,10 +429,10 @@ static const char *const yyRuleName[] = {
  /*  16 */ "literal ::= DECIMAL",
  /*  17 */ "literal ::= BOOLEAN",
  /*  18 */ "blank ::= BNODE_ID",
- /*  19 */ "blank ::= LBRACKET RBRACKET",
- /*  20 */ "blank ::= LBRACKET predObjList RBRACKET",
- /*  21 */ "blank ::= LPAREN RPAREN",
- /*  22 */ "collection ::= LPAREN itemList RPAREN",
+ /*  19 */ "blank ::= ANON",
+ /*  20 */ "blank ::= LBRACKET ows predObjList ows RBRACKET",
+ /*  21 */ "blank ::= LPAREN ows RPAREN",
+ /*  22 */ "collection ::= LPAREN ows itemList ows RPAREN",
  /*  23 */ "itemList ::= itemList ows object",
  /*  24 */ "itemList ::= object",
  /*  25 */ "resource ::= IRIREF",
@@ -579,8 +585,8 @@ static void yy_destructor(
     case 6: /* DOUBLE */
     case 7: /* DECIMAL */
     case 8: /* BOOLEAN */
-    case 9: /* QNAME */
-    case 10: /* BNODE_ID */
+    case 9: /* BNODE_ID */
+    case 10: /* QNAME */
     case 11: /* IRIREF */
     case 12: /* LANGTAG */
     case 13: /* PREFIX */
@@ -590,42 +596,43 @@ static void yy_destructor(
     case 17: /* BASE */
     case 18: /* RDF_TYPE */
     case 19: /* DTYPE_MARKER */
-    case 20: /* LBRACKET */
-    case 21: /* RBRACKET */
-    case 22: /* LPAREN */
-    case 23: /* RPAREN */
+    case 20: /* ANON */
+    case 21: /* LBRACKET */
+    case 22: /* RBRACKET */
+    case 23: /* LPAREN */
+    case 24: /* RPAREN */
 {
 #line 36 "grammar_ttl.y"
  (void) state; free ((yypminor->yy0)); 
-#line 625 "../../build/grammar_ttl.c"
+#line 632 "../../build/grammar_ttl.c"
 }
       break;
-    case 30: /* subject */
-    case 33: /* predicate */
-    case 35: /* object */
-    case 36: /* resource */
-    case 37: /* blank */
-    case 38: /* literal */
-    case 39: /* collection */
+    case 31: /* subject */
+    case 34: /* predicate */
+    case 36: /* object */
+    case 37: /* resource */
+    case 38: /* blank */
+    case 39: /* literal */
+    case 40: /* collection */
 {
-#line 120 "grammar_ttl.y"
- VOLK_term_free ((yypminor->yy12)); 
-#line 638 "../../build/grammar_ttl.c"
+#line 129 "grammar_ttl.y"
+ VOLK_term_free ((yypminor->yy50)); 
+#line 645 "../../build/grammar_ttl.c"
 }
       break;
-    case 32: /* predObjList */
+    case 33: /* predObjList */
 {
 #line 97 "grammar_ttl.y"
- VOLK_link_map_free ((yypminor->yy2)); 
-#line 645 "../../build/grammar_ttl.c"
+ VOLK_link_map_free ((yypminor->yy34)); 
+#line 652 "../../build/grammar_ttl.c"
 }
       break;
-    case 34: /* objectList */
-    case 40: /* itemList */
+    case 35: /* objectList */
+    case 41: /* itemList */
 {
-#line 108 "grammar_ttl.y"
- VOLK_term_set_free ((yypminor->yy60)); 
-#line 653 "../../build/grammar_ttl.c"
+#line 117 "grammar_ttl.y"
+ VOLK_term_set_free ((yypminor->yy22)); 
+#line 660 "../../build/grammar_ttl.c"
 }
       break;
 /********* End destructor definitions *****************************************/
@@ -847,7 +854,7 @@ static void yyStackOverflow(yyParser *yypParser){
 
     log_error ("Stack oveflow in TTL parsing.");
     state->rc = VOLK_MEM_ERR;
-#line 875 "../../build/grammar_ttl.c"
+#line 882 "../../build/grammar_ttl.c"
 /******** End %stack_overflow code ********************************************/
    TTLParseARG_STORE /* Suppress warning about unused %extra_argument var */
    TTLParseCTX_STORE
@@ -919,47 +926,47 @@ static void yy_shift(
 /* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side
 ** of that rule */
 static const YYCODETYPE yyRuleInfoLhs[] = {
-    27,  /* (0) prefixID ::= PREFIX WS IRIREF PERIOD */
-    28,  /* (1) base ::= BASE WS IRIREF PERIOD */
-    29,  /* (2) triples ::= subject ows predObjList PERIOD */
-    29,  /* (3) triples ::= subject ows predObjList SEMICOLON PERIOD */
-    32,  /* (4) predObjList ::= predicate ows objectList */
-    32,  /* (5) predObjList ::= predObjList SEMICOLON predicate ows objectList */
-    34,  /* (6) objectList ::= objectList COMMA object */
-    34,  /* (7) objectList ::= object */
-    30,  /* (8) subject ::= resource */
-    30,  /* (9) subject ::= blank */
-    33,  /* (10) predicate ::= RDF_TYPE */
-    38,  /* (11) literal ::= STRING */
-    38,  /* (12) literal ::= STRING LANGTAG */
-    38,  /* (13) literal ::= STRING DTYPE_MARKER resource */
-    38,  /* (14) literal ::= INTEGER */
-    38,  /* (15) literal ::= DOUBLE */
-    38,  /* (16) literal ::= DECIMAL */
-    38,  /* (17) literal ::= BOOLEAN */
-    37,  /* (18) blank ::= BNODE_ID */
-    37,  /* (19) blank ::= LBRACKET RBRACKET */
-    37,  /* (20) blank ::= LBRACKET predObjList RBRACKET */
-    37,  /* (21) blank ::= LPAREN RPAREN */
-    39,  /* (22) collection ::= LPAREN itemList RPAREN */
-    40,  /* (23) itemList ::= itemList ows object */
-    40,  /* (24) itemList ::= object */
-    36,  /* (25) resource ::= IRIREF */
-    36,  /* (26) resource ::= QNAME */
-    24,  /* (27) turtleDoc ::= statements EOF */
-    25,  /* (28) statements ::= statements statement */
-    25,  /* (29) statements ::= */
-    26,  /* (30) statement ::= prefixID */
-    26,  /* (31) statement ::= base */
-    26,  /* (32) statement ::= triples */
-    26,  /* (33) statement ::= WS */
-    33,  /* (34) predicate ::= resource */
-    35,  /* (35) object ::= resource */
-    35,  /* (36) object ::= blank */
-    35,  /* (37) object ::= literal */
-    37,  /* (38) blank ::= collection */
-    31,  /* (39) ows ::= WS */
-    31,  /* (40) ows ::= */
+    28,  /* (0) prefixID ::= PREFIX WS IRIREF PERIOD */
+    29,  /* (1) base ::= BASE WS IRIREF PERIOD */
+    30,  /* (2) triples ::= subject ows predObjList PERIOD */
+    30,  /* (3) triples ::= subject ows predObjList SEMICOLON PERIOD */
+    33,  /* (4) predObjList ::= predicate ows objectList */
+    33,  /* (5) predObjList ::= predObjList SEMICOLON predicate ows objectList */
+    35,  /* (6) objectList ::= objectList COMMA object */
+    35,  /* (7) objectList ::= object */
+    31,  /* (8) subject ::= resource */
+    31,  /* (9) subject ::= blank */
+    34,  /* (10) predicate ::= RDF_TYPE */
+    39,  /* (11) literal ::= STRING */
+    39,  /* (12) literal ::= STRING LANGTAG */
+    39,  /* (13) literal ::= STRING DTYPE_MARKER resource */
+    39,  /* (14) literal ::= INTEGER */
+    39,  /* (15) literal ::= DOUBLE */
+    39,  /* (16) literal ::= DECIMAL */
+    39,  /* (17) literal ::= BOOLEAN */
+    38,  /* (18) blank ::= BNODE_ID */
+    38,  /* (19) blank ::= ANON */
+    38,  /* (20) blank ::= LBRACKET ows predObjList ows RBRACKET */
+    38,  /* (21) blank ::= LPAREN ows RPAREN */
+    40,  /* (22) collection ::= LPAREN ows itemList ows RPAREN */
+    41,  /* (23) itemList ::= itemList ows object */
+    41,  /* (24) itemList ::= object */
+    37,  /* (25) resource ::= IRIREF */
+    37,  /* (26) resource ::= QNAME */
+    25,  /* (27) turtleDoc ::= statements EOF */
+    26,  /* (28) statements ::= statements statement */
+    26,  /* (29) statements ::= */
+    27,  /* (30) statement ::= prefixID */
+    27,  /* (31) statement ::= base */
+    27,  /* (32) statement ::= triples */
+    27,  /* (33) statement ::= WS */
+    34,  /* (34) predicate ::= resource */
+    36,  /* (35) object ::= resource */
+    36,  /* (36) object ::= blank */
+    36,  /* (37) object ::= literal */
+    38,  /* (38) blank ::= collection */
+    32,  /* (39) ows ::= WS */
+    32,  /* (40) ows ::= */
 };
 
 /* For rule J, yyRuleInfoNRhs[J] contains the negative of the number
@@ -984,10 +991,10 @@ static const signed char yyRuleInfoNRhs[] = {
    -1,  /* (16) literal ::= DECIMAL */
    -1,  /* (17) literal ::= BOOLEAN */
    -1,  /* (18) blank ::= BNODE_ID */
-   -2,  /* (19) blank ::= LBRACKET RBRACKET */
-   -3,  /* (20) blank ::= LBRACKET predObjList RBRACKET */
-   -2,  /* (21) blank ::= LPAREN RPAREN */
-   -3,  /* (22) collection ::= LPAREN itemList RPAREN */
+   -1,  /* (19) blank ::= ANON */
+   -5,  /* (20) blank ::= LBRACKET ows predObjList ows RBRACKET */
+   -3,  /* (21) blank ::= LPAREN ows RPAREN */
+   -5,  /* (22) collection ::= LPAREN ows itemList ows RPAREN */
    -3,  /* (23) itemList ::= itemList ows object */
    -1,  /* (24) itemList ::= object */
    -1,  /* (25) resource ::= IRIREF */
@@ -1055,7 +1062,7 @@ static YYACTIONTYPE yy_reduce(
                 free (yymsp[-3].minor.yy0);
                 free (yymsp[-1].minor.yy0);
             }
-#line 1083 "../../build/grammar_ttl.c"
+#line 1090 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,16,&yymsp[-2].minor);
   yy_destructor(yypParser,1,&yymsp[0].minor);
         break;
@@ -1068,7 +1075,7 @@ static YYACTIONTYPE yy_reduce(
 
                 free (yymsp[-1].minor.yy0);
             }
-#line 1096 "../../build/grammar_ttl.c"
+#line 1103 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,16,&yymsp[-2].minor);
   yy_destructor(yypParser,1,&yymsp[0].minor);
 }
@@ -1076,262 +1083,272 @@ static YYACTIONTYPE yy_reduce(
       case 2: /* triples ::= subject ows predObjList PERIOD */
 #line 77 "grammar_ttl.y"
 {
-                size_t ct = VOLK_graph_add_link_map (state->it, yymsp[-1].minor.yy2);
+                size_t ct = VOLK_graph_add_link_map (state->it, yymsp[-1].minor.yy34);
                 state->ct += ct;
                 state->rc = VOLK_OK;
                 LOG_TRACE("Added %lu triples.", ct);
 
-                VOLK_term_free (yymsp[-3].minor.yy12);
-                VOLK_link_map_free (yymsp[-1].minor.yy2);
+                VOLK_term_free (yymsp[-3].minor.yy50);
+                VOLK_link_map_free (yymsp[-1].minor.yy34);
             }
-#line 1112 "../../build/grammar_ttl.c"
+#line 1119 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,1,&yymsp[0].minor);
         break;
       case 3: /* triples ::= subject ows predObjList SEMICOLON PERIOD */
 #line 86 "grammar_ttl.y"
 {
-                size_t ct = VOLK_graph_add_link_map (state->it, yymsp[-2].minor.yy2);
+                size_t ct = VOLK_graph_add_link_map (state->it, yymsp[-2].minor.yy34);
                 state->ct += ct;
                 state->rc = VOLK_OK;
                 LOG_TRACE("Added %lu triples.", ct);
 
-                VOLK_term_free (yymsp[-4].minor.yy12);
-                VOLK_link_map_free (yymsp[-2].minor.yy2);
+                VOLK_term_free (yymsp[-4].minor.yy50);
+                VOLK_link_map_free (yymsp[-2].minor.yy34);
             }
-#line 1126 "../../build/grammar_ttl.c"
+#line 1133 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,2,&yymsp[-1].minor);
   yy_destructor(yypParser,1,&yymsp[0].minor);
         break;
       case 4: /* predObjList ::= predicate ows objectList */
 #line 98 "grammar_ttl.y"
 {
-                yylhsminor.yy2 = VOLK_link_map_new (state->lms, VOLK_LINK_OUTBOUND);
-                VOLK_link_map_add (yylhsminor.yy2, yymsp[-2].minor.yy12, yymsp[0].minor.yy60);
+                VOLK_Term *s;
+                if (state->lms) s = state->lms;
+                else {
+                    // TODO This may be brittle. It is not verifying the
+                    // full BNode syntax.
+                    log_info ("Link map subject not present. Assuming BNode.");
+                    s = VOLK_bnode_new (NULL);
+                }
+                yylhsminor.yy34 = VOLK_link_map_new (s, VOLK_LINK_OUTBOUND);
+                VOLK_link_map_add (yylhsminor.yy34, yymsp[-2].minor.yy50, yymsp[0].minor.yy22);
+                if (s != state->lms) VOLK_term_free (s);
             }
-#line 1136 "../../build/grammar_ttl.c"
-  yymsp[-2].minor.yy2 = yylhsminor.yy2;
+#line 1152 "../../build/grammar_ttl.c"
+  yymsp[-2].minor.yy34 = yylhsminor.yy34;
         break;
       case 5: /* predObjList ::= predObjList SEMICOLON predicate ows objectList */
-#line 102 "grammar_ttl.y"
+#line 111 "grammar_ttl.y"
 {
-                VOLK_link_map_add (yymsp[-4].minor.yy2, yymsp[-2].minor.yy12, yymsp[0].minor.yy60);
-                yylhsminor.yy2 = yymsp[-4].minor.yy2;
+                VOLK_link_map_add (yymsp[-4].minor.yy34, yymsp[-2].minor.yy50, yymsp[0].minor.yy22);
+                yylhsminor.yy34 = yymsp[-4].minor.yy34;
             }
-#line 1145 "../../build/grammar_ttl.c"
+#line 1161 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,2,&yymsp[-3].minor);
-  yymsp[-4].minor.yy2 = yylhsminor.yy2;
+  yymsp[-4].minor.yy34 = yylhsminor.yy34;
         break;
       case 6: /* objectList ::= objectList COMMA object */
-#line 109 "grammar_ttl.y"
+#line 118 "grammar_ttl.y"
 {
-                if (VOLK_term_set_add (yymsp[-2].minor.yy60, yymsp[0].minor.yy12, NULL) == VOLK_NOACTION)
-                    VOLK_term_free (yymsp[0].minor.yy12);
-                yylhsminor.yy60 = yymsp[-2].minor.yy60;
+                if (VOLK_term_set_add (yymsp[-2].minor.yy22, yymsp[0].minor.yy50, NULL) == VOLK_NOACTION)
+                    VOLK_term_free (yymsp[0].minor.yy50);
+                yylhsminor.yy22 = yymsp[-2].minor.yy22;
             }
-#line 1156 "../../build/grammar_ttl.c"
+#line 1172 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,3,&yymsp[-1].minor);
-  yymsp[-2].minor.yy60 = yylhsminor.yy60;
+  yymsp[-2].minor.yy22 = yylhsminor.yy22;
         break;
       case 7: /* objectList ::= object */
-#line 114 "grammar_ttl.y"
+#line 123 "grammar_ttl.y"
 {
-                yylhsminor.yy60 = VOLK_term_set_new();
-                VOLK_term_set_add (yylhsminor.yy60, yymsp[0].minor.yy12, NULL);
+                yylhsminor.yy22 = VOLK_term_set_new();
+                VOLK_term_set_add (yylhsminor.yy22, yymsp[0].minor.yy50, NULL);
             }
-#line 1166 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy60 = yylhsminor.yy60;
+#line 1182 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy22 = yylhsminor.yy22;
         break;
       case 8: /* subject ::= resource */
       case 9: /* subject ::= blank */ yytestcase(yyruleno==9);
-#line 121 "grammar_ttl.y"
-{ state->lms = yymsp[0].minor.yy12; }
-#line 1173 "../../build/grammar_ttl.c"
+#line 130 "grammar_ttl.y"
+{ state->lms = yymsp[0].minor.yy50; }
+#line 1189 "../../build/grammar_ttl.c"
         break;
       case 10: /* predicate ::= RDF_TYPE */
 {  yy_destructor(yypParser,18,&yymsp[0].minor);
-#line 127 "grammar_ttl.y"
-{ yymsp[0].minor.yy12 = VOLK_iriref_new_ns ("rdf:type"); }
-#line 1179 "../../build/grammar_ttl.c"
+#line 136 "grammar_ttl.y"
+{ yymsp[0].minor.yy50 = VOLK_iriref_new_ns ("rdf:type"); }
+#line 1195 "../../build/grammar_ttl.c"
 }
         break;
       case 11: /* literal ::= STRING */
-#line 137 "grammar_ttl.y"
+#line 146 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_literal_new (yymsp[0].minor.yy0, NULL);
-                LOG_TRACE("Created plain literal: \"%s\"", yylhsminor.yy12->data);
+                yylhsminor.yy50 = VOLK_literal_new (yymsp[0].minor.yy0, NULL);
+                LOG_TRACE("Created plain literal: \"%s\"", yylhsminor.yy50->data);
                 free (yymsp[0].minor.yy0);
             }
-#line 1189 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1205 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
       case 12: /* literal ::= STRING LANGTAG */
-#line 142 "grammar_ttl.y"
+#line 151 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_lt_literal_new (yymsp[-1].minor.yy0, yymsp[0].minor.yy0);
-                LOG_TRACE("Created LT-literal: \"%s\"@%s", yylhsminor.yy12->data, yylhsminor.yy12->lang);
+                yylhsminor.yy50 = VOLK_lt_literal_new (yymsp[-1].minor.yy0, yymsp[0].minor.yy0);
+                LOG_TRACE("Created LT-literal: \"%s\"@%s", yylhsminor.yy50->data, yylhsminor.yy50->lang);
                 free (yymsp[-1].minor.yy0);
                 free (yymsp[0].minor.yy0);
             }
-#line 1200 "../../build/grammar_ttl.c"
-  yymsp[-1].minor.yy12 = yylhsminor.yy12;
+#line 1216 "../../build/grammar_ttl.c"
+  yymsp[-1].minor.yy50 = yylhsminor.yy50;
         break;
       case 13: /* literal ::= STRING DTYPE_MARKER resource */
-#line 148 "grammar_ttl.y"
+#line 157 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_literal_new (yymsp[-2].minor.yy0, yymsp[0].minor.yy12);
+                yylhsminor.yy50 = VOLK_literal_new (yymsp[-2].minor.yy0, yymsp[0].minor.yy50);
                 LOG_TRACE(
                         "Created DT-literal: \"%s\"^^%s",
-                        yylhsminor.yy12->data, yylhsminor.yy12->datatype);
+                        yylhsminor.yy50->data, yylhsminor.yy50->datatype);
                 free (yymsp[-2].minor.yy0);
             }
-#line 1212 "../../build/grammar_ttl.c"
+#line 1228 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,19,&yymsp[-1].minor);
-  yymsp[-2].minor.yy12 = yylhsminor.yy12;
+  yymsp[-2].minor.yy50 = yylhsminor.yy50;
         break;
       case 14: /* literal ::= INTEGER */
-#line 155 "grammar_ttl.y"
+#line 164 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:integer"));
+                yylhsminor.yy50 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:integer"));
                 free (yymsp[0].minor.yy0);
             }
-#line 1222 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1238 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
       case 15: /* literal ::= DOUBLE */
-#line 159 "grammar_ttl.y"
+#line 168 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:double"));
+                yylhsminor.yy50 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:double"));
                 free (yymsp[0].minor.yy0);
             }
-#line 1231 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1247 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
       case 16: /* literal ::= DECIMAL */
-#line 163 "grammar_ttl.y"
+#line 172 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:decimal"));
+                yylhsminor.yy50 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:decimal"));
                 free (yymsp[0].minor.yy0);
             }
-#line 1240 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1256 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
       case 17: /* literal ::= BOOLEAN */
-#line 167 "grammar_ttl.y"
+#line 176 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:boolean"));
+                yylhsminor.yy50 = VOLK_literal_new (yymsp[0].minor.yy0, VOLK_iriref_new_ns ("xsd:boolean"));
                 free (yymsp[0].minor.yy0);
             }
-#line 1249 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1265 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
       case 18: /* blank ::= BNODE_ID */
-#line 174 "grammar_ttl.y"
+#line 183 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_bnode_new (yymsp[0].minor.yy0);
-                LOG_TRACE("Created blank node: _:%s", yylhsminor.yy12->data);
+                yylhsminor.yy50 = VOLK_bnode_new (yymsp[0].minor.yy0);
+                LOG_TRACE("Created blank node: _:%s", yylhsminor.yy50->data);
                 free (yymsp[0].minor.yy0);
             }
-#line 1259 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1275 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
-      case 19: /* blank ::= LBRACKET RBRACKET */
-{  yy_destructor(yypParser,20,&yymsp[-1].minor);
-#line 179 "grammar_ttl.y"
+      case 19: /* blank ::= ANON */
+{  yy_destructor(yypParser,20,&yymsp[0].minor);
+#line 188 "grammar_ttl.y"
 {
-                yymsp[-1].minor.yy12 = VOLK_bnode_new (NULL);
-                LOG_TRACE("Created empty list BN: _:%s", yymsp[-1].minor.yy12->data);
+                LOG_TRACE ("Found empty BNode.");
+                yymsp[0].minor.yy50 = VOLK_bnode_new (NULL);
+                LOG_TRACE("Created empty list BN: _:%s", yymsp[0].minor.yy50->data);
             }
-#line 1269 "../../build/grammar_ttl.c"
-  yy_destructor(yypParser,21,&yymsp[0].minor);
+#line 1286 "../../build/grammar_ttl.c"
 }
         break;
-      case 20: /* blank ::= LBRACKET predObjList RBRACKET */
-{  yy_destructor(yypParser,20,&yymsp[-2].minor);
-#line 183 "grammar_ttl.y"
+      case 20: /* blank ::= LBRACKET ows predObjList ows RBRACKET */
+{  yy_destructor(yypParser,21,&yymsp[-4].minor);
+#line 193 "grammar_ttl.y"
 {
-                yymsp[-2].minor.yy12 = VOLK_bnode_new (NULL);
-                state->lms = yymsp[-2].minor.yy12;
-                state->ct += VOLK_graph_add_link_map (state->it, yymsp[-1].minor.yy2);
-                LOG_TRACE("Created list BN: _:%s", yymsp[-2].minor.yy12->data);
+                LOG_TRACE ("Found BNode with data.");
+                yymsp[-4].minor.yy50 = VOLK_bnode_new (NULL);
+                state->lms = yymsp[-4].minor.yy50;
+                state->ct += VOLK_graph_add_link_map (state->it, yymsp[-2].minor.yy34);
+                LOG_TRACE("Created list BN: _:%s", yymsp[-4].minor.yy50->data);
 
-                VOLK_link_map_free (yymsp[-1].minor.yy2);
+                VOLK_link_map_free (yymsp[-2].minor.yy34);
             }
-#line 1284 "../../build/grammar_ttl.c"
-  yy_destructor(yypParser,21,&yymsp[0].minor);
+#line 1301 "../../build/grammar_ttl.c"
+  yy_destructor(yypParser,22,&yymsp[0].minor);
 }
         break;
-      case 21: /* blank ::= LPAREN RPAREN */
-{  yy_destructor(yypParser,22,&yymsp[-1].minor);
-#line 192 "grammar_ttl.y"
+      case 21: /* blank ::= LPAREN ows RPAREN */
+{  yy_destructor(yypParser,23,&yymsp[-2].minor);
+#line 203 "grammar_ttl.y"
 {
-                yymsp[-1].minor.yy12 = VOLK_iriref_new_ns ("rdf:nil");
-                LOG_TRACE("Created list terminator: %s", yymsp[-1].minor.yy12->data);
+                yymsp[-2].minor.yy50 = VOLK_iriref_new_ns ("rdf:nil");
+                LOG_TRACE("Created list terminator: %s", yymsp[-2].minor.yy50->data);
             }
-#line 1295 "../../build/grammar_ttl.c"
-  yy_destructor(yypParser,23,&yymsp[0].minor);
+#line 1312 "../../build/grammar_ttl.c"
+  yy_destructor(yypParser,24,&yymsp[0].minor);
 }
         break;
-      case 22: /* collection ::= LPAREN itemList RPAREN */
-{  yy_destructor(yypParser,22,&yymsp[-2].minor);
-#line 201 "grammar_ttl.y"
+      case 22: /* collection ::= LPAREN ows itemList ows RPAREN */
+{  yy_destructor(yypParser,23,&yymsp[-4].minor);
+#line 212 "grammar_ttl.y"
 {
-                yymsp[-2].minor.yy12 = VOLK_bnode_add_collection (state->it, yymsp[-1].minor.yy60);
-                VOLK_term_set_free (yymsp[-1].minor.yy60);
+                yymsp[-4].minor.yy50 = VOLK_bnode_add_collection (state->it, yymsp[-2].minor.yy22);
+                VOLK_term_set_free (yymsp[-2].minor.yy22);
             }
-#line 1306 "../../build/grammar_ttl.c"
-  yy_destructor(yypParser,23,&yymsp[0].minor);
+#line 1323 "../../build/grammar_ttl.c"
+  yy_destructor(yypParser,24,&yymsp[0].minor);
 }
         break;
       case 23: /* itemList ::= itemList ows object */
-#line 208 "grammar_ttl.y"
+#line 219 "grammar_ttl.y"
 {
-                if (VOLK_term_set_add (yymsp[-2].minor.yy60, yymsp[0].minor.yy12, NULL) == VOLK_NOACTION)
-                    VOLK_term_free (yymsp[0].minor.yy12);
-                yylhsminor.yy60 = yymsp[-2].minor.yy60;
+                if (VOLK_term_set_add (yymsp[-2].minor.yy22, yymsp[0].minor.yy50, NULL) == VOLK_NOACTION)
+                    VOLK_term_free (yymsp[0].minor.yy50);
+                yylhsminor.yy22 = yymsp[-2].minor.yy22;
             }
-#line 1317 "../../build/grammar_ttl.c"
-  yymsp[-2].minor.yy60 = yylhsminor.yy60;
+#line 1334 "../../build/grammar_ttl.c"
+  yymsp[-2].minor.yy22 = yylhsminor.yy22;
         break;
       case 24: /* itemList ::= object */
-#line 213 "grammar_ttl.y"
+#line 224 "grammar_ttl.y"
 {
-                yylhsminor.yy60 = VOLK_term_set_new ();
-                VOLK_term_set_add (yylhsminor.yy60, yymsp[0].minor.yy12, NULL);
+                yylhsminor.yy22 = VOLK_term_set_new ();
+                VOLK_term_set_add (yylhsminor.yy22, yymsp[0].minor.yy50, NULL);
             }
-#line 1326 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy60 = yylhsminor.yy60;
+#line 1343 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy22 = yylhsminor.yy22;
         break;
       case 25: /* resource ::= IRIREF */
-#line 220 "grammar_ttl.y"
+#line 231 "grammar_ttl.y"
 {
                 VOLK_Term *rel_iri = VOLK_iriref_new (yymsp[0].minor.yy0);
                 free (yymsp[0].minor.yy0);
                 if (state->base) {
-                    yylhsminor.yy12 = VOLK_iriref_new_abs (rel_iri, state->base);
+                    yylhsminor.yy50 = VOLK_iriref_new_abs (rel_iri, state->base);
                     VOLK_term_free (rel_iri);
                 } else {
-                    yylhsminor.yy12 = rel_iri;
+                    yylhsminor.yy50 = rel_iri;
                 }
-                LOG_TRACE("Created IRI: <%s>", yylhsminor.yy12->data);
+                LOG_TRACE("Created IRI: <%s>", yylhsminor.yy50->data);
             }
-#line 1342 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1359 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
       case 26: /* resource ::= QNAME */
-#line 231 "grammar_ttl.y"
+#line 242 "grammar_ttl.y"
 {
-                yylhsminor.yy12 = VOLK_iriref_new_ns (yymsp[0].minor.yy0);
-                LOG_TRACE("Created IRI: %s", yylhsminor.yy12->data);
+                yylhsminor.yy50 = VOLK_iriref_new_ns (yymsp[0].minor.yy0);
+                LOG_TRACE("Created IRI: %s", yylhsminor.yy50->data);
                 free (yymsp[0].minor.yy0);
             }
-#line 1352 "../../build/grammar_ttl.c"
-  yymsp[0].minor.yy12 = yylhsminor.yy12;
+#line 1369 "../../build/grammar_ttl.c"
+  yymsp[0].minor.yy50 = yylhsminor.yy50;
         break;
       case 27: /* turtleDoc ::= statements EOF */
 #line 54 "grammar_ttl.y"
 {
 }
-#line 1359 "../../build/grammar_ttl.c"
+#line 1376 "../../build/grammar_ttl.c"
   yy_destructor(yypParser,15,&yymsp[0].minor);
         break;
       case 33: /* statement ::= WS */
@@ -1340,40 +1357,40 @@ static YYACTIONTYPE yy_reduce(
 #line 61 "grammar_ttl.y"
 {
 }
-#line 1368 "../../build/grammar_ttl.c"
+#line 1385 "../../build/grammar_ttl.c"
 }
         break;
       case 34: /* predicate ::= resource */
       case 35: /* object ::= resource */ yytestcase(yyruleno==35);
-{  yy_destructor(yypParser,36,&yymsp[0].minor);
-#line 126 "grammar_ttl.y"
+{  yy_destructor(yypParser,37,&yymsp[0].minor);
+#line 135 "grammar_ttl.y"
 {
 }
-#line 1377 "../../build/grammar_ttl.c"
+#line 1394 "../../build/grammar_ttl.c"
 }
         break;
       case 36: /* object ::= blank */
-{  yy_destructor(yypParser,37,&yymsp[0].minor);
-#line 132 "grammar_ttl.y"
+{  yy_destructor(yypParser,38,&yymsp[0].minor);
+#line 141 "grammar_ttl.y"
 {
 }
-#line 1385 "../../build/grammar_ttl.c"
+#line 1402 "../../build/grammar_ttl.c"
 }
         break;
       case 37: /* object ::= literal */
-{  yy_destructor(yypParser,38,&yymsp[0].minor);
-#line 133 "grammar_ttl.y"
+{  yy_destructor(yypParser,39,&yymsp[0].minor);
+#line 142 "grammar_ttl.y"
 {
 }
-#line 1393 "../../build/grammar_ttl.c"
+#line 1410 "../../build/grammar_ttl.c"
 }
         break;
       case 38: /* blank ::= collection */
-{  yy_destructor(yypParser,39,&yymsp[0].minor);
-#line 191 "grammar_ttl.y"
+{  yy_destructor(yypParser,40,&yymsp[0].minor);
+#line 202 "grammar_ttl.y"
 {
 }
-#line 1401 "../../build/grammar_ttl.c"
+#line 1418 "../../build/grammar_ttl.c"
 }
         break;
       default:
@@ -1428,7 +1445,7 @@ static void yy_parse_failed(
 
     log_error ("TTL parse error. Cannot continue.");
     state->rc = VOLK_PARSE_ERR;
-#line 1456 "../../build/grammar_ttl.c"
+#line 1473 "../../build/grammar_ttl.c"
 /************ End %parse_failure code *****************************************/
   TTLParseARG_STORE /* Suppress warning about unused %extra_argument variable */
   TTLParseCTX_STORE
@@ -1451,7 +1468,7 @@ static void yy_syntax_error(
 
     // Fail immediately on first error.
     yy_parse_failed (yypParser);
-#line 1479 "../../build/grammar_ttl.c"
+#line 1496 "../../build/grammar_ttl.c"
 /************ End %syntax_error code ******************************************/
   TTLParseARG_STORE /* Suppress warning about unused %extra_argument variable */
   TTLParseCTX_STORE

+ 14 - 3
src/codec/grammar_ttl.y

@@ -43,7 +43,7 @@
 %left PERIOD .
 %left SEMICOLON .
 %left COMMA .
-%left STRING INTEGER DOUBLE DECIMAL BOOLEAN QNAME BNODE_ID IRIREF .
+%left STRING INTEGER DOUBLE DECIMAL BOOLEAN BNODE_ID QNAME IRIREF .
 %nonassoc LANGTAG PREFIX .
 %nonassoc COLON .
 
@@ -96,8 +96,17 @@ triples 	::= subject(S) ows predObjList(L) SEMICOLON PERIOD . [PERIOD] {
 %type predObjList       { VOLK_LinkMap * }
 %destructor predObjList { VOLK_link_map_free ($$); }
 predObjList(A) ::= predicate(P) ows objectList(O) . [SEMICOLON] {
-                A = VOLK_link_map_new (state->lms, VOLK_LINK_OUTBOUND);
+                VOLK_Term *s;
+                if (state->lms) s = state->lms;
+                else {
+                    // TODO This may be brittle. It is not verifying the
+                    // full BNode syntax.
+                    log_info ("Link map subject not present. Assuming BNode.");
+                    s = VOLK_bnode_new (NULL);
+                }
+                A = VOLK_link_map_new (s, VOLK_LINK_OUTBOUND);
                 VOLK_link_map_add (A, P, O);
+                if (s != state->lms) VOLK_term_free (s);
             }
 predObjList(A) ::= predObjList(L) SEMICOLON predicate(P) ows objectList(O) . {
                 VOLK_link_map_add (L, P, O);
@@ -176,11 +185,13 @@ blank(A)    ::= BNODE_ID(D) . {
                 LOG_TRACE("Created blank node: _:%s", A->data);
                 free (D);
             }
-blank(A)    ::= LBRACKET RBRACKET . [BNODE_ID] {
+blank(A)    ::= ANON . [BNODE_ID] {
+                LOG_TRACE ("Found empty BNode.");
                 A = VOLK_bnode_new (NULL);
                 LOG_TRACE("Created empty list BN: _:%s", A->data);
             }
 blank(A)    ::= LBRACKET predObjList(L) RBRACKET . [BNODE_ID] {
+                LOG_TRACE ("Found BNode with data.");
                 A = VOLK_bnode_new (NULL);
                 state->lms = A;
                 state->ct += VOLK_graph_add_link_map (state->it, L);

+ 11 - 12
src/codec/lexer_ttl.re

@@ -231,8 +231,6 @@ loop: // Start new token.
         return T_IRIREF;
     }
 
-    '[' WS? ']' { return T_EMPTY_BNODE; }
-
     '@prefix' WS @pfx (PSTART_CHAR NAME_CHAR*)? ":" {
         *token_p = uint8_ndup (pfx, YYCURSOR - pfx - 1);
         LOG_TRACE("Prefix declaration: '%s'", *token_p);
@@ -320,25 +318,27 @@ loop: // Start new token.
         return T_DECIMAL;
     }
 
-    '(' WS? { return T_LPAREN; }
+    '(' WS* { return T_LPAREN; }
+
+    WS* ')' { return T_RPAREN; }
 
-    WS? ')' { return T_RPAREN; }
+    '[' WS* ']' { return T_ANON; }
 
-    '[' WS? { return T_LBRACKET; }
+    '[' WS* { return T_LBRACKET; }
 
-    WS? ']' { return T_RBRACKET; }
+    WS* ']' { return T_RBRACKET; }
 
     ':' { return T_COLON; }
 
-    WS? ';' WS? {
+    WS* ';' WS* {
         LOG_TRACE("End of object list.");
 
         return T_SEMICOLON;
     }
 
-    WS? ',' WS? { return T_COMMA; }
+    WS* ',' WS* { return T_COMMA; }
 
-    WS? '.' {
+    WS* '.' {
         LOG_TRACE("End of statement #%u.", it->ct);
         it->ct++;
         return T_PERIOD;
@@ -423,10 +423,8 @@ VOLK_ttl_parse_doc (
         return VOLK_VALUE_ERR;
     }
 
-    VOLK_TTLParserState *state = malloc (sizeof (*state));
+    VOLK_TTLParserState *state = calloc (1, sizeof (*state));
     if (UNLIKELY (!state)) return VOLK_MEM_ERR;
-    state->base = NULL;
-    state->ct = 0;
     state->rc = VOLK_NORESULT;
 
     ParseIterator parse_it;
@@ -491,6 +489,7 @@ finally: ;
     VOLK_rc rc = state->rc;
     LOG_TRACE("rc is %d", rc);
 
+    free (parse_it.buf);
     TTLParseFree (parser, free);
 
     VOLK_graph_add_done (state->it);

+ 4 - 4
src/codec/parser_nt.c

@@ -1,4 +1,4 @@
-/* Generated by re2c 4.1 on Thu Aug 21 14:53:45 2025 */
+/* Generated by re2c 4.1 on Fri Aug 22 09:37:54 2025 */
 #line 1 "lexer_nt.re"
 #include "volksdata/codec/parser_nt.h"
 #include "volksdata/codec/tokens_nt.h"
@@ -397,7 +397,7 @@ yy17:
         free (data);
         free (metadata);
 
-        if (!UNLIKELY (term)) return -1;
+        if (UNLIKELY (!term)) return -1;
         return T_LITERAL;
     }
 #line 404 "parser_nt.c"
@@ -521,7 +521,7 @@ yy33:
         *term = VOLK_iriref_new ((char*)data);
         free (data);
 
-        if (!UNLIKELY (term)) return -1;
+        if (UNLIKELY (!term)) return -1;
         return T_IRIREF;
     }
 #line 528 "parser_nt.c"
@@ -681,7 +681,7 @@ yy51:
         *term = VOLK_term_new (VOLK_TERM_BNODE, (char*)data, NULL);
         free (data);
 
-        if (!UNLIKELY (term)) return -1;
+        if (UNLIKELY (!term)) return -1;
         return T_BNODE;
     }
 #line 688 "parser_nt.c"

File diff suppressed because it is too large
+ 310 - 340
src/codec/parser_ttl.c


+ 1 - 1
src/term.c

@@ -799,7 +799,7 @@ term_init (
                 log_warn (
                         "Characters %s are not valid in a URI. Got: %s\n",
                         invalid_uri_chars, fquri);
-#if 1
+#if 0
                 // TODO This causes W3C TTL test #29 to fail. Remove?
                 return VOLK_VALUE_ERR;
 #endif

Some files were not shown because too many files changed in this diff