6#line 1 "../../include/volksdata/codec/parser_common.h"
7#ifndef _VOLK_PARSER_COMMON_H
8#define _VOLK_PARSER_COMMON_H
20#define YYCTYPE uint8_t
21#define YYCURSOR it->cur
22#define YYMARKER it->mar
23#define YYLIMIT it->lim
24#define YYFILL fill(it) == 0
45#line 36 "../../include/volksdata/codec/parser_common.h"
62static void parse_init (
ParseIterator *it, FILE *fh,
const char *sh)
70 if (!it->
buf) log_error (
"Error allocating lexer buffer.");
91#line 78 "../../include/volksdata/codec/parser_common.h"
99 log_debug (
"Filling codec buffer @ %p.", it->
buf);
100 if (it->
eof)
return 1;
102 size_t shift = it->
tok - it->
buf;
103 size_t used = it->
lim - it->
tok;
111 cur_off = it->
cur - it->
buf,
112 tok_off = it->
tok - it->
buf,
113 lim_off = it->
lim - it->
buf,
114 mar_off = it->
mar - it->
buf;
119 log_error (
"Memory allocation error.");
124 it->
cur = it->
buf + cur_off;
125 it->
tok = it->
buf + tok_off;
126 it->
lim = it->
buf + lim_off;
127 it->
mar = it->
buf + mar_off;
130 memmove (it->
buf, it->
tok, used);
131 LOG_TRACE (
"Limit offset before reading data: %zu", it->
lim - it->
tok);
139#line 140 "parser_nt.c"
141#line 124 "../../include/volksdata/codec/parser_common.h"
168 const YYCTYPE *lit_data_e, *dtype_s, *lang_s;
180#line 181 "parser_nt.c"
183 unsigned int yyaccept = 0;
198 if (
YYFILL)
goto yyFillLabel0;
206#line 162 "lexer_nt.re"
209 "Invalid token @ %p: %s (\\x%x)",
214#line 215 "parser_nt.c"
224 if (
YYFILL)
goto yyFillLabel1;
229#line 145 "lexer_nt.re"
235#line 236 "parser_nt.c"
246 if (
YYFILL)
goto yyFillLabel2;
251#line 61 "lexer_nt.re"
258#line 259 "parser_nt.c"
267 if (
YYFILL)
goto yyFillLabel3;
274 case 0xC2 ... 0xF4:
goto yy14;
287 if (
YYFILL)
goto yyFillLabel4;
291 case 0xC2 ... 0xDF:
goto yy25;
292 case 0xE0:
goto yy26;
293 case 0xE1 ... 0xEF:
goto yy27;
294 case 0xF0:
goto yy28;
295 case 0xF1 ... 0xF3:
goto yy29;
296 case 0xF4:
goto yy30;
300#line 151 "lexer_nt.re"
304 memcpy (data, it->
tok, size);
305 data [size - 1] =
'\0';
311#line 312 "parser_nt.c"
314#line 138 "lexer_nt.re"
321#line 322 "parser_nt.c"
334 case 0xC2 ... 0xF4:
goto yy32;
337 if (
YYFILL)
goto yyFillLabel5;
350 if (
YYFILL)
goto yyFillLabel6;
367 if (
YYFILL)
goto yyFillLabel7;
372 case '\\':
goto yy18;
373 case 0xC2 ... 0xDF:
goto yy19;
374 case 0xE0:
goto yy20;
375 case 0xE1 ... 0xEF:
goto yy21;
376 case 0xF0:
goto yy22;
377 case 0xF1 ... 0xF3:
goto yy23;
378 case 0xF4:
goto yy24;
419 if (
YYFILL)
goto yyFillLabel8;
427 lit_data_e = it->
yyt1;
430#line 85 "lexer_nt.re"
433 size_t size = lit_data_e - it->
tok - 2;
437 char *metadata = NULL;
448 }
else md_marker = NULL;
451 metadata = malloc (size);
452 memcpy (metadata, md_marker + 1, size);
453 metadata [size - 1] =
'\0';
471#line 472 "parser_nt.c"
489 if (
YYFILL)
goto yyFillLabel9;
498 case 0x80 ... 0xBF:
goto yy13;
501 if (
YYFILL)
goto yyFillLabel10;
510 case 0xA0 ... 0xBF:
goto yy19;
513 if (
YYFILL)
goto yyFillLabel11;
522 case 0x80 ... 0xBF:
goto yy19;
525 if (
YYFILL)
goto yyFillLabel12;
534 case 0x90 ... 0xBF:
goto yy21;
537 if (
YYFILL)
goto yyFillLabel13;
546 case 0x80 ... 0xBF:
goto yy21;
549 if (
YYFILL)
goto yyFillLabel14;
558 case 0x80 ... 0x8F:
goto yy21;
561 if (
YYFILL)
goto yyFillLabel15;
570 case 0x80 ... 0xBF:
goto yy8;
573 if (
YYFILL)
goto yyFillLabel16;
582 case 0xA0 ... 0xBF:
goto yy25;
585 if (
YYFILL)
goto yyFillLabel17;
594 case 0x80 ... 0xBF:
goto yy25;
597 if (
YYFILL)
goto yyFillLabel18;
606 case 0x90 ... 0xBF:
goto yy27;
609 if (
YYFILL)
goto yyFillLabel19;
618 case 0x80 ... 0xBF:
goto yy27;
621 if (
YYFILL)
goto yyFillLabel20;
630 case 0x80 ... 0x8F:
goto yy27;
633 if (
YYFILL)
goto yyFillLabel21;
650 case '~' ... 0x7F:
goto yy31;
652 case '\\':
goto yy34;
653 case 0xC2 ... 0xDF:
goto yy35;
654 case 0xE0:
goto yy36;
655 case 0xE1 ... 0xEF:
goto yy37;
656 case 0xF0:
goto yy38;
657 case 0xF1 ... 0xF3:
goto yy39;
658 case 0xF4:
goto yy40;
661 if (
YYFILL)
goto yyFillLabel22;
667#line 73 "lexer_nt.re"
679#line 680 "parser_nt.c"
689 if (
YYFILL)
goto yyFillLabel23;
698 case 0x80 ... 0xBF:
goto yy31;
701 if (
YYFILL)
goto yyFillLabel24;
710 case 0xA0 ... 0xBF:
goto yy35;
713 if (
YYFILL)
goto yyFillLabel25;
722 case 0x80 ... 0xBF:
goto yy35;
725 if (
YYFILL)
goto yyFillLabel26;
734 case 0x90 ... 0xBF:
goto yy37;
737 if (
YYFILL)
goto yyFillLabel27;
746 case 0x80 ... 0xBF:
goto yy37;
749 if (
YYFILL)
goto yyFillLabel28;
758 case 0x80 ... 0x8F:
goto yy37;
761 if (
YYFILL)
goto yyFillLabel29;
777 case 0xEF ... 0xF3:
goto yy50;
778 case 0xCD:
goto yy54;
779 case 0xE2:
goto yy57;
782 if (
YYFILL)
goto yyFillLabel30;
800 if (
YYFILL)
goto yyFillLabel31;
812 case 'a' ...
'z':
goto yy64;
815 if (
YYFILL)
goto yyFillLabel32;
827 if (
YYFILL)
goto yyFillLabel33;
838 case 'a' ...
'f':
goto yy66;
841 if (
YYFILL)
goto yyFillLabel34;
852 case 'a' ...
'f':
goto yy67;
855 if (
YYFILL)
goto yyFillLabel35;
866 case 'a' ...
'f':
goto yy68;
869 if (
YYFILL)
goto yyFillLabel36;
880 case 'a' ...
'f':
goto yy69;
883 if (
YYFILL)
goto yyFillLabel37;
898 case 'a' ...
'z':
goto yy49;
900 case 0xC2:
goto yy71;
901 case 0xC3:
goto yy52;
903 case 0xCE ... 0xDF:
goto yy53;
904 case 0xCD:
goto yy72;
905 case 0xE0:
goto yy55;
907 case 0xE4 ... 0xEC:
goto yy56;
908 case 0xE2:
goto yy73;
909 case 0xE3:
goto yy58;
910 case 0xED:
goto yy59;
911 case 0xEF:
goto yy60;
912 case 0xF0:
goto yy61;
913 case 0xF1 ... 0xF2:
goto yy62;
914 case 0xF3:
goto yy63;
917 if (
YYFILL)
goto yyFillLabel38;
922#line 126 "lexer_nt.re"
934#line 935 "parser_nt.c"
942 case 0xB8 ... 0xBF:
goto yy49;
945 if (
YYFILL)
goto yyFillLabel39;
954 case 0x80 ... 0xBF:
goto yy49;
957 if (
YYFILL)
goto yyFillLabel40;
967 case 0xBF:
goto yy49;
970 if (
YYFILL)
goto yyFillLabel41;
979 case 0xA0 ... 0xBF:
goto yy53;
982 if (
YYFILL)
goto yyFillLabel42;
991 case 0x80 ... 0xBF:
goto yy53;
994 if (
YYFILL)
goto yyFillLabel43;
1003 case 0x80:
goto yy74;
1004 case 0x81:
goto yy75;
1006 case 0xB0 ... 0xBE:
goto yy53;
1007 case 0x86:
goto yy76;
1008 case 0xBF:
goto yy77;
1011 if (
YYFILL)
goto yyFillLabel44;
1020 case 0x80:
goto yy78;
1021 case 0x81 ... 0xBF:
goto yy53;
1024 if (
YYFILL)
goto yyFillLabel45;
1033 case 0x80 ... 0x9F:
goto yy53;
1036 if (
YYFILL)
goto yyFillLabel46;
1046 case 0xB8 ... 0xBE:
goto yy53;
1047 case 0xB7:
goto yy79;
1048 case 0xBF:
goto yy80;
1051 if (
YYFILL)
goto yyFillLabel47;
1060 case 0x90 ... 0xBF:
goto yy56;
1063 if (
YYFILL)
goto yyFillLabel48;
1072 case 0x80 ... 0xBF:
goto yy56;
1075 if (
YYFILL)
goto yyFillLabel49;
1084 case 0x80 ... 0xAF:
goto yy56;
1087 if (
YYFILL)
goto yyFillLabel50;
1097 case '-':
goto yy81;
1099 case 'a' ...
'z':
goto yy64;
1102 if (
YYFILL)
goto yyFillLabel51;
1113 case ' ':
goto yy65;
1119 if (
YYFILL)
goto yyFillLabel52;
1130 case 'a' ...
'f':
goto yy83;
1133 if (
YYFILL)
goto yyFillLabel53;
1144 case 'a' ...
'f':
goto yy84;
1147 if (
YYFILL)
goto yyFillLabel54;
1158 case 'a' ...
'f':
goto yy85;
1161 if (
YYFILL)
goto yyFillLabel55;
1172 case 'a' ...
'f':
goto yy86;
1175 if (
YYFILL)
goto yyFillLabel56;
1188 case 'a' ...
'z':
goto yy49;
1189 case '.':
goto yy70;
1190 case 0xC2:
goto yy71;
1191 case 0xC3:
goto yy52;
1193 case 0xCE ... 0xDF:
goto yy53;
1194 case 0xCD:
goto yy72;
1195 case 0xE0:
goto yy55;
1197 case 0xE4 ... 0xEC:
goto yy56;
1198 case 0xE2:
goto yy73;
1199 case 0xE3:
goto yy58;
1200 case 0xED:
goto yy59;
1201 case 0xEF:
goto yy60;
1202 case 0xF0:
goto yy61;
1203 case 0xF1 ... 0xF2:
goto yy62;
1204 case 0xF3:
goto yy63;
1207 if (
YYFILL)
goto yyFillLabel57;
1216 case 0xB7:
goto yy49;
1219 if (
YYFILL)
goto yyFillLabel58;
1229 case 0xBF:
goto yy49;
1232 if (
YYFILL)
goto yyFillLabel59;
1241 case 0x80:
goto yy87;
1242 case 0x81:
goto yy88;
1244 case 0xB0 ... 0xBE:
goto yy53;
1245 case 0x86:
goto yy76;
1246 case 0xBF:
goto yy77;
1249 if (
YYFILL)
goto yyFillLabel60;
1258 case 0x8C ... 0x8D:
goto yy49;
1261 if (
YYFILL)
goto yyFillLabel61;
1270 case 0xB0 ... 0xBF:
goto yy49;
1273 if (
YYFILL)
goto yyFillLabel62;
1282 case 0x80 ... 0x8F:
goto yy49;
1285 if (
YYFILL)
goto yyFillLabel63;
1294 case 0x80 ... 0xAF:
goto yy49;
1297 if (
YYFILL)
goto yyFillLabel64;
1306 case 0x81 ... 0xBF:
goto yy49;
1309 if (
YYFILL)
goto yyFillLabel65;
1319 case 0xB0 ... 0xBF:
goto yy49;
1322 if (
YYFILL)
goto yyFillLabel66;
1331 case 0x80 ... 0xBD:
goto yy49;
1334 if (
YYFILL)
goto yyFillLabel67;
1345 case 'a' ...
'z':
goto yy89;
1348 if (
YYFILL)
goto yyFillLabel68;
1364 case '~' ... 0x7F:
goto yy82;
1365 case '>':
goto yy90;
1366 case '\\':
goto yy91;
1367 case 0xC2 ... 0xDF:
goto yy92;
1368 case 0xE0:
goto yy93;
1369 case 0xE1 ... 0xEF:
goto yy94;
1370 case 0xF0:
goto yy95;
1371 case 0xF1 ... 0xF3:
goto yy96;
1372 case 0xF4:
goto yy97;
1375 if (
YYFILL)
goto yyFillLabel69;
1386 case 'a' ...
'f':
goto yy98;
1389 if (
YYFILL)
goto yyFillLabel70;
1400 case 'a' ...
'f':
goto yy99;
1403 if (
YYFILL)
goto yyFillLabel71;
1414 case 'a' ...
'f':
goto yy100;
1417 if (
YYFILL)
goto yyFillLabel72;
1428 case 'a' ...
'f':
goto yy101;
1431 if (
YYFILL)
goto yyFillLabel73;
1441 case 0xBF:
goto yy49;
1444 if (
YYFILL)
goto yyFillLabel74;
1454 case 0xB0 ... 0xBF:
goto yy49;
1457 if (
YYFILL)
goto yyFillLabel75;
1467 case '-':
goto yy81;
1470 case 'a' ...
'z':
goto yy89;
1473 if (
YYFILL)
goto yyFillLabel76;
1487 case 'U':
goto yy102;
1488 case 'u':
goto yy103;
1491 if (
YYFILL)
goto yyFillLabel77;
1500 case 0x80 ... 0xBF:
goto yy82;
1503 if (
YYFILL)
goto yyFillLabel78;
1512 case 0xA0 ... 0xBF:
goto yy92;
1515 if (
YYFILL)
goto yyFillLabel79;
1524 case 0x80 ... 0xBF:
goto yy92;
1527 if (
YYFILL)
goto yyFillLabel80;
1536 case 0x90 ... 0xBF:
goto yy94;
1539 if (
YYFILL)
goto yyFillLabel81;
1548 case 0x80 ... 0xBF:
goto yy94;
1551 if (
YYFILL)
goto yyFillLabel82;
1560 case 0x80 ... 0x8F:
goto yy94;
1563 if (
YYFILL)
goto yyFillLabel83;
1574 case 'a' ...
'f':
goto yy46;
1577 if (
YYFILL)
goto yyFillLabel84;
1588 case 'a' ...
'f':
goto yy13;
1591 if (
YYFILL)
goto yyFillLabel85;
1602 case 'a' ...
'f':
goto yy48;
1605 if (
YYFILL)
goto yyFillLabel86;
1616 case 'a' ...
'f':
goto yy31;
1619 if (
YYFILL)
goto yyFillLabel87;
1630 case 'a' ...
'f':
goto yy104;
1633 if (
YYFILL)
goto yyFillLabel88;
1644 case 'a' ...
'f':
goto yy105;
1647 if (
YYFILL)
goto yyFillLabel89;
1658 case 'a' ...
'f':
goto yy106;
1661 if (
YYFILL)
goto yyFillLabel90;
1672 case 'a' ...
'f':
goto yy107;
1675 if (
YYFILL)
goto yyFillLabel91;
1686 case 'a' ...
'f':
goto yy108;
1689 if (
YYFILL)
goto yyFillLabel92;
1700 case 'a' ...
'f':
goto yy109;
1703 if (
YYFILL)
goto yyFillLabel93;
1714 case 'a' ...
'f':
goto yy103;
1717 if (
YYFILL)
goto yyFillLabel94;
1728 case 'a' ...
'f':
goto yy82;
1731 if (
YYFILL)
goto yyFillLabel95;
1736#line 68 "lexer_nt.re"
1741#line 1742 "parser_nt.c"
1743#line 170 "lexer_nt.re"
1752 parse_init (&it, NULL, rep);
1754 int ttype = lex (&it, term);
1770 FILE *fh,
const char *sh, VOLK_Graph **gr_p,
size_t *ct,
char **err_p)
1776 log_error (
"Neither file handle nor string input provided.");
1781 parse_init (&parse_it, fh, sh);
1803 int ttype = lex (&parse_it, &term);
1806 char token[16] = {};
1807 strncpy (token, (
const char *)parse_it.
tok, 15);
1809 char *err_start =
"Parse error near token `";
1813 err_info,
"[...]' at line %u, character %ld.\n",
1816 size_t err_size = strlen (err_start) + 16 + strlen(err_info);
1817 char *err_str = malloc (err_size);
1818 sprintf (err_str,
"%s%s%s", err_start, token, err_info);
1822 log_error (err_str);
1827 NTParse (parser, ttype, term, it);
1829 if (ttype ==
T_EOF)
break;
1832 if (ct) *ct = parse_it.
ct;
1834 log_info (
"Parsed %u triples.", parse_it.
ct);
1841 NTParse (parser, 0, NULL, it);
1844 free (parse_it.
buf);
#define T_EOF
Lemon parser grammar for N-Triples.
void NTParseTrace(FILE *TraceFILE, char *zTracePrompt)
uint8_t * unescape_unicode(const uint8_t *esc_str, size_t size)
Replace \uxxxx and \Uxxxxxxxx with Unicode bytes.
#define VOLK_graph_add_init(...)
Non-transactional version of VOLK_graph_add_init_txn().
void VOLK_graph_free(VOLK_Graph *gr)
Free a graph.
void VOLK_graph_iter_free(VOLK_GraphIterator *it)
Free a graph iterator.
VOLK_Graph * VOLK_graph_new(VOLK_Store *store, const char *uri_str)
Create new graph.
size_t VOLK_graph_size(const VOLK_Graph *gr)
Number of triples in a graph.
#define VOLK_VALUE_ERR
An invalid input value was provided.
#define VOLK_MEM_ERR
Memory allocation error.
#define VOLK_NORESULT
No result yielded.
#define VOLK_OK
Generic success return code.
#define VOLK_PARSE_ERR
Codec parser error.
VOLK_Term * VOLK_lt_literal_new(const char *data, char *lang)
Shortcut to create a language-tagged literal term.
VOLK_Term * VOLK_iriref_new(const char *data)
Create an IRI reference.
VOLK_Term * VOLK_literal_new(const char *data, VOLK_Term *datatype)
Shortcut to create a literal term.
void VOLK_term_free(VOLK_Term *term)
VOLK_Term * VOLK_term_new(VOLK_TermType type, const char *data, void *metadata)
Create a new term.
@ VOLK_TERM_LT_LITERAL
Language-tagged string literal.
@ VOLK_TERM_LITERAL
Literal without language tag.
@ VOLK_TERM_BNODE
Blank node.
#define YYCTYPE
TTL is UTF-8 encoded.
VOLK_rc VOLK_nt_parse_doc(FILE *fh, const char *sh, VOLK_Graph **gr_p, size_t *ct, char **err_p)
Parse an RDF document in N-Triples format.
VOLK_rc VOLK_nt_parse_term(const char *rep, VOLK_Term **term)
Parse a single term.
#define YYCTYPE
TTL is UTF-8 encoded.
FILE * fh
Input file handle.
size_t buf_size
Initial allocation for buffer.
unsigned line
Current line no. (for debugging).
YYCTYPE * cur
Next input character to be read (YYCURSOR).
const char * sh
Input string. Exclusive with fh.
bool eof
if we have reached EOF.
YYCTYPE * buf
Start of buffer.
unsigned ct
Number of statements parsed.
YYCTYPE * mar
Most recent match (YYMARKER).
YYCTYPE * tok
Start of current token.