shex 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/shex/meta.rb CHANGED
@@ -1,4 +1,4 @@
1
- # This file is automatically generated by ebnf version 2.1.3
1
+ # This file is automatically generated by ebnf version 2.2.1
2
2
  # Derived from etc/shex.ebnf
3
3
  module ShEx::Meta
4
4
  RULES = [
@@ -8,34 +8,21 @@ module ShEx::Meta
8
8
  EBNF::Rule.new(:_shexDoc_3, "1.3", [:seq, :_shexDoc_4, :_shexDoc_5]).extend(EBNF::PEG::Rule),
9
9
  EBNF::Rule.new(:_shexDoc_4, "1.4", [:alt, :notStartAction, :startActions]).extend(EBNF::PEG::Rule),
10
10
  EBNF::Rule.new(:_shexDoc_5, "1.5", [:star, :statement]).extend(EBNF::PEG::Rule),
11
- EBNF::Rule.new(:directive, "2", [:alt, :baseDecl, :prefixDecl]).extend(EBNF::PEG::Rule),
11
+ EBNF::Rule.new(:directive, "2", [:alt, :baseDecl, :prefixDecl, :importDecl]).extend(EBNF::PEG::Rule),
12
12
  EBNF::Rule.new(:baseDecl, "3", [:seq, "BASE", :IRIREF]).extend(EBNF::PEG::Rule),
13
13
  EBNF::Rule.new(:prefixDecl, "4", [:seq, "PREFIX", :PNAME_NS, :IRIREF]).extend(EBNF::PEG::Rule),
14
+ EBNF::Rule.new(:importDecl, "4.5", [:seq, "IMPORT", :IRIREF]).extend(EBNF::PEG::Rule),
14
15
  EBNF::Rule.new(:notStartAction, "5", [:alt, :start, :shapeExprDecl]).extend(EBNF::PEG::Rule),
15
- EBNF::Rule.new(:start, "6", [:seq, "START", "=", :_start_1, :_start_2, :_start_3]).extend(EBNF::PEG::Rule),
16
- EBNF::Rule.new(:_start_1, "6.1", [:opt, "NOT"]).extend(EBNF::PEG::Rule),
17
- EBNF::Rule.new(:_start_2, "6.2", [:alt, :shapeAtomNoRef, :shapeRef]).extend(EBNF::PEG::Rule),
18
- EBNF::Rule.new(:_start_3, "6.3", [:opt, :shapeOr]).extend(EBNF::PEG::Rule),
16
+ EBNF::Rule.new(:start, "6", [:seq, "START", "=", :inlineShapeExpression]).extend(EBNF::PEG::Rule),
19
17
  EBNF::Rule.new(:startActions, "7", [:plus, :codeDecl]).extend(EBNF::PEG::Rule),
20
18
  EBNF::Rule.new(:statement, "8", [:alt, :directive, :notStartAction]).extend(EBNF::PEG::Rule),
21
19
  EBNF::Rule.new(:shapeExprDecl, "9", [:seq, :shapeExprLabel, :_shapeExprDecl_1]).extend(EBNF::PEG::Rule),
22
20
  EBNF::Rule.new(:_shapeExprDecl_1, "9.1", [:alt, :shapeExpression, "EXTERNAL"]).extend(EBNF::PEG::Rule),
23
- EBNF::Rule.new(:shapeExpression, "10", [:alt, :_shapeExpression_1, :_shapeExpression_2, :_shapeExpression_3]).extend(EBNF::PEG::Rule),
24
- EBNF::Rule.new(:_shapeExpression_1, "10.1", [:seq, :_shapeExpression_4, :shapeAtomNoRef, :_shapeExpression_5]).extend(EBNF::PEG::Rule),
25
- EBNF::Rule.new(:_shapeExpression_4, "10.4", [:opt, "NOT"]).extend(EBNF::PEG::Rule),
26
- EBNF::Rule.new(:_shapeExpression_5, "10.5", [:opt, :shapeOr]).extend(EBNF::PEG::Rule),
27
- EBNF::Rule.new(:_shapeExpression_2, "10.2", [:seq, "NOT", :shapeRef, :_shapeExpression_6]).extend(EBNF::PEG::Rule),
28
- EBNF::Rule.new(:_shapeExpression_6, "10.6", [:opt, :shapeOr]).extend(EBNF::PEG::Rule),
29
- EBNF::Rule.new(:_shapeExpression_3, "10.3", [:seq, :shapeRef, :shapeOr]).extend(EBNF::PEG::Rule),
21
+ EBNF::Rule.new(:shapeExpression, "10", [:seq, :shapeOr]).extend(EBNF::PEG::Rule),
30
22
  EBNF::Rule.new(:inlineShapeExpression, "11", [:seq, :inlineShapeOr]).extend(EBNF::PEG::Rule),
31
- EBNF::Rule.new(:shapeOr, "12", [:alt, :_shapeOr_1, :_shapeOr_2]).extend(EBNF::PEG::Rule),
32
- EBNF::Rule.new(:_shapeOr_1, "12.1", [:plus, :_shapeOr_3]).extend(EBNF::PEG::Rule),
33
- EBNF::Rule.new(:_shapeOr_3, "12.3", [:seq, "OR", :shapeAnd]).extend(EBNF::PEG::Rule),
34
- EBNF::Rule.new(:_shapeOr_2, "12.2", [:seq, :_shapeOr_4, :_shapeOr_5]).extend(EBNF::PEG::Rule),
35
- EBNF::Rule.new(:_shapeOr_4, "12.4", [:plus, :_shapeOr_6]).extend(EBNF::PEG::Rule),
36
- EBNF::Rule.new(:_shapeOr_6, "12.6", [:seq, "AND", :shapeNot]).extend(EBNF::PEG::Rule),
37
- EBNF::Rule.new(:_shapeOr_5, "12.5", [:star, :_shapeOr_7]).extend(EBNF::PEG::Rule),
38
- EBNF::Rule.new(:_shapeOr_7, "12.7", [:seq, "OR", :shapeAnd]).extend(EBNF::PEG::Rule),
23
+ EBNF::Rule.new(:shapeOr, "12", [:seq, :shapeAnd, :_shapeOr_1]).extend(EBNF::PEG::Rule),
24
+ EBNF::Rule.new(:_shapeOr_1, "12.1", [:star, :_shapeOr_2]).extend(EBNF::PEG::Rule),
25
+ EBNF::Rule.new(:_shapeOr_2, "12.2", [:seq, "OR", :shapeAnd]).extend(EBNF::PEG::Rule),
39
26
  EBNF::Rule.new(:inlineShapeOr, "13", [:seq, :inlineShapeAnd, :_inlineShapeOr_1]).extend(EBNF::PEG::Rule),
40
27
  EBNF::Rule.new(:_inlineShapeOr_1, "13.1", [:star, :_inlineShapeOr_2]).extend(EBNF::PEG::Rule),
41
28
  EBNF::Rule.new(:_inlineShapeOr_2, "13.2", [:seq, "OR", :inlineShapeAnd]).extend(EBNF::PEG::Rule),
@@ -71,16 +58,14 @@ module ShEx::Meta
71
58
  EBNF::Rule.new(:inlineShapeOrRef, "22", [:alt, :inlineShapeDefinition, :shapeRef]).extend(EBNF::PEG::Rule),
72
59
  EBNF::Rule.new(:shapeRef, "23", [:alt, :ATPNAME_LN, :ATPNAME_NS, :_shapeRef_1]).extend(EBNF::PEG::Rule),
73
60
  EBNF::Rule.new(:_shapeRef_1, "23.1", [:seq, "@", :shapeExprLabel]).extend(EBNF::PEG::Rule),
74
- EBNF::Rule.new(:litNodeConstraint, "24", [:alt, :_litNodeConstraint_1, :_litNodeConstraint_2, :_litNodeConstraint_3, :_litNodeConstraint_4, :_litNodeConstraint_5]).extend(EBNF::PEG::Rule),
75
- EBNF::Rule.new(:_litNodeConstraint_1, "24.1", [:seq, "LITERAL", :_litNodeConstraint_6]).extend(EBNF::PEG::Rule),
61
+ EBNF::Rule.new(:litNodeConstraint, "24", [:alt, :_litNodeConstraint_1, :_litNodeConstraint_2, :_litNodeConstraint_3, :_litNodeConstraint_4]).extend(EBNF::PEG::Rule),
62
+ EBNF::Rule.new(:_litNodeConstraint_1, "24.1", [:seq, "LITERAL", :_litNodeConstraint_5]).extend(EBNF::PEG::Rule),
63
+ EBNF::Rule.new(:_litNodeConstraint_5, "24.5", [:star, :xsFacet]).extend(EBNF::PEG::Rule),
64
+ EBNF::Rule.new(:_litNodeConstraint_2, "24.2", [:seq, :datatype, :_litNodeConstraint_6]).extend(EBNF::PEG::Rule),
76
65
  EBNF::Rule.new(:_litNodeConstraint_6, "24.6", [:star, :xsFacet]).extend(EBNF::PEG::Rule),
77
- EBNF::Rule.new(:_litNodeConstraint_2, "24.2", [:seq, :nonLiteralKind, :_litNodeConstraint_7]).extend(EBNF::PEG::Rule),
78
- EBNF::Rule.new(:_litNodeConstraint_7, "24.7", [:star, :stringFacet]).extend(EBNF::PEG::Rule),
79
- EBNF::Rule.new(:_litNodeConstraint_3, "24.3", [:seq, :datatype, :_litNodeConstraint_8]).extend(EBNF::PEG::Rule),
80
- EBNF::Rule.new(:_litNodeConstraint_8, "24.8", [:star, :xsFacet]).extend(EBNF::PEG::Rule),
81
- EBNF::Rule.new(:_litNodeConstraint_4, "24.4", [:seq, :valueSet, :_litNodeConstraint_9]).extend(EBNF::PEG::Rule),
82
- EBNF::Rule.new(:_litNodeConstraint_9, "24.9", [:star, :xsFacet]).extend(EBNF::PEG::Rule),
83
- EBNF::Rule.new(:_litNodeConstraint_5, "24.5", [:plus, :numericFacet]).extend(EBNF::PEG::Rule),
66
+ EBNF::Rule.new(:_litNodeConstraint_3, "24.3", [:seq, :valueSet, :_litNodeConstraint_7]).extend(EBNF::PEG::Rule),
67
+ EBNF::Rule.new(:_litNodeConstraint_7, "24.7", [:star, :xsFacet]).extend(EBNF::PEG::Rule),
68
+ EBNF::Rule.new(:_litNodeConstraint_4, "24.4", [:plus, :numericFacet]).extend(EBNF::PEG::Rule),
84
69
  EBNF::Rule.new(:nonLitNodeConstraint, "25", [:alt, :_nonLitNodeConstraint_1, :_nonLitNodeConstraint_2]).extend(EBNF::PEG::Rule),
85
70
  EBNF::Rule.new(:_nonLitNodeConstraint_1, "25.1", [:seq, :nonLiteralKind, :_nonLitNodeConstraint_3]).extend(EBNF::PEG::Rule),
86
71
  EBNF::Rule.new(:_nonLitNodeConstraint_3, "25.3", [:star, :stringFacet]).extend(EBNF::PEG::Rule),
@@ -116,11 +101,10 @@ module ShEx::Meta
116
101
  EBNF::Rule.new(:_groupTripleExpr_3, "40.3", [:opt, :unaryTripleExpr]).extend(EBNF::PEG::Rule),
117
102
  EBNF::Rule.new(:unaryTripleExpr, "43", [:alt, :_unaryTripleExpr_1, :include]).extend(EBNF::PEG::Rule),
118
103
  EBNF::Rule.new(:_unaryTripleExpr_1, "43.1", [:seq, :_unaryTripleExpr_2, :_unaryTripleExpr_3]).extend(EBNF::PEG::Rule),
119
- EBNF::Rule.new(:_unaryTripleExpr_2, "43.2", [:opt, :productionLabel]).extend(EBNF::PEG::Rule),
104
+ EBNF::Rule.new(:_unaryTripleExpr_2, "43.2", [:opt, :_unaryTripleExpr_4]).extend(EBNF::PEG::Rule),
105
+ EBNF::Rule.new(:_unaryTripleExpr_4, "43.4", [:seq, "$", :tripleExprLabel]).extend(EBNF::PEG::Rule),
120
106
  EBNF::Rule.new(:_unaryTripleExpr_3, "43.3", [:alt, :tripleConstraint, :bracketedTripleExpr]).extend(EBNF::PEG::Rule),
121
- EBNF::Rule.new(:productionLabel, "43a", [:seq, "$", :_productionLabel_1]).extend(EBNF::PEG::Rule),
122
- EBNF::Rule.new(:_productionLabel_1, "43a.1", [:alt, :iri, :blankNode]).extend(EBNF::PEG::Rule),
123
- EBNF::Rule.new(:bracketedTripleExpr, "44", [:seq, "(", :oneOfTripleExpr, ")", :_bracketedTripleExpr_1, :_bracketedTripleExpr_2, :semanticActions]).extend(EBNF::PEG::Rule),
107
+ EBNF::Rule.new(:bracketedTripleExpr, "44", [:seq, "(", :tripleExpression, ")", :_bracketedTripleExpr_1, :_bracketedTripleExpr_2, :semanticActions]).extend(EBNF::PEG::Rule),
124
108
  EBNF::Rule.new(:_bracketedTripleExpr_1, "44.1", [:opt, :cardinality]).extend(EBNF::PEG::Rule),
125
109
  EBNF::Rule.new(:_bracketedTripleExpr_2, "44.2", [:star, :annotation]).extend(EBNF::PEG::Rule),
126
110
  EBNF::Rule.new(:tripleConstraint, "45", [:seq, :_tripleConstraint_1, :predicate, :inlineShapeExpression, :_tripleConstraint_2, :_tripleConstraint_3, :semanticActions]).extend(EBNF::PEG::Rule),
@@ -149,10 +133,13 @@ module ShEx::Meta
149
133
  EBNF::Rule.new(:_literalRange_3, "53.3", [:star, :literalExclusion]).extend(EBNF::PEG::Rule),
150
134
  EBNF::Rule.new(:literalExclusion, "54", [:seq, "-", :literal, :_literalExclusion_1]).extend(EBNF::PEG::Rule),
151
135
  EBNF::Rule.new(:_literalExclusion_1, "54.1", [:opt, "~"]).extend(EBNF::PEG::Rule),
152
- EBNF::Rule.new(:languageRange, "55", [:seq, :LANGTAG, :_languageRange_1]).extend(EBNF::PEG::Rule),
153
- EBNF::Rule.new(:_languageRange_1, "55.1", [:opt, :_languageRange_2]).extend(EBNF::PEG::Rule),
154
- EBNF::Rule.new(:_languageRange_2, "55.2", [:seq, "~", :_languageRange_3]).extend(EBNF::PEG::Rule),
155
- EBNF::Rule.new(:_languageRange_3, "55.3", [:star, :languageExclusion]).extend(EBNF::PEG::Rule),
136
+ EBNF::Rule.new(:languageRange, "55", [:alt, :_languageRange_1, :_languageRange_2]).extend(EBNF::PEG::Rule),
137
+ EBNF::Rule.new(:_languageRange_1, "55.1", [:seq, :LANGTAG, :_languageRange_3]).extend(EBNF::PEG::Rule),
138
+ EBNF::Rule.new(:_languageRange_3, "55.3", [:opt, :_languageRange_4]).extend(EBNF::PEG::Rule),
139
+ EBNF::Rule.new(:_languageRange_4, "55.4", [:seq, "~", :_languageRange_5]).extend(EBNF::PEG::Rule),
140
+ EBNF::Rule.new(:_languageRange_5, "55.5", [:star, :languageExclusion]).extend(EBNF::PEG::Rule),
141
+ EBNF::Rule.new(:_languageRange_2, "55.2", [:seq, "@", "~", :_languageRange_6]).extend(EBNF::PEG::Rule),
142
+ EBNF::Rule.new(:_languageRange_6, "55.6", [:star, :languageExclusion]).extend(EBNF::PEG::Rule),
156
143
  EBNF::Rule.new(:languageExclusion, "56", [:seq, "-", :LANGTAG, :_languageExclusion_1]).extend(EBNF::PEG::Rule),
157
144
  EBNF::Rule.new(:_languageExclusion_1, "56.1", [:opt, "~"]).extend(EBNF::PEG::Rule),
158
145
  EBNF::Rule.new(:include, "57", [:seq, "&", :tripleExprLabel]).extend(EBNF::PEG::Rule),
data/lib/shex/parser.rb CHANGED
@@ -21,17 +21,11 @@ module ShEx
21
21
  attr_reader :options
22
22
 
23
23
  ##
24
- # The current input string being processed. XXX
24
+ # The current input string being processed.
25
25
  #
26
26
  # @return [String]
27
27
  attr_accessor :input
28
28
 
29
- ##
30
- # The current input tokens being processed. XXX
31
- #
32
- # @return [Array<Token>]
33
- attr_reader :tokens
34
-
35
29
  ##
36
30
  # The internal representation of the result using hierarchy of RDF objects and ShEx::Operator
37
31
  # objects.
@@ -160,12 +154,12 @@ module ShEx
160
154
  operands += semacts
161
155
  operands += starts
162
156
  operands << expressions.unshift(:shapes) unless expressions.empty?
163
- Algebra::Schema.new(*operands, **options)
157
+ Algebra::Schema.new(*operands, **self.options)
164
158
  end
165
159
  start_production(:_shexDoc_2, as_hash: true)
166
160
  start_production(:_shexDoc_3, as_hash: true)
167
161
 
168
- # [2] directive ::= baseDecl | prefixDecl
162
+ # [2] directive ::= baseDecl | prefixDecl | importDecl
169
163
 
170
164
  # [3] baseDecl ::= "BASE" IRIREF
171
165
  start_production(:baseDecl, as_hash: true, insensitive_strings: :lower)
@@ -182,15 +176,19 @@ module ShEx
182
176
  [:prefix, pfx.to_s, value[:IRIREF]]
183
177
  end
184
178
 
179
+ # [4] importDecl ::= "IMPORT" IRIREF
180
+ start_production(:importDecl, as_hash: true, insensitive_strings: :lower)
181
+ production(:importDecl) do |value|
182
+ Algebra::Import.new(value[:IRIREF], **self.options)
183
+ end
184
+
185
185
  # [5] notStartAction ::= start | shapeExprDecl
186
- # [6] start ::= "START" '=' "NOT"? (shapeAtomNoRef | shapeRef) shapeOr?
186
+ # [6] start ::= "START" '=' inlineShapeExpression
187
187
  start_production(:start, as_hash: true, insensitive_strings: :lower)
188
188
  production(:start) do |value|
189
- expr = value[:_start_2]
190
- expr = value[:_start_3].call(expr) if value[:_start_3]
191
- expr = Algebra::Not.new(expr) if value[:__start_1]
192
- Algebra::Start.new(expr)
189
+ Algebra::Start.new(value[:inlineShapeExpression], **self.options)
193
190
  end
191
+
194
192
  # [7] startActions ::= codeDecl+
195
193
 
196
194
  # [8] statement ::= directive | notStartAction
@@ -203,62 +201,36 @@ module ShEx
203
201
  when Algebra::NodeConstraint, Algebra::Or, Algebra::And, Algebra::Not, Algebra::Shape, RDF::Resource
204
202
  value[:_shapeExprDecl_1]
205
203
  when /external/i
206
- Algebra::External.new()
204
+ Algebra::External.new(**options)
207
205
  else
208
- Algebra::Shape.new()
206
+ Algebra::Shape.new(**options)
209
207
  end
210
208
  expression.id = id if id && !expression.is_a?(RDF::Resource)
211
209
 
212
210
  expression
213
211
  end
214
212
 
215
- # [10] shapeExpression ::= "NOT"? shapeAtomNoRef shapeOr?
216
- # | "NOT" shapeRef shapeOr?
217
- # | shapeRef shapeOr
218
- start_production(:_shapeExpression_1, as_hash: true, insensitive_strings: :lower)
219
- production(:_shapeExpression_1) do |value|
220
- # "NOT"? shapeAtomNoRef shapeOr?
221
- expr = value[:shapeAtomNoRef]
222
- expr = Algebra::Not.new(expr) if value[:_shapeExpression_4]
223
- expr = value[:_shapeExpression_5].call(expr) if value[:_shapeExpression_5]
224
- expr
225
- end
226
- start_production(:_shapeExpression_2, as_hash: true, insensitive_strings: :lower)
227
- production(:_shapeExpression_2) do |value|
228
- # "NOT" shapeRef shapeOr?
229
- expr = Algebra::Not.new(value[:shapeRef])
230
- expr = value[:_shapeExpression_6].call(expr) if value[:_shapeExpression_6]
231
- expr
232
- end
233
- start_production(:_shapeExpression_3, as_hash: true)
234
- production(:_shapeExpression_3) do |value|
235
- # shapeRef shapeOr
236
- value[:shapeOr].call(value[:shapeRef])
213
+ # [10] shapeExpression ::= shapeOr
214
+ production(:shapeExpression) do |value|
215
+ value.first[:shapeOr]
237
216
  end
238
217
 
239
218
  # [11] inlineShapeExpression ::= inlineShapeOr
240
219
  production(:inlineShapeExpression) do |value|
241
220
  value.first[:inlineShapeOr]
242
221
  end
243
- # [12] shapeOr ::= ("OR" shapeAnd)+
244
- # | ("AND" shapeNot)+ ("OR" shapeAnd)*
245
- # As shapeOr has an implicit first parameter from the invoking production's first element, the result is a block which will accept the value of that production and apply it to any RHS expression found here.
246
- start_production(:_shapeOr_1, insensitive_strings: :lower)
247
- production(:_shapeOr_1) do |value|
248
- # ("OR" shapeAnd)+
249
- -> (lhs) {Algebra::Or.new(lhs, *value.map {|v| v.last[:shapeAnd]})}
250
- end
251
- start_production(:_shapeOr_2, as_hash: true, insensitive_strings: :lower)
252
- production(:_shapeOr_2) do |value|
253
- # ("AND" shapeNot)+ ("OR" shapeAnd)*
254
- ands = value[:_shapeOr_4].map {|v| v.last[:shapeNot]}
255
- ors = value[:_shapeOr_5].map {|v| v.last[:shapeAnd]}
256
- if ors.empty?
257
- -> (lhs) {Algebra::And.new(lhs, *ands)}
222
+
223
+ # [12] shapeOr ::= shapeAnd ("OR" shapeAnd)*
224
+ start_production(:shapeOr, as_hash: true)
225
+ production(:shapeOr) do |value|
226
+ if value[:_shapeOr_1].empty?
227
+ value[:shapeAnd]
258
228
  else
259
- -> (lhs) {ShapeOr(Algebra::And.new(lhs, ands), *ors)}
229
+ lhs = value[:_shapeOr_1].map {|v| v.last[:shapeAnd]}
230
+ Algebra::Or.new(value[:shapeAnd], *lhs, **self.options)
260
231
  end
261
232
  end
233
+ start_production(:_shapeOr_2, insensitive_strings: :lower)
262
234
 
263
235
  # [13] inlineShapeOr ::= inlineShapeAnd ("OR" inlineShapeAnd)*
264
236
  start_production(:inlineShapeOr, as_hash: true)
@@ -267,7 +239,7 @@ module ShEx
267
239
  value[:inlineShapeAnd]
268
240
  else
269
241
  lhs = value[:_inlineShapeOr_1].map {|v| v.last[:inlineShapeAnd]}
270
- Algebra::Or.new(value[:inlineShapeAnd], *lhs)
242
+ Algebra::Or.new(value[:inlineShapeAnd], *lhs, **self.options)
271
243
  end
272
244
  end
273
245
  start_production(:_inlineShapeOr_2, insensitive_strings: :lower)
@@ -279,7 +251,7 @@ module ShEx
279
251
  value[:shapeNot]
280
252
  else
281
253
  lhs = value[:_shapeAnd_1].map {|v| v.last[:shapeNot]}
282
- Algebra::And.new(value[:shapeNot], *lhs)
254
+ Algebra::And.new(value[:shapeNot], *lhs, **self.options)
283
255
  end
284
256
  end
285
257
  start_production(:_shapeAnd_2, insensitive_strings: :lower)
@@ -291,7 +263,7 @@ module ShEx
291
263
  value[:inlineShapeNot]
292
264
  else
293
265
  lhs = value[:_inlineShapeAnd_1].map {|v| v.last[:inlineShapeNot]}
294
- Algebra::And.new(value[:inlineShapeNot], *lhs)
266
+ Algebra::And.new(value[:inlineShapeNot], *lhs, **self.options)
295
267
  end
296
268
  end
297
269
  start_production(:_inlineShapeAnd_2, insensitive_strings: :lower)
@@ -300,7 +272,7 @@ module ShEx
300
272
  start_production(:shapeNot, as_hash: true)
301
273
  production(:shapeNot) do |value|
302
274
  atom = value[:shapeAtom]
303
- value[:_shapeNot_1] ? Algebra::Not.new(atom) : atom
275
+ value[:_shapeNot_1] ? Algebra::Not.new(atom || Algebra::Shape.new(**options), **self.options) : atom
304
276
  end
305
277
  start_production(:_shapeNot_1, insensitive_strings: :lower)
306
278
 
@@ -308,7 +280,7 @@ module ShEx
308
280
  start_production(:inlineShapeNot, as_hash: true)
309
281
  production(:inlineShapeNot) do |value|
310
282
  atom = value[:inlineShapeAtom]
311
- value[:_inlineShapeNot] ? Algebra::Not.new(atom) : atom
283
+ value[:_inlineShapeNot_1] ? Algebra::Not.new(atom || Algebra::Shape.new(**options), **self.options) : atom
312
284
  end
313
285
  start_production(:_inlineShapeNot_1, insensitive_strings: :lower)
314
286
 
@@ -334,7 +306,7 @@ module ShEx
334
306
  case expressions.length
335
307
  when 0 then nil
336
308
  when 1 then expressions.first
337
- else Algebra::And.new(*expressions)
309
+ else Algebra::And.new(*expressions, **self.options)
338
310
  end
339
311
  end
340
312
  start_production(:_shapeAtom_1, as_hash: true)
@@ -365,7 +337,7 @@ module ShEx
365
337
  case expressions.length
366
338
  when 0 then nil
367
339
  when 1 then expressions.first
368
- else Algebra::And.new(*expressions)
340
+ else Algebra::And.new(*expressions, **self.options)
369
341
  end
370
342
  end
371
343
  start_production(:_shapeAtomNoRef_1, as_hash: true)
@@ -396,7 +368,7 @@ module ShEx
396
368
  case expressions.length
397
369
  when 0 then nil
398
370
  when 1 then expressions.first
399
- else Algebra::And.new(*expressions)
371
+ else Algebra::And.new(*expressions, **self.options)
400
372
  end
401
373
  end
402
374
  start_production(:_inlineShapeAtom_1, as_hash: true)
@@ -414,40 +386,45 @@ module ShEx
414
386
  end
415
387
 
416
388
  # [24] litNodeConstraint ::= "LITERAL" xsFacet*
417
- # | nonLiteralKind stringFacet*
418
389
  # | datatype xsFacet*
419
390
  # | valueSet xsFacet*
420
391
  # | numericFacet+
421
392
  start_production(:_litNodeConstraint_1, as_hash: true, insensitive_strings: :lower)
422
393
  production(:_litNodeConstraint_1) do |value|
423
- facets = value[:_litNodeConstraint_6]
394
+ # LITERAL" xsFacet*
395
+ facets = value[:_litNodeConstraint_5]
424
396
  validate_facets(facets, :litNodeConstraint)
425
- Algebra::NodeConstraint.new(:literal, *facets)
397
+ Algebra::NodeConstraint.new(:literal, *facets, **self.options)
426
398
  end
427
399
  start_production(:_litNodeConstraint_2, as_hash: true)
428
400
  production(:_litNodeConstraint_2) do |value|
429
- facets = Array(value[:_litNodeConstraint_7])
401
+ # datatype xsFacet*
402
+ facets = value[:_litNodeConstraint_6]
430
403
  validate_facets(facets, :litNodeConstraint)
431
- attrs = Array(value[:nonLiteralKind]) + facets
432
- Algebra::NodeConstraint.new(*attrs.compact)
404
+
405
+ # Numeric Facet Constraints can only be used when datatype is derived from the set of SPARQL 1.1 Operand Data Types
406
+ l = RDF::Literal("0", datatype: value[:datatype])
407
+ facets.each do |f|
408
+ error(nil, "#{f.first} constraint may only be used once on a numeric datatype (#{value[:datatype]})", production: :litNodeConstraint) if
409
+ f.to_s.match(/digits|inclusive|exclusive/) &&
410
+ !l.is_a?(RDF::Literal::Numeric)
411
+ end
412
+
413
+ attrs = [[:datatype, value[:datatype]]] + facets
414
+ Algebra::NodeConstraint.new(*attrs.compact, **self.options)
433
415
  end
434
416
  start_production(:_litNodeConstraint_3, as_hash: true)
435
417
  production(:_litNodeConstraint_3) do |value|
436
- facets = value[:_litNodeConstraint_8]
437
- validate_facets(facets, :litNodeConstraint)
438
- attrs = [[:datatype, value[:datatype]]] + facets
439
- Algebra::NodeConstraint.new(*attrs.compact)
440
- end
441
- start_production(:_litNodeConstraint_4, as_hash: true)
442
- production(:_litNodeConstraint_4) do |value|
443
- facets = value[:_litNodeConstraint_9]
418
+ # valueSet xsFacet*
419
+ facets = value[:_litNodeConstraint_7]
444
420
  validate_facets(facets, :litNodeConstraint)
445
421
  attrs = value[:valueSet]+ facets
446
- Algebra::NodeConstraint.new(*attrs.compact)
422
+ Algebra::NodeConstraint.new(*attrs.compact, **self.options)
447
423
  end
448
- production(:_litNodeConstraint_5) do |value|
424
+ production(:_litNodeConstraint_4) do |value|
425
+ # numericFacet+
449
426
  validate_facets(value, :litNodeConstraint)
450
- Algebra::NodeConstraint.new(*value)
427
+ Algebra::NodeConstraint.new(*value, **self.options)
451
428
  end
452
429
 
453
430
  # [25] nonLitNodeConstraint ::= nonLiteralKind stringFacet*
@@ -458,12 +435,12 @@ module ShEx
458
435
  facets = Array(value[:_nonLitNodeConstraint_3])
459
436
  validate_facets(facets, :nonLitNodeConstraint)
460
437
  attrs = Array(value[:nonLiteralKind]) + facets
461
- Algebra::NodeConstraint.new(*attrs.compact)
438
+ Algebra::NodeConstraint.new(*attrs.compact, **self.options)
462
439
  end
463
440
  production(:_nonLitNodeConstraint_2) do |value|
464
441
  # stringFacet+
465
442
  validate_facets(value, :nonLitNodeConstraint)
466
- Algebra::NodeConstraint.new(*value)
443
+ Algebra::NodeConstraint.new(*value, **self.options)
467
444
  end
468
445
 
469
446
  def validate_facets(facets, prod)
@@ -478,7 +455,7 @@ module ShEx
478
455
  # [26] nonLiteralKind ::= "IRI" | "BNODE" | "NONLITERAL"
479
456
  start_production(:nonLiteralKind, insensitive_strings: :lower)
480
457
  production(:nonLiteralKind) do |value|
481
- value.downcase.to_sym
458
+ value.to_sym
482
459
  end
483
460
 
484
461
  # [27] xsFacet ::= stringFacet | numericFacet
@@ -507,7 +484,7 @@ module ShEx
507
484
  end
508
485
  start_production(:_stringFacet_1, as_hash: true)
509
486
  production(:_stringFacet_1) do |value|
510
- [value[:stringLength].downcase.to_sym, value[:INTEGER]]
487
+ [value[:stringLength].to_sym, value[:INTEGER]]
511
488
  end
512
489
 
513
490
  # [29] stringLength ::= "LENGTH" | "MINLENGTH" | "MAXLENGTH"
@@ -517,11 +494,11 @@ module ShEx
517
494
  # | numericLength INTEGER
518
495
  start_production(:_numericFacet_1, as_hash: true)
519
496
  production(:_numericFacet_1) do |value|
520
- [value[:numericRange].downcase.to_sym, value[:numericLiteral]]
497
+ [value[:numericRange].to_sym, value[:numericLiteral]]
521
498
  end
522
499
  start_production(:_numericFacet_2, as_hash: true)
523
500
  production(:_numericFacet_2) do |value|
524
- [value[:numericLength].downcase.to_sym, value[:INTEGER]]
501
+ [value[:numericLength].to_sym, value[:INTEGER]]
525
502
  end
526
503
 
527
504
  # [31] numericRange ::= "MININCLUSIVE" | "MINEXCLUSIVE" | "MAXINCLUSIVE" | "MAXEXCLUSIVE"
@@ -549,15 +526,15 @@ module ShEx
549
526
  value[:_inlineShapeDefinition_2])
