1
-
2
1
// Parse a simple SPARL-Update subset syntax for patches.
3
2
//
4
3
// This parses
@@ -12,13 +11,20 @@ $rdf.sparqlUpdateParser = function(str, kb, base) {
12
11
var keywords = [ 'INSERT' , 'DELETE' , 'WHERE' ]
13
12
var SQNS = $rdf . Namespace ( 'http://www.w3.org/ns/pim/patch#' ) ;
14
13
var p = $rdf . N3Parser ( kb , kb , base , base , null , null , "" , null ) ;
15
- // p.loadBuf("<#s> <#p> (1 2 2).");
16
- res = [ ] ;
17
14
var clauses = { } ;
18
15
19
- function badSyntax ( uri , lines , str , i , why ) {
20
- return ( ( ( ( ( ( ( ( "Line " + ( lines + 1 ) ) + " of <" ) + uri ) + ">: Bad syntax:\n " ) + why ) + "\nat: \"" ) + str . slice ( i , ( i + 30 ) ) ) + "\"" ) ;
21
- } ;
16
+ var badSyntax = function ( uri , lines , str , i , why ) {
17
+ return ( "Line " + ( lines + 1 ) + " of <" + uri + ">: Bad syntax:\n " +
18
+ why + "\n at: \"" + str . slice ( i , ( i + 30 ) ) + "\"" ) ;
19
+ } ;
20
+
21
+ var check = function ( next , last , message ) {
22
+ if ( next < 0 ) {
23
+ throw badSyntax ( p . _thisDoc , p . lines , str , j , last , message ) ;
24
+ } ;
25
+ return next ;
26
+ } ;
27
+
22
28
23
29
i = 0 ;
24
30
var query = kb . sym ( base + '#query' ) ; // Invent a URI for the query
@@ -29,40 +35,58 @@ $rdf.sparqlUpdateParser = function(str, kb, base) {
29
35
var j = p . skipSpace ( str , i ) ;
30
36
if ( j < 0 ) {
31
37
return clauses
32
- // throw badSyntax(p._thisDoc, p.lines, str, j, "needed INSERT, DELETE etc, found end.");
33
38
}
34
- // console.log("B Now at j= " + j)
35
-
39
+ // console.log("B After space at j= " + j)
40
+ var found = false ;
36
41
for ( k = 0 ; k < keywords . length ; k ++ ) {
37
42
key = keywords [ k ] ;
38
43
if ( str . slice ( j , j + key . length ) === key ) {
39
44
// console.log("C got one " + key);
40
45
i = p . skipSpace ( str , j + key . length ) ;
46
+ // console.log("D after space at i= " + i);
41
47
if ( i < 0 ) {
42
- throw badSyntax ( p . _thisDoc , p . lines , str , i , "needed {...} after " + key ) ;
48
+ throw badSyntax ( p . _thisDoc , p . lines , str , j + key . length , "found EOF, needed {...} after " + key ) ;
43
49
} ;
44
50
if ( key === 'INSERT' && str . slice ( i , i + 4 ) === 'DATA' ) { // Some wanted 'DATA'. Whatever
45
- i = p . skipSpace ( str , i + 4 ) ;
46
- if ( i < 0 ) {
47
- throw badSyntax ( p . _thisDoc , p . lines , str , i , "needed {...} after INSERT DATA " + key ) ;
51
+ j = p . skipSpace ( str , i + 4 ) ;
52
+ if ( j < 0 ) {
53
+ throw badSyntax ( p . _thisDoc , p . lines , str , i + 4 , "needed {...} after INSERT DATA " + key ) ;
48
54
} ;
55
+ i = j ;
49
56
}
50
57
var res2 = [ ] ;
51
- var m = p . node ( str , i , res2 ) ;
52
- // console.log("M Now at m= " + m)
53
- // console.log("M Now at i= " + i)
58
+ var j = p . node ( str , i , res2 ) ;
59
+ // console.log("M Now at j= " + j + " i= " + i)
54
60
55
- if ( m < 0 ) {
61
+ if ( j < 0 ) {
56
62
throw badSyntax ( p . _thisDoc , p . lines , str , i ,
57
63
"bad syntax or EOF in {...} after " + key ) ;
58
64
}
59
65
clauses [ key . toLowerCase ( ) ] = res2 [ 0 ] ;
60
66
// print("res2[0] for "+key+ " is " + res2[0]); // @@ debug @@@@@@
61
67
kb . add ( query , SQNS ( key . lower ) , res2 [ 0 ] ) ;
62
68
// key is the keyword and res2 has the contents
63
- i = m
69
+ found = true ;
70
+ i = j ;
64
71
}
65
72
} ;
73
+ if ( ! found && str . slice ( j , j + 7 ) === '@prefix' ) {
74
+ var i = p . directive ( str , j ) ;
75
+ if ( i < 0 ) {
76
+ throw badSyntax ( p . _thisDoc , p . lines , str , i ,
77
+ "bad syntax or EOF after @prefix " ) ;
78
+ }
79
+ // console.log("P before dot i= " + i)
80
+ i = p . checkDot ( str , i ) ;
81
+ // console.log("Q after dot i= " + i)
82
+ found = true ;
83
+ }
84
+ if ( ! found ) {
85
+ // console.log("Bad syntax " + j)
86
+ throw badSyntax ( p . _thisDoc , p . lines , str , j ,
87
+ "Unknown syntax at start of statememt: '" + str . slice ( j ) . slice ( 0 , 20 ) + "'" )
88
+ }
89
+
66
90
} // while
67
91
//return clauses
68
92
0 commit comments