rdf-turtle 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History +7 -0
- data/README.markdown +9 -25
- data/VERSION +1 -1
- data/lib/ebnf.rb +80 -71
- data/lib/rdf/ll1/scanner.rb +4 -4
- data/lib/rdf/turtle/reader.rb +8 -3
- data/lib/rdf/turtle/terminals.rb +28 -29
- data/lib/rdf/turtle/writer.rb +6 -4
- metadata +120 -186
data/History
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
### 0.3.1
|
2
|
+
* Sync with rdf-spec 0.3.11 changes due to respec updates.
|
3
|
+
|
4
|
+
### 0.3.0
|
5
|
+
* Use Ruby native EBNF parser. Still requires cwm to create first/follow rules.
|
6
|
+
* Updated to latest specification and EBNF rules.
|
7
|
+
|
1
8
|
### 0.1.1
|
2
9
|
* Improvements to allow reader & writer to be sub-classed for rdf-trig.
|
3
10
|
* Improved error recovery when parsing.
|
data/README.markdown
CHANGED
@@ -41,23 +41,9 @@ Full documentation available on [Rubydoc.info][Turtle doc]
|
|
41
41
|
### Variations from the spec
|
42
42
|
In some cases, the specification is unclear on certain issues:
|
43
43
|
|
44
|
-
* In section 2.1, the [spec][Turtle] indicates that "Literals ,
|
45
|
-
prefixed names and IRIs may also contain escapes to encode surrounding syntax ...",
|
46
|
-
however the description in 5.2 indicates that only IRI\_REF and the various STRING\_LITERAL terms
|
47
|
-
are subject to unescaping. This means that an IRI which might otherwise be representable using a PNAME
|
48
|
-
cannot if the IRI contains any characters that might need escaping. This implementation currently abides
|
49
|
-
by this restriction. Presumably, this would affect both PNAME\_NS and PNAME\_LN terminals.
|
50
|
-
(This is being tracked as issues [67](http://www.w3.org/2011/rdf-wg/track/issues/67)).
|
51
|
-
* The EBNF definition of IRIREF seems malformed, and has no provision for \^, as discussed elsewhere in the spec.
|
52
|
-
We presume that [#0000- ] is intended to be [#0000-#0020].
|
53
|
-
* The list example in section 6 uses a list on it's own, without a predicate or object, which is not allowed
|
54
|
-
by the grammar (neither is a blankNodeProperyList). Either the EBNF should be updated to allow for these
|
55
|
-
forms, or the examples should be changed such that ( ... ) and [ ... ] are used only in the context of being
|
56
|
-
a subject or object. This implementation will generate triples, however an error will be generated if the
|
57
|
-
parser is run in validation mode.
|
58
44
|
* For the time being, plain literals are generated without an xsd:string datatype, but literals with an xsd:string
|
59
45
|
datatype are saved as non-datatyped triples in the graph. This will be updated in the future when the rest of the
|
60
|
-
library suite is brought up to date.
|
46
|
+
library suite is brought up to date with RDF 1.1.
|
61
47
|
|
62
48
|
## Implementation Notes
|
63
49
|
The reader uses a generic LL1 parser {RDF::LL1::Parser} and lexer {RDF::LL1::Lexer}. The parser takes branch and follow
|
@@ -69,13 +55,9 @@ through a set of regular expressions used to match each type of terminal, descri
|
|
69
55
|
|
70
56
|
etc/turtle.bnf is used to to generate a Notation3 representation of the grammar, a transformed LL1 representation and ultimately {RDF::Turtle::Meta}.
|
71
57
|
|
72
|
-
Using SWAP utilities, this is done as follows:
|
58
|
+
Using local and [SWAP][] utilities, this is done as follows:
|
73
59
|
|
74
|
-
|
75
|
-
etc/turtle.bnf \
|
76
|
-
ttl language \
|
77
|
-
'http://www.w3.org/ns/formats/Turtle#' > |
|
78
|
-
sed -e 's/^ ".*"$/ g:seq (&)/' > etc/turtle.n3
|
60
|
+
script/ebnf2ttl -f ttl -o etc/turtle.n3 etc/turtle.bnf
|
79
61
|
|
80
62
|
python http://www.w3.org/2000/10/swap/cwm.py etc/turtle.n3 \
|
81
63
|
http://www.w3.org/2000/10/swap/grammar/ebnf2bnf.n3 \
|
@@ -86,12 +68,13 @@ Using SWAP utilities, this is done as follows:
|
|
86
68
|
--grammar etc/turtle-ll1.n3 \
|
87
69
|
--lang 'http://www.w3.org/ns/formats/Turtle#language' \
|
88
70
|
--output lib/rdf/turtle/meta.rb
|
89
|
-
|
90
|
-
|
71
|
+
|
72
|
+
Future releases will replace the need for cym using Ruby-native graph inference.
|
73
|
+
|
91
74
|
## Dependencies
|
92
75
|
|
93
76
|
* [Ruby](http://ruby-lang.org/) (>= 1.8.7) or (>= 1.8.1 with [Backports][])
|
94
|
-
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.
|
77
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.1)
|
95
78
|
|
96
79
|
## Installation
|
97
80
|
|
@@ -133,4 +116,5 @@ see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
|
133
116
|
[N-Triples]: http://www.w3.org/TR/rdf-testcases/#ntriples
|
134
117
|
[Turtle]: http://www.w3.org/TR/2012/WD-turtle-20120710/
|
135
118
|
[Turtle doc]: http://rubydoc.info/github/ruby-rdf/rdf-turtle/master/file/README.markdown
|
136
|
-
[Turtle EBNF]: http://dvcs.w3.org/hg/rdf/file/8610b8f58685/rdf-turtle/turtle.bnf
|
119
|
+
[Turtle EBNF]: http://dvcs.w3.org/hg/rdf/file/8610b8f58685/rdf-turtle/turtle.bnf
|
120
|
+
[Swap]: http://www.w3.org/2000/10/swap/
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.1
|
data/lib/ebnf.rb
CHANGED
@@ -8,7 +8,7 @@ require 'strscan'
|
|
8
8
|
# to allow for coloquial variations (such as in the Turtle syntax).
|
9
9
|
#
|
10
10
|
# A rule takes the following form:
|
11
|
-
# [1] symbol ::= expression
|
11
|
+
# \[1\] symbol ::= expression
|
12
12
|
#
|
13
13
|
# Comments include the content between '/*' and '*/'
|
14
14
|
#
|
@@ -25,47 +25,46 @@ require 'strscan'
|
|
25
25
|
# grammar in the XML specification has been a long, tedious manual
|
26
26
|
# process. Only when the loop is closed between a fully formal grammar
|
27
27
|
# and a large test data set can we be confident that we have an accurate
|
28
|
-
# specification of a language
|
28
|
+
# specification of a language (and even then, only the syntax of the language).
|
29
29
|
#
|
30
30
|
#
|
31
|
-
# The grammar in the
|
31
|
+
# The grammar in the [N3 design note][] has evolved based on the original
|
32
32
|
# manual transcription into a python recursive-descent parser and
|
33
33
|
# subsequent development of test cases. Rather than maintain the grammar
|
34
|
-
# and the parser independently, our
|
34
|
+
# and the parser independently, our [goal] is to formalize the language
|
35
35
|
# syntax sufficiently to replace the manual implementation with one
|
36
36
|
# derived mechanically from the specification.
|
37
37
|
#
|
38
38
|
#
|
39
|
-
#
|
40
|
-
# .. _N3 design note: http://www.w3.org/DesignIssues/Notation3
|
39
|
+
# [N3 design note]: http://www.w3.org/DesignIssues/Notation3
|
41
40
|
#
|
42
41
|
# Related Work
|
43
42
|
# ------------
|
44
43
|
#
|
45
|
-
# Sean Palmer's
|
44
|
+
# Sean Palmer's [n3p announcement][] demonstrated the feasibility of the
|
46
45
|
# approach, though that work did not cover some aspects of N3.
|
47
46
|
#
|
48
|
-
# In development of the
|
49
|
-
# developed
|
47
|
+
# In development of the [SPARQL specification][], Eric Prud'hommeaux
|
48
|
+
# developed [Yacker][], which converts EBNF syntax to perl and C and C++
|
50
49
|
# yacc grammars. It includes an interactive facility for checking
|
51
50
|
# strings against the resulting grammars.
|
52
|
-
# Yosi Scharf used it in
|
51
|
+
# Yosi Scharf used it in [cwm Release 1.1.0rc1][], which includes
|
53
52
|
# a SPAQRL parser that is *almost* completely mechanically generated.
|
54
53
|
#
|
55
54
|
# The N3/turtle output from yacker is lower level than the EBNF notation
|
56
55
|
# from the XML specification; it has the ?, +, and * operators compiled
|
57
56
|
# down to pure context-free rules, obscuring the grammar
|
58
57
|
# structure. Since that transformation is straightforwardly expressed in
|
59
|
-
# semantic web rules (see bnf-rules.
|
58
|
+
# semantic web rules (see [bnf-rules.n3][]), it seems best to keep the RDF
|
60
59
|
# expression of the grammar in terms of the higher level EBNF
|
61
60
|
# constructs.
|
62
61
|
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
62
|
+
# [goal]: http://www.w3.org/2002/02/mid/1086902566.21030.1479.camel@dirk;list=public-cwm-bugs
|
63
|
+
# [n3p announcement]: http://lists.w3.org/Archives/Public/public-cwm-talk/2004OctDec/0029.html
|
64
|
+
# [Yacker]: http://www.w3.org/1999/02/26-modules/User/Yacker
|
65
|
+
# [SPARQL specification]: http://www.w3.org/TR/rdf-sparql-query/
|
66
|
+
# [Cwm Release 1.1.0rc1]: http://lists.w3.org/Archives/Public/public-cwm-announce/2005JulSep/0000.html
|
67
|
+
# [bnf-rules.n3]: http://www.w3.org/2000/10/swap/grammar/bnf-rules.n3
|
69
68
|
#
|
70
69
|
# Open Issues and Future Work
|
71
70
|
# ---------------------------
|
@@ -76,57 +75,56 @@ require 'strscan'
|
|
76
75
|
# captured formally.
|
77
76
|
#
|
78
77
|
# The schema for the EBNF vocabulary used here (``g:seq``, ``g:alt``, ...)
|
79
|
-
# is not yet published; it should be aligned with
|
80
|
-
# and the bnf2html.
|
78
|
+
# is not yet published; it should be aligned with [swap/grammar/bnf][]
|
79
|
+
# and the [bnf2html.n3][] rules (and/or the style of linked XHTML grammar
|
81
80
|
# in the SPARQL and XML specificiations).
|
82
81
|
#
|
83
82
|
# It would be interesting to corroborate the claim in the SPARQL spec
|
84
83
|
# that the grammar is LL(1) with a mechanical proof based on N3 rules.
|
85
84
|
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
85
|
+
# [swap/grammar/bnf]: http://www.w3.org/2000/10/swap/grammar/bnf
|
86
|
+
# [bnf2html.n3]: http://www.w3.org/2000/10/swap/grammar/bnf2html.n3
|
90
87
|
#
|
91
88
|
# Background
|
92
89
|
# ----------
|
93
90
|
#
|
94
|
-
# The
|
91
|
+
# The [N3 Primer] by Tim Berners-Lee introduces RDF and the Semantic
|
95
92
|
# web using N3, a teaching and scribbling language. Turtle is a subset
|
96
93
|
# of N3 that maps directly to (and from) the standard XML syntax for
|
97
94
|
# RDF.
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
# .. _N3 Primer: _http://www.w3.org/2000/10/swap/Primer.html
|
95
|
+
#
|
96
|
+
# [N3 Primer]: http://www.w3.org/2000/10/swap/Primer.html
|
102
97
|
#
|
103
98
|
# @author Gregg Kellogg
|
104
99
|
class EBNF
|
105
100
|
class Rule
|
106
|
-
# @
|
101
|
+
# @attr_reader [Symbol] sym
|
107
102
|
attr_reader :sym
|
108
|
-
# @
|
103
|
+
# @attr_reader [String] id
|
109
104
|
attr_reader :id
|
110
|
-
# @
|
105
|
+
# @attr_reader [Symbol] kind one of :rule, :token, or :pass
|
111
106
|
attr_accessor :kind
|
112
|
-
# @
|
107
|
+
# @attr_reader [Array] expr
|
113
108
|
attr_reader :expr
|
114
|
-
# @
|
109
|
+
# @attr_reader [String] orig
|
115
110
|
attr_accessor :orig
|
116
111
|
|
117
112
|
# @param [Integer] id
|
118
113
|
# @param [Symbol] sym
|
119
114
|
# @param [Array] expr
|
120
|
-
# @param [String] orig
|
121
115
|
# @param [EBNF] ebnf
|
122
116
|
def initialize(id, sym, expr, ebnf)
|
123
117
|
@id, @sym, @expr, @ebnf = id, sym, expr, ebnf
|
124
118
|
end
|
125
|
-
|
119
|
+
|
120
|
+
# Serializes this rule to an S-Expression
|
121
|
+
# @return [String]
|
126
122
|
def to_sxp
|
127
123
|
[id, sym, kind, expr].to_sxp
|
128
124
|
end
|
129
125
|
|
126
|
+
# Serializes this rule to an Turtle
|
127
|
+
# @return [String]
|
130
128
|
def to_ttl
|
131
129
|
@ebnf.debug("to_ttl") {inspect}
|
132
130
|
comment = orig.strip.
|
@@ -193,21 +191,21 @@ class EBNF
|
|
193
191
|
# turn an XML BNF character class into an N3 literal for that
|
194
192
|
# character class (less the outer quote marks)
|
195
193
|
#
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
200
|
-
#
|
201
|
-
#
|
202
|
-
#
|
203
|
-
#
|
204
|
-
#
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
210
|
-
#
|
194
|
+
# >>> cclass("^<>'{}|^`")
|
195
|
+
# "[^<>'{}|^`]"
|
196
|
+
# >>> cclass("#x0300-#x036F")
|
197
|
+
# "[\\u0300-\\u036F]"
|
198
|
+
# >>> cclass("#xC0-#xD6")
|
199
|
+
# "[\\u00C0-\\u00D6]"
|
200
|
+
# >>> cclass("#x370-#x37D")
|
201
|
+
# "[\\u0370-\\u037D]"
|
202
|
+
#
|
203
|
+
# as in: ECHAR ::= '\' [tbnrf\"']
|
204
|
+
# >>> cclass("tbnrf\\\"'")
|
205
|
+
# 'tbnrf\\\\\\"\''
|
206
|
+
#
|
207
|
+
# >>> cclass("^#x22#x5C#x0A#x0D")
|
208
|
+
# '^\\u0022\\\\\\u005C\\u000A\\u000D'
|
211
209
|
def cclass(txt)
|
212
210
|
'[' +
|
213
211
|
txt.gsub(/\#x[0-9a-fA-F]+/) do |hx|
|
@@ -229,6 +227,9 @@ class EBNF
|
|
229
227
|
# in S-Expressions (similar to SPARQL SSE)
|
230
228
|
#
|
231
229
|
# @param [#read, #to_s] input
|
230
|
+
# @param [Hash{Symbol => Object}] options
|
231
|
+
# @option options [Boolean, Array] :debug
|
232
|
+
# Output debug information to an array or STDOUT.
|
232
233
|
def initialize(input, options = {})
|
233
234
|
@options = options
|
234
235
|
@lineno, @depth = 1, 0
|
@@ -264,6 +265,7 @@ class EBNF
|
|
264
265
|
|
265
266
|
##
|
266
267
|
# Write out parsed syntax string as an S-Expression
|
268
|
+
# @return [String]
|
267
269
|
def to_sxp
|
268
270
|
begin
|
269
271
|
require 'sxp'
|
@@ -276,6 +278,7 @@ class EBNF
|
|
276
278
|
##
|
277
279
|
# Write out syntax tree as Turtle
|
278
280
|
# @param [String] prefix for language
|
281
|
+
# @param [String] ns URI for language
|
279
282
|
# @return [String]
|
280
283
|
def to_ttl(prefix, ns)
|
281
284
|
token = false
|
@@ -302,7 +305,7 @@ class EBNF
|
|
302
305
|
|
303
306
|
##
|
304
307
|
# Iterate over rule strings.
|
305
|
-
# a line that starts with '[' or '@' starts a new rule
|
308
|
+
# a line that starts with '\[' or '@' starts a new rule
|
306
309
|
#
|
307
310
|
# @param [StringScanner] scanner
|
308
311
|
# @yield rule_string
|
@@ -368,31 +371,31 @@ class EBNF
|
|
368
371
|
#
|
369
372
|
# @example
|
370
373
|
# >>> ebnf("a b c")
|
371
|
-
# ((seq, [('id', 'a'), ('id', 'b'), ('id', 'c')]), '')
|
374
|
+
# ((seq, \[('id', 'a'), ('id', 'b'), ('id', 'c')\]), '')
|
372
375
|
#
|
373
376
|
# >>> ebnf("a? b+ c*")
|
374
|
-
# ((seq, [(opt, ('id', 'a')), (plus, ('id', 'b')), ('*', ('id', 'c'))]), '')
|
377
|
+
# ((seq, \[(opt, ('id', 'a')), (plus, ('id', 'b')), ('*', ('id', 'c'))\]), '')
|
375
378
|
#
|
376
379
|
# >>> ebnf(" | x xlist")
|
377
|
-
# ((alt, [(seq, []), (seq, [('id', 'x'), ('id', 'xlist')])]), '')
|
380
|
+
# ((alt, \[(seq, \[\]), (seq, \[('id', 'x'), ('id', 'xlist')\])\]), '')
|
378
381
|
#
|
379
382
|
# >>> ebnf("a | (b - c)")
|
380
|
-
# ((alt, [('id', 'a'), (diff, [('id', 'b'), ('id', 'c')])]), '')
|
383
|
+
# ((alt, \[('id', 'a'), (diff, \[('id', 'b'), ('id', 'c')\])\]), '')
|
381
384
|
#
|
382
385
|
# >>> ebnf("a b | c d")
|
383
|
-
# ((alt, [(seq, [('id', 'a'), ('id', 'b')]), (seq, [('id', 'c'), ('id', 'd')])]), '')
|
386
|
+
# ((alt, \[(seq, \[('id', 'a'), ('id', 'b')\]), (seq, \[('id', 'c'), ('id', 'd')\])\]), '')
|
384
387
|
#
|
385
388
|
# >>> ebnf("a | b | c")
|
386
|
-
# ((alt, [('id', 'a'), ('id', 'b'), ('id', 'c')]), '')
|
389
|
+
# ((alt, \[('id', 'a'), ('id', 'b'), ('id', 'c')\]), '')
|
387
390
|
#
|
388
391
|
# >>> ebnf("a) b c")
|
389
392
|
# (('id', 'a'), ' b c')
|
390
393
|
#
|
391
394
|
# >>> ebnf("BaseDecl? PrefixDecl*")
|
392
|
-
# ((seq, [(opt, ('id', 'BaseDecl')), ('*', ('id', 'PrefixDecl'))]), '')
|
395
|
+
# ((seq, \[(opt, ('id', 'BaseDecl')), ('*', ('id', 'PrefixDecl'))\]), '')
|
393
396
|
#
|
394
|
-
# >>> ebnf("NCCHAR1 | diff | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]")
|
395
|
-
# ((alt, [('id', 'NCCHAR1'), ("'", diff), (range, '0-9'), (hex, '#x00B7'), (range, '#x0300-#x036F'), (range, '#x203F-#x2040')]), '')
|
397
|
+
# >>> ebnf("NCCHAR1 | diff | [0-9] | #x00B7 | [#x0300-#x036F] | \[#x203F-#x2040\]")
|
398
|
+
# ((alt, \[('id', 'NCCHAR1'), ("'", diff), (range, '0-9'), (hex, '#x00B7'), (range, '#x0300-#x036F'), (range, '#x203F-#x2040')\]), '')
|
396
399
|
#
|
397
400
|
# @param [String] s
|
398
401
|
# @return [Array]
|
@@ -411,7 +414,7 @@ class EBNF
|
|
411
414
|
##
|
412
415
|
# Parse alt
|
413
416
|
# >>> alt("a | b | c")
|
414
|
-
# ((alt, [('id', 'a'), ('id', 'b'), ('id', 'c')]), '')
|
417
|
+
# ((alt, \[('id', 'a'), ('id', 'b'), ('id', 'c')\]), '')
|
415
418
|
# @param [String] s
|
416
419
|
# @return [Array]
|
417
420
|
def alt(s)
|
@@ -438,10 +441,10 @@ class EBNF
|
|
438
441
|
# parse seq
|
439
442
|
#
|
440
443
|
# >>> seq("a b c")
|
441
|
-
# ((seq, [('id', 'a'), ('id', 'b'), ('id', 'c')]), '')
|
444
|
+
# ((seq, \[('id', 'a'), ('id', 'b'), ('id', 'c')\]), '')
|
442
445
|
#
|
443
446
|
# >>> seq("a b? c")
|
444
|
-
# ((seq, [('id', 'a'), (opt, ('id', 'b')), ('id', 'c')]), '')
|
447
|
+
# ((seq, \[('id', 'a'), (opt, ('id', 'b')), ('id', 'c')\]), '')
|
445
448
|
def seq(s)
|
446
449
|
debug("seq") {"(#{s.inspect})"}
|
447
450
|
args = []
|
@@ -468,7 +471,7 @@ class EBNF
|
|
468
471
|
# parse diff
|
469
472
|
#
|
470
473
|
# >>> diff("a - b")
|
471
|
-
# ((diff, [('id', 'a'), ('id', 'b')]), '')
|
474
|
+
# ((diff, \[('id', 'a'), ('id', 'b')\]), '')
|
472
475
|
def diff(s)
|
473
476
|
debug("diff") {"(#{s.inspect})"}
|
474
477
|
e1, s = depth {postfix(s)}
|
@@ -513,7 +516,7 @@ class EBNF
|
|
513
516
|
end
|
514
517
|
[e, s]
|
515
518
|
end
|
516
|
-
|
519
|
+
|
517
520
|
##
|
518
521
|
# parse primary
|
519
522
|
#
|
@@ -550,10 +553,10 @@ class EBNF
|
|
550
553
|
# ((range, '0-9'), '')
|
551
554
|
# >>> token("#x00B7")
|
552
555
|
# ((hex, '#x00B7'), '')
|
553
|
-
# >>> token ("[#x0300-#x036F]")
|
556
|
+
# >>> token ("\[#x0300-#x036F\]")
|
554
557
|
# ((range, '#x0300-#x036F'), '')
|
555
|
-
# >>> token("[^<>'{}
|
556
|
-
# ((range, "^<>'{}|^`"), '
|
558
|
+
# >>> token("\[^<>'{}|^`\]-\[#x00-#x20\]")
|
559
|
+
# ((range, "^<>'{}|^`"), '-\[#x00-#x20\]')
|
557
560
|
def token(s)
|
558
561
|
s = s.strip
|
559
562
|
case m = s[0,1]
|
@@ -601,9 +604,15 @@ class EBNF
|
|
601
604
|
|
602
605
|
##
|
603
606
|
# Progress output when debugging
|
604
|
-
#
|
605
|
-
#
|
606
|
-
#
|
607
|
+
#
|
608
|
+
# @overload debug(node, message)
|
609
|
+
# @param [String] node relative location in input
|
610
|
+
# @param [String] message ("")
|
611
|
+
#
|
612
|
+
# @overload debug(message)
|
613
|
+
# @param [String] message ("")
|
614
|
+
#
|
615
|
+
# @yieldreturn [String] added to message
|
607
616
|
def debug(*args)
|
608
617
|
return unless @options[:debug]
|
609
618
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
data/lib/rdf/ll1/scanner.rb
CHANGED
@@ -4,16 +4,16 @@ module RDF::LL1
|
|
4
4
|
##
|
5
5
|
# Overload StringScanner with file operations
|
6
6
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
# Reloads scanner as required until EOF.
|
7
|
+
# * Reloads scanner as required until EOF.
|
10
8
|
# * Loads to a high-water and reloads when remaining size reaches a low-water.
|
9
|
+
#
|
10
|
+
# FIXME: Only implements the subset required by the Lexer for now.
|
11
11
|
class Scanner < StringScanner
|
12
12
|
HIGH_WATER = 10240
|
13
13
|
LOW_WATER = 2048 # Hopefully large enough to deal with long multi-line comments
|
14
14
|
|
15
15
|
##
|
16
|
-
# @
|
16
|
+
# @attr_reader [IO, StringIO]
|
17
17
|
attr_reader :input
|
18
18
|
|
19
19
|
##
|
data/lib/rdf/turtle/reader.rb
CHANGED
@@ -370,9 +370,14 @@ module RDF::Turtle
|
|
370
370
|
|
371
371
|
##
|
372
372
|
# Progress output when debugging
|
373
|
-
#
|
374
|
-
# param [String]
|
375
|
-
#
|
373
|
+
# @overload debug(node, message)
|
374
|
+
# @param [String] node relative location in input
|
375
|
+
# @param [String] message ("")
|
376
|
+
#
|
377
|
+
# @overload debug(message)
|
378
|
+
# @param [String] message ("")
|
379
|
+
#
|
380
|
+
# @yieldreturn [String] added to message
|
376
381
|
def debug(*args)
|
377
382
|
return unless @options[:debug] || RDF::Turtle.debug?
|
378
383
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
data/lib/rdf/turtle/terminals.rb
CHANGED
@@ -14,7 +14,6 @@ module RDF::Turtle
|
|
14
14
|
[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]|[\\u{10000}-\\u{EFFFF}]
|
15
15
|
EOS
|
16
16
|
U_CHARS2 = Regexp.compile("\\u00B7|[\\u0300-\\u036F]|[\\u203F-\\u2040]")
|
17
|
-
# [^<>\"{}|^`\\] - [#x00-#x20]
|
18
17
|
IRI_RANGE = Regexp.compile("[[^<>\"{}|^`\\\\]&&[^\\x00-\\x20]]")
|
19
18
|
else
|
20
19
|
##
|
@@ -60,64 +59,64 @@ module RDF::Turtle
|
|
60
59
|
EOS
|
61
60
|
end
|
62
61
|
|
63
|
-
#
|
62
|
+
# 27
|
64
63
|
UCHAR = RDF::LL1::Lexer::UCHAR
|
65
|
-
#
|
64
|
+
# 170s
|
66
65
|
PERCENT = /%[0-9A-Fa-f]{2}/
|
67
|
-
#
|
66
|
+
# 172s
|
68
67
|
PN_LOCAL_ESC = /\\[_~\.\-\!$\&'\(\)\*\+,;=:\/\?\#@%]/
|
69
|
-
#
|
68
|
+
# 169s
|
70
69
|
PLX = /#{PERCENT}|#{PN_LOCAL_ESC}/
|
71
|
-
#
|
70
|
+
# 163s
|
72
71
|
PN_CHARS_BASE = /[A-Z]|[a-z]|#{U_CHARS1}/
|
73
|
-
#
|
72
|
+
# 164s
|
74
73
|
PN_CHARS_U = /_|#{PN_CHARS_BASE}/
|
75
|
-
#
|
74
|
+
# 166s
|
76
75
|
PN_CHARS = /-|[0-9]|#{PN_CHARS_U}|#{U_CHARS2}/
|
77
76
|
PN_LOCAL_BODY = /(?:(?:\.|:|#{PN_CHARS}|#{PLX})*(?:#{PN_CHARS}|:|#{PLX}))?/
|
78
77
|
PN_CHARS_BODY = /(?:(?:\.|#{PN_CHARS})*#{PN_CHARS})?/
|
79
|
-
#
|
78
|
+
# 167s
|
80
79
|
PN_PREFIX = /#{PN_CHARS_BASE}#{PN_CHARS_BODY}/
|
81
|
-
#
|
80
|
+
# 100s
|
82
81
|
PN_LOCAL = /(?:[0-9]|:|#{PN_CHARS_U}|#{PLX})#{PN_LOCAL_BODY}/
|
83
|
-
#
|
82
|
+
# 154s
|
84
83
|
EXPONENT = /[eE][+-]?[0-9]+/
|
85
|
-
#
|
84
|
+
# 159s
|
86
85
|
ECHAR = /\\[tbnrf\\"']/
|
87
|
-
#
|
86
|
+
# 19
|
88
87
|
IRIREF = /<(?:#{IRI_RANGE}|#{UCHAR})*>/
|
89
|
-
#
|
88
|
+
# 139s
|
90
89
|
PNAME_NS = /#{PN_PREFIX}?:/
|
91
|
-
#
|
90
|
+
# 140s
|
92
91
|
PNAME_LN = /#{PNAME_NS}#{PN_LOCAL}/
|
93
|
-
#
|
92
|
+
# 141s
|
94
93
|
BLANK_NODE_LABEL = /_:(?:[0-9]|#{PN_CHARS_U})(#{PN_CHARS}|\.)*/
|
95
|
-
#
|
94
|
+
# 144s
|
96
95
|
LANGTAG = /@[a-zA-Z]+(?:-[a-zA-Z0-9]+)*/
|
97
|
-
#
|
96
|
+
# 20
|
98
97
|
INTEGER = /[+-]?[0-9]+/
|
99
|
-
#
|
98
|
+
# 21
|
100
99
|
DECIMAL = /[+-]?(?:[0-9]*\.[0-9]+)/
|
101
|
-
#
|
100
|
+
# 22
|
102
101
|
DOUBLE = /[+-]?(?:[0-9]+\.[0-9]*#{EXPONENT}|\.?[0-9]+#{EXPONENT})/
|
103
|
-
#
|
102
|
+
# 23
|
104
103
|
STRING_LITERAL_QUOTE = /'(?:[^\'\\\n\r]|#{ECHAR}|#{UCHAR})*'/
|
105
|
-
#
|
104
|
+
# 24
|
106
105
|
STRING_LITERAL_SINGLE_QUOTE = /"(?:[^\"\\\n\r]|#{ECHAR}|#{UCHAR})*"/
|
107
|
-
#
|
106
|
+
# 25
|
108
107
|
STRING_LITERAL_LONG_SINGLE_QUOTE = /'''(?:(?:'|'')?(?:[^'\\]|#{ECHAR}|#{UCHAR}))*'''/m
|
109
|
-
#
|
108
|
+
# 26
|
110
109
|
STRING_LITERAL_LONG_QUOTE = /"""(?:(?:"|"")?(?:[^"\\]|#{ECHAR}|#{UCHAR}))*"""/m
|
111
110
|
|
112
|
-
#
|
111
|
+
# 161s
|
113
112
|
WS = / |\t|\r|\n /
|
114
|
-
#
|
113
|
+
# 160s
|
115
114
|
NIL = /\(#{WS}*\)/
|
116
|
-
#
|
115
|
+
# 162s
|
117
116
|
ANON = /\[#{WS}*\]/
|
118
|
-
#
|
117
|
+
# 28t
|
119
118
|
SPARQL_PREFIX = /prefix/i
|
120
|
-
#
|
119
|
+
# 29t
|
121
120
|
SPARQL_BASE = /base/i
|
122
121
|
|
123
122
|
end
|
data/lib/rdf/turtle/writer.rb
CHANGED
@@ -75,7 +75,7 @@ module RDF::Turtle
|
|
75
75
|
# @option options [Boolean] :standard_prefixes (false)
|
76
76
|
# Add standard prefixes to @prefixes, if necessary.
|
77
77
|
# @option options [String] :default_namespace (nil)
|
78
|
-
# URI to use as default namespace, same as prefixes[nil]
|
78
|
+
# URI to use as default namespace, same as `prefixes[nil]`
|
79
79
|
# @yield [writer] `self`
|
80
80
|
# @yieldparam [RDF::Writer] writer
|
81
81
|
# @yieldreturn [void]
|
@@ -286,7 +286,7 @@ module RDF::Turtle
|
|
286
286
|
def top_classes; [RDF::RDFS.Class]; end
|
287
287
|
|
288
288
|
# Defines order of predicates to to emit at begninning of a resource description. Defaults to
|
289
|
-
# [rdf:type, rdfs:label, dc:title]
|
289
|
+
# `\[rdf:type, rdfs:label, dc:title\]`
|
290
290
|
# @return [Array<URI>]
|
291
291
|
def predicate_order; [RDF.type, RDF::RDFS.label, RDF::DC.title]; end
|
292
292
|
|
@@ -393,8 +393,10 @@ module RDF::Turtle
|
|
393
393
|
|
394
394
|
##
|
395
395
|
# Add debug event to debug array, if specified
|
396
|
-
#
|
397
|
-
#
|
396
|
+
#
|
397
|
+
# @overload debug(message)
|
398
|
+
# @param [String] message ("")
|
399
|
+
# @yieldreturn [String] added to message
|
398
400
|
def debug(*args)
|
399
401
|
return unless @options[:debug] || RDF::Turtle.debug?
|
400
402
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
metadata
CHANGED
@@ -1,221 +1,166 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdf-turtle
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
- 0
|
10
|
-
version: 0.3.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Gregg Kellogg
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-11-30 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rdf
|
22
|
-
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
23
17
|
none: false
|
24
|
-
requirements:
|
25
|
-
- -
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
segments:
|
29
|
-
- 0
|
30
|
-
- 3
|
31
|
-
- 4
|
32
|
-
version: 0.3.4
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.3.11
|
33
22
|
type: :runtime
|
34
|
-
requirement: *id001
|
35
23
|
prerelease: false
|
36
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.3.11
|
30
|
+
- !ruby/object:Gem::Dependency
|
37
31
|
name: open-uri-cached
|
38
|
-
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
39
33
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
hash: 23
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
- 0
|
47
|
-
- 4
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
48
37
|
version: 0.0.4
|
49
38
|
type: :development
|
50
|
-
requirement: *id002
|
51
39
|
prerelease: false
|
52
|
-
|
53
|
-
name: spira
|
54
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
41
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
|
61
|
-
- 0
|
62
|
-
- 0
|
63
|
-
- 12
|
64
|
-
version: 0.0.12
|
65
|
-
type: :development
|
66
|
-
requirement: *id003
|
67
|
-
prerelease: false
|
68
|
-
- !ruby/object:Gem::Dependency
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.0.4
|
46
|
+
- !ruby/object:Gem::Dependency
|
69
47
|
name: rspec
|
70
|
-
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
71
49
|
none: false
|
72
|
-
requirements:
|
73
|
-
- -
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
|
76
|
-
segments:
|
77
|
-
- 2
|
78
|
-
- 8
|
79
|
-
- 0
|
80
|
-
version: 2.8.0
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.12.0
|
81
54
|
type: :development
|
82
|
-
requirement: *id004
|
83
55
|
prerelease: false
|
84
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.12.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
85
63
|
name: rdf-isomorphic
|
86
|
-
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
87
65
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
hash: 27
|
92
|
-
segments:
|
93
|
-
- 0
|
94
|
-
- 3
|
95
|
-
- 4
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
96
69
|
version: 0.3.4
|
97
70
|
type: :development
|
98
|
-
requirement: *id005
|
99
71
|
prerelease: false
|
100
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.3.4
|
78
|
+
- !ruby/object:Gem::Dependency
|
101
79
|
name: json-ld
|
102
|
-
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
103
81
|
none: false
|
104
|
-
requirements:
|
105
|
-
- -
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
|
108
|
-
segments:
|
109
|
-
- 0
|
110
|
-
- 3
|
111
|
-
- 0
|
112
|
-
version: 0.3.0
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.3.1
|
113
86
|
type: :development
|
114
|
-
requirement: *id006
|
115
87
|
prerelease: false
|
116
|
-
|
117
|
-
name: rdf-spec
|
118
|
-
version_requirements: &id007 !ruby/object:Gem::Requirement
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
89
|
none: false
|
120
|
-
requirements:
|
121
|
-
- -
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
|
124
|
-
|
125
|
-
- 0
|
126
|
-
- 3
|
127
|
-
- 4
|
128
|
-
version: 0.3.4
|
129
|
-
type: :development
|
130
|
-
requirement: *id007
|
131
|
-
prerelease: false
|
132
|
-
- !ruby/object:Gem::Dependency
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.3.1
|
94
|
+
- !ruby/object:Gem::Dependency
|
133
95
|
name: yard
|
134
|
-
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
135
97
|
none: false
|
136
|
-
requirements:
|
137
|
-
- -
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
|
140
|
-
segments:
|
141
|
-
- 0
|
142
|
-
- 6
|
143
|
-
- 0
|
144
|
-
version: 0.6.0
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.8.3
|
145
102
|
type: :development
|
146
|
-
requirement: *id008
|
147
103
|
prerelease: false
|
148
|
-
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.8.3
|
110
|
+
- !ruby/object:Gem::Dependency
|
149
111
|
name: sxp
|
150
|
-
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
151
113
|
none: false
|
152
|
-
requirements:
|
153
|
-
- -
|
154
|
-
- !ruby/object:Gem::Version
|
155
|
-
hash: 3
|
156
|
-
segments:
|
157
|
-
- 0
|
158
|
-
- 0
|
159
|
-
- 14
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
160
117
|
version: 0.0.14
|
161
118
|
type: :development
|
162
|
-
requirement: *id009
|
163
119
|
prerelease: false
|
164
|
-
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.0.14
|
126
|
+
- !ruby/object:Gem::Dependency
|
165
127
|
name: rdf-spec
|
166
|
-
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
167
129
|
none: false
|
168
|
-
requirements:
|
169
|
-
- -
|
170
|
-
- !ruby/object:Gem::Version
|
171
|
-
|
172
|
-
segments:
|
173
|
-
- 0
|
174
|
-
- 3
|
175
|
-
- 8
|
176
|
-
version: 0.3.8
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.3.1
|
177
134
|
type: :development
|
178
|
-
requirement: *id010
|
179
135
|
prerelease: false
|
180
|
-
|
181
|
-
name: rspec
|
182
|
-
version_requirements: &id011 !ruby/object:Gem::Requirement
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
137
|
none: false
|
184
|
-
requirements:
|
185
|
-
- -
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
|
188
|
-
|
189
|
-
- 2
|
190
|
-
- 11
|
191
|
-
- 0
|
192
|
-
version: 2.11.0
|
193
|
-
type: :development
|
194
|
-
requirement: *id011
|
195
|
-
prerelease: false
|
196
|
-
- !ruby/object:Gem::Dependency
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.3.1
|
142
|
+
- !ruby/object:Gem::Dependency
|
197
143
|
name: rake
|
198
|
-
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
199
145
|
none: false
|
200
|
-
requirements:
|
201
|
-
- -
|
202
|
-
- !ruby/object:Gem::Version
|
203
|
-
|
204
|
-
segments:
|
205
|
-
- 0
|
206
|
-
version: "0"
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
207
150
|
type: :development
|
208
|
-
requirement: *id012
|
209
151
|
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
210
158
|
description: RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite.
|
211
159
|
email: public-rdf-ruby@w3.org
|
212
160
|
executables: []
|
213
|
-
|
214
161
|
extensions: []
|
215
|
-
|
216
162
|
extra_rdoc_files: []
|
217
|
-
|
218
|
-
files:
|
163
|
+
files:
|
219
164
|
- AUTHORS
|
220
165
|
- README.markdown
|
221
166
|
- History
|
@@ -233,40 +178,29 @@ files:
|
|
233
178
|
- lib/rdf/turtle/writer.rb
|
234
179
|
- lib/rdf/turtle.rb
|
235
180
|
homepage: http://github.com/ruby-rdf/rdf-turtle
|
236
|
-
licenses:
|
181
|
+
licenses:
|
237
182
|
- Public Domain
|
238
183
|
post_install_message:
|
239
184
|
rdoc_options: []
|
240
|
-
|
241
|
-
require_paths:
|
185
|
+
require_paths:
|
242
186
|
- lib
|
243
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
187
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
244
188
|
none: false
|
245
|
-
requirements:
|
246
|
-
- -
|
247
|
-
- !ruby/object:Gem::Version
|
248
|
-
hash: 53
|
249
|
-
segments:
|
250
|
-
- 1
|
251
|
-
- 8
|
252
|
-
- 1
|
189
|
+
requirements:
|
190
|
+
- - ! '>='
|
191
|
+
- !ruby/object:Gem::Version
|
253
192
|
version: 1.8.1
|
254
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
193
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
255
194
|
none: false
|
256
|
-
requirements:
|
257
|
-
- -
|
258
|
-
- !ruby/object:Gem::Version
|
259
|
-
|
260
|
-
segments:
|
261
|
-
- 0
|
262
|
-
version: "0"
|
195
|
+
requirements:
|
196
|
+
- - ! '>='
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '0'
|
263
199
|
requirements: []
|
264
|
-
|
265
200
|
rubyforge_project: rdf-turtle
|
266
201
|
rubygems_version: 1.8.24
|
267
202
|
signing_key:
|
268
203
|
specification_version: 3
|
269
204
|
summary: Turtle reader/writer for Ruby.
|
270
205
|
test_files: []
|
271
|
-
|
272
206
|
has_rdoc: false
|