550
527
  end
551
528
  def shape_definition(extra_closed, expression, annotations = [], semact = [])
552
- closed = extra_closed.any? {|v| v.to_s.downcase == 'closed'}
553
- extra = extra_closed.reject {|v| v.to_s.downcase == 'closed'}
529
+ closed = extra_closed.any? {|v| v.to_s == 'closed'}
530
+ extra = extra_closed.reject {|v| v.to_s == 'closed'}
554
531
  attrs = extra
555
532
  attrs << :closed if closed
556
533
  attrs << expression if expression
557
534
  attrs += annotations
558
535
  attrs += semact
559
536
 
560
- Algebra::Shape.new(*attrs)
537
+ Algebra::Shape.new(*attrs, **self.options)
561
538
  end
562
539
  private :shape_definition
563
540
 
@@ -576,7 +553,7 @@ module ShEx
576
553
  start_production(:oneOfTripleExpr, as_hash: true)
577
554
  production(:oneOfTripleExpr) do |value|
578
555
  expressions = [value[:groupTripleExpr]] + value[:_oneOfTripleExpr_1]
579
- expressions.length == 1 ? expressions.first : Algebra::OneOf.new(*expressions)
556
+ expressions.length == 1 ? expressions.first : Algebra::OneOf.new(*expressions, **self.options)
580
557
  end
581
558
  production(:_oneOfTripleExpr_2) do |value|
582
559
  value.last[:groupTripleExpr]
@@ -586,13 +563,13 @@ module ShEx
586
563
  start_production(:groupTripleExpr, as_hash: true)
587
564
  production(:groupTripleExpr) do |value|
588
565
  expressions = [value[:unaryTripleExpr]] + value[:_groupTripleExpr_1]
589
- expressions.length == 1 ? expressions.first : Algebra::EachOf.new(*expressions)
566
+ expressions.length == 1 ? expressions.first : Algebra::EachOf.new(*expressions, **self.options)
590
567
  end
591
568
  production(:_groupTripleExpr_2) do |value|
592
569
  value.last[:_groupTripleExpr_3]
593
570
  end
594
571
 
595
- # [43] unaryTripleExpr ::= productionLabel? (tripleConstraint | bracketedTripleExpr) | include
572
+ # [43] unaryTripleExpr ::= ('$' tripleExprLabel)? (tripleConstraint | bracketedTripleExpr) | include
596
573
  start_production(:_unaryTripleExpr_1, as_hash: true)
597
574
  production(:_unaryTripleExpr_1) do |value|
598
575
  expression = value[:_unaryTripleExpr_3]
@@ -600,20 +577,18 @@ module ShEx
600
577
 
601
578
  expression
602
579
  end
603
-
604
- # [43a] productionLabel ::= '$' (iri | blankNode)
605
- production(:productionLabel) do |value|
606
- value.last[:_productionLabel_1]
580
+ production(:_unaryTripleExpr_4) do |value|
581
+ # '$' tripleExprLabel
582
+ value.last[:tripleExprLabel]
607
583
  end
608
584
 
609
- # [44] bracketedTripleExpr ::= '(' oneOfTripleExpr ')' cardinality? annotation* semanticActions
585
+ # [44] bracketedTripleExpr ::= '(' tripleExpression ')' cardinality? annotation* semanticActions
610
586
  start_production(:bracketedTripleExpr, as_hash: true)
611
587
  production(:bracketedTripleExpr) do |value|
612
- # XXX cardinality? annotation* semanticActions
613
- case expression = value[:oneOfTripleExpr]
614
- when Algebra::OneOf, Algebra::EachOf
588
+ case expression = value[:tripleExpression]
589
+ when Algebra::TripleExpression
615
590
  else
616
- error(nil, "Bracketed Expression requires multiple contained expressions", production: :bracketedTripleExpr)
591
+ error(nil, "Bracketed Expression requires contained triple expression", production: :bracketedTripleExpr)
617
592
  end
618
593
  cardinality = value[:_bracketedTripleExpr_1] || {}
619
594
  attrs = [
@@ -641,7 +616,7 @@ module ShEx
641
616
  attrs += value[:_tripleConstraint_3]
642
617
  attrs += value[:semanticActions]
643
618
 
644
- Algebra::TripleConstraint.new(*attrs) # unless attrs.empty?
619
+ Algebra::TripleConstraint.new(*attrs, **self.options) # unless attrs.empty?
645
620
  end
646
621
 
647
622
  # [46] cardinality ::= '*' | '+' | '?' | REPEAT_RANGE
@@ -662,7 +637,7 @@ module ShEx
662
637
 
663
638
  # [49] valueSetValue ::= iriRange | literalRange | languageRange | '.' exclusion+
664
639
  production(:valueSetValue) do |value|
665
- Algebra::Value.new(value)
640
+ Algebra::Value.new(value, **self.options)
666
641
  end
667
642
  production(:_valueSetValue_1) do |value|
668
643
  # All exclusions must be consistent IRI/Literal/Language
@@ -672,28 +647,28 @@ module ShEx
672
647
  unless value.all? {|e| e.is_a?(Algebra::IriStem) || e.is_a?(RDF::URI)}
673
648
  error(nil, "Exclusions must all be IRI type")
674
649
  end
675
- Algebra::IriStemRange.new(:wildcard, value.unshift(:exclusions))
650
+ Algebra::IriStemRange.new(:wildcard, value.unshift(:exclusions), **self.options)
676
651
  when Algebra::LiteralStem, RDF::Literal
677
652
  unless value.all? {|e| e.is_a?(Algebra::LiteralStem) || e.is_a?(RDF::Literal)}
678
653
  error(nil, "Exclusions must all be Literal type")
679
654
  end
680
- Algebra::LiteralStemRange.new(:wildcard, value.unshift(:exclusions))
655
+ Algebra::LiteralStemRange.new(:wildcard, value.unshift(:exclusions), **self.options)
681
656
  else
682
657
  unless value.all? {|e| e.is_a?(Algebra::LanguageStem) || e.is_a?(String)}
683
658
  error(nil, "Exclusions must all be Language type")
684
659
  end
685
- Algebra::LanguageStemRange.new(:wildcard, value.unshift(:exclusions))
660
+ Algebra::LanguageStemRange.new(:wildcard, value.unshift(:exclusions), **self.options)
686
661
  end
687
662
  end
688
663
 
689
- # [50] exclusion ::= '-' (iri | literal | LANGTAG) '~'?
664
+ # [50] exclusion ::= '.' '-' (iri | literal | LANGTAG) '~'?
690
665
  start_production(:exclusion, as_hash: true)
691
666
  production(:exclusion) do |value|
692
667
  if value[:_exclusion_2]
693
668
  case value[:_exclusion_1]
694
- when RDF::URI then Algebra::IriStem.new(value[:_exclusion_1])
695
- when RDF::Literal then Algebra::LiteralStem.new(value[:_exclusion_1])
696
- else Algebra::LanguageStem.new(value[:_exclusion_1])
669
+ when RDF::URI then Algebra::IriStem.new(value[:_exclusion_1], **self.options)
670
+ when RDF::Literal then Algebra::LiteralStem.new(value[:_exclusion_1], **self.options)
671
+ else Algebra::LanguageStem.new(value[:_exclusion_1], **self.options)
697
672
  end
698
673
  else
699
674
  value[:_exclusion_1]
@@ -706,9 +681,9 @@ module ShEx
706
681
  if value.last[:_iriRange_1]
707
682
  exclusions = value.last[:_iriRange_1].last[:_iriRange_3]
708
683
  if exclusions.empty?
709
- Algebra::IriStem.new(iri)
684
+ Algebra::IriStem.new(iri, **self.options)
710
685
  else
711
- Algebra::IriStemRange.new(iri, exclusions.unshift(:exclusions))
686
+ Algebra::IriStemRange.new(iri, exclusions.unshift(:exclusions), **self.options)
712
687
  end
713
688
  else
714
689
  iri
@@ -718,7 +693,7 @@ module ShEx
718
693
  # [52] iriExclusion ::= '-' iri '~'?
719
694
  start_production(:iriExclusion, as_hash: true)
720
695
  production(:iriExclusion) do |value|
721
- value[:_iriExclusion_1] ? Algebra::IriStem.new(value[:iri]) : value[:iri]
696
+ value[:_iriExclusion_1] ? Algebra::IriStem.new(value[:iri], **self.options) : value[:iri]
722
697
  end
723
698
 
724
699
  # [53] literalRange ::= literal ('~' literalExclusion*)?
@@ -726,11 +701,10 @@ module ShEx
726
701
  lit = value.first[:literal]
727
702
  if value.last[:_literalRange_1]
728
703
  exclusions = value.last[:_literalRange_1].last[:_literalRange_3]
729
- # FIXME Algebra::LiteralStemRange.new(:wildcard, exclusions)
730
704
  if exclusions.empty?
731
- Algebra::LiteralStem.new(lit)
705
+ Algebra::LiteralStem.new(lit, **self.options)
732
706
  else
733
- Algebra::LiteralStemRange.new(lit, exclusions.unshift(:exclusions))
707
+ Algebra::LiteralStemRange.new(lit, exclusions.unshift(:exclusions), **self.options)
734
708
  end
735
709
  else
736
710
  lit
@@ -741,32 +715,41 @@ module ShEx
741
715
  start_production(:literalExclusion, as_hash: true)
742
716
  production(:literalExclusion) do |value|
743
717
  val = value[:literal]
744
- value[:_literalExclusion_1] ? Algebra::LiteralStem.new(val) : val
718
+ value[:_literalExclusion_1] ? Algebra::LiteralStem.new(val, **self.options) : val
745
719
  end
746
720
 
747
721
  # [55] languageRange ::= LANGTAG ('~' languageExclusion*)?
748
- start_production(:languageRange, as_hash: true)
749
- production(:languageRange) do |value|
750
- exclusions = value[:_languageRange_1] if value[:_languageRange_1]
751
- pattern = !!value[:_languageRange_1]
722
+ # | '@' '~' languageExclusion*
723
+ start_production(:_languageRange_1, as_hash: true)
724
+ production(:_languageRange_1) do |value|
725
+ exclusions = value[:_languageRange_3] if value[:_languageRange_3]
726
+ pattern = !!value[:_languageRange_3]
752
727
  if pattern && exclusions.empty?
753
- Algebra::LanguageStem.new(value[:LANGTAG])
728
+ Algebra::LanguageStem.new(value[:LANGTAG], **self.options)
754
729
  elsif pattern
755
- Algebra::LanguageStemRange.new(value[:LANGTAG], exclusions.unshift(:exclusions))
730
+ Algebra::LanguageStemRange.new(value[:LANGTAG], exclusions.unshift(:exclusions), **self.options)
756
731
  else
757
- Algebra::Language.new(value[:LANGTAG])
732
+ Algebra::Language.new(value[:LANGTAG], **self.options)
758
733
  end
759
734
  end
760
735
  start_production(:_languageRange_2, as_hash: true)
761
736
  production(:_languageRange_2) do |value|
762
- value[:_languageRange_3]
737
+ exclusions = value[:_languageRange_6]
738
+ if exclusions.empty?
739
+ Algebra::LanguageStem.new('', **self.options)
740
+ else
741
+ Algebra::LanguageStemRange.new('', exclusions.unshift(:exclusions), **self.options)
742
+ end
743
+ end
744
+ production(:_languageRange_4) do |value|
745
+ value.last[:_languageRange_5]
763
746
  end
764
747
 
765
748
  # [56] languageExclusion ::= '-' LANGTAG '~'?
766
749
  start_production(:languageExclusion, as_hash: true)
767
750
  production(:languageExclusion) do |value|
768
751
  val = value[:LANGTAG]
769
- value[:_languageExclusion_1] ? Algebra::LanguageStem.new(val) : val
752
+ value[:_languageExclusion_1] ? Algebra::LanguageStem.new(val, **self.options) : val
770
753
  end
771
754
 
772
755
  # [57] include ::= '&' tripleExprLabel
@@ -777,7 +760,7 @@ module ShEx
777
760
  # [58] annotation ::= '//' predicate (iri | literal)
778
761
  start_production(:annotation, as_hash: true)
779
762
  production(:annotation) do |value|
780
- Algebra::Annotation.new([:predicate, value[:predicate]], value[:_annotation_1])
763
+ Algebra::Annotation.new([:predicate, value[:predicate]], value[:_annotation_1], **self.options)
781
764
  end
782
765
 
783
766
  # [59] semanticActions ::= codeDecl*
@@ -786,7 +769,7 @@ module ShEx
786
769
  start_production(:codeDecl, as_hash: true)
787
770
  production(:codeDecl) do |value|
788
771
  code = value[:_codeDecl_1] unless value[:_codeDecl_1] == '%'
789
- Algebra::SemAct.new(*[value[:iri], code].compact)
772
+ Algebra::SemAct.new(*[value[:iri], code].compact, **self.options)
790
773
  end
791
774
 
792
775
  # [13t] literal ::= rdfLiteral | numericLiteral | booleanLiteral
@@ -815,7 +798,8 @@ module ShEx
815
798
  value.last[:datatype]
816
799
  end
817
800
 
818
- # [134s] booleanLiteral ::= 'true' | 'false'
801
+ # [134s] booleanLiteral ::= "true" | "false"
802
+ start_production(:booleanLiteral, insensitive_strings: :lower)
819
803
  production(:booleanLiteral) do |value|
820
804
  literal(value == 'true')
821
805
  end