activefacts 1.6.0 → 1.7.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.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +14 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +60 -0
  8. data/Rakefile +3 -80
  9. data/activefacts.gemspec +36 -0
  10. data/bin/afgen +4 -2
  11. data/bin/cql +5 -1
  12. data/lib/activefacts.rb +3 -12
  13. data/lib/activefacts/{vocabulary/query_evaluator.rb → query/evaluator.rb} +0 -0
  14. data/lib/activefacts/version.rb +2 -2
  15. metadata +48 -296
  16. data/History.txt +0 -4
  17. data/LICENSE +0 -19
  18. data/Manifest.txt +0 -165
  19. data/README.rdoc +0 -81
  20. data/css/offline.css +0 -3
  21. data/css/orm2.css +0 -124
  22. data/css/print.css +0 -8
  23. data/css/style-print.css +0 -357
  24. data/css/style.css +0 -387
  25. data/download.html +0 -110
  26. data/examples/CQL/Address.cql +0 -44
  27. data/examples/CQL/Blog.cql +0 -54
  28. data/examples/CQL/CompanyDirectorEmployee.cql +0 -56
  29. data/examples/CQL/Death.cql +0 -17
  30. data/examples/CQL/Diplomacy.cql +0 -48
  31. data/examples/CQL/Genealogy.cql +0 -98
  32. data/examples/CQL/Insurance.cql +0 -320
  33. data/examples/CQL/Marriage.cql +0 -18
  34. data/examples/CQL/Metamodel.cql +0 -493
  35. data/examples/CQL/Monogamy.cql +0 -24
  36. data/examples/CQL/MultiInheritance.cql +0 -22
  37. data/examples/CQL/NonRoleId.cql +0 -14
  38. data/examples/CQL/OddIdentifier.cql +0 -18
  39. data/examples/CQL/OilSupply.cql +0 -53
  40. data/examples/CQL/OneToOnes.cql +0 -17
  41. data/examples/CQL/Orienteering.cql +0 -111
  42. data/examples/CQL/PersonPlaysGame.cql +0 -18
  43. data/examples/CQL/RedundantDependency.cql +0 -34
  44. data/examples/CQL/SchoolActivities.cql +0 -33
  45. data/examples/CQL/SeparateSubtype.cql +0 -30
  46. data/examples/CQL/ServiceDirector.cql +0 -276
  47. data/examples/CQL/SimplestUnary.cql +0 -12
  48. data/examples/CQL/Supervision.cql +0 -34
  49. data/examples/CQL/WaiterTips.cql +0 -33
  50. data/examples/CQL/Warehousing.cql +0 -101
  51. data/examples/CQL/WindowInRoomInBldg.cql +0 -28
  52. data/examples/CQL/unit.cql +0 -474
  53. data/examples/index.html +0 -420
  54. data/examples/intro.html +0 -327
  55. data/examples/local.css +0 -24
  56. data/index.html +0 -111
  57. data/lib/activefacts/cql.rb +0 -35
  58. data/lib/activefacts/cql/CQLParser.treetop +0 -158
  59. data/lib/activefacts/cql/Context.treetop +0 -48
  60. data/lib/activefacts/cql/Expressions.treetop +0 -67
  61. data/lib/activefacts/cql/FactTypes.treetop +0 -358
  62. data/lib/activefacts/cql/Language/English.treetop +0 -315
  63. data/lib/activefacts/cql/LexicalRules.treetop +0 -253
  64. data/lib/activefacts/cql/ObjectTypes.treetop +0 -210
  65. data/lib/activefacts/cql/Rakefile +0 -14
  66. data/lib/activefacts/cql/Terms.treetop +0 -183
  67. data/lib/activefacts/cql/ValueTypes.treetop +0 -202
  68. data/lib/activefacts/cql/compiler.rb +0 -156
  69. data/lib/activefacts/cql/compiler/clause.rb +0 -1137
  70. data/lib/activefacts/cql/compiler/constraint.rb +0 -581
  71. data/lib/activefacts/cql/compiler/entity_type.rb +0 -457
  72. data/lib/activefacts/cql/compiler/expression.rb +0 -443
  73. data/lib/activefacts/cql/compiler/fact.rb +0 -390
  74. data/lib/activefacts/cql/compiler/fact_type.rb +0 -421
  75. data/lib/activefacts/cql/compiler/query.rb +0 -106
  76. data/lib/activefacts/cql/compiler/shared.rb +0 -161
  77. data/lib/activefacts/cql/compiler/value_type.rb +0 -174
  78. data/lib/activefacts/cql/nodes.rb +0 -49
  79. data/lib/activefacts/cql/parser.rb +0 -241
  80. data/lib/activefacts/dependency_analyser.rb +0 -182
  81. data/lib/activefacts/generate/absorption.rb +0 -70
  82. data/lib/activefacts/generate/composition.rb +0 -118
  83. data/lib/activefacts/generate/cql.rb +0 -714
  84. data/lib/activefacts/generate/dm.rb +0 -279
  85. data/lib/activefacts/generate/help.rb +0 -64
  86. data/lib/activefacts/generate/helpers/inject.rb +0 -16
  87. data/lib/activefacts/generate/helpers/oo.rb +0 -162
  88. data/lib/activefacts/generate/helpers/ordered.rb +0 -605
  89. data/lib/activefacts/generate/helpers/rails.rb +0 -57
  90. data/lib/activefacts/generate/html/glossary.rb +0 -461
  91. data/lib/activefacts/generate/json.rb +0 -337
  92. data/lib/activefacts/generate/null.rb +0 -32
  93. data/lib/activefacts/generate/rails/models.rb +0 -246
  94. data/lib/activefacts/generate/rails/schema.rb +0 -216
  95. data/lib/activefacts/generate/records.rb +0 -46
  96. data/lib/activefacts/generate/ruby.rb +0 -133
  97. data/lib/activefacts/generate/sql/mysql.rb +0 -280
  98. data/lib/activefacts/generate/sql/server.rb +0 -273
  99. data/lib/activefacts/generate/stats.rb +0 -69
  100. data/lib/activefacts/generate/text.rb +0 -27
  101. data/lib/activefacts/generate/topics.rb +0 -265
  102. data/lib/activefacts/generate/traits/datavault.rb +0 -241
  103. data/lib/activefacts/generate/traits/oo.rb +0 -73
  104. data/lib/activefacts/generate/traits/ordered.rb +0 -33
  105. data/lib/activefacts/generate/traits/ruby.rb +0 -210
  106. data/lib/activefacts/generate/transform/datavault.rb +0 -266
  107. data/lib/activefacts/generate/transform/surrogate.rb +0 -214
  108. data/lib/activefacts/generate/version.rb +0 -26
  109. data/lib/activefacts/input/cql.rb +0 -43
  110. data/lib/activefacts/input/orm.rb +0 -1636
  111. data/lib/activefacts/mapping/rails.rb +0 -132
  112. data/lib/activefacts/persistence.rb +0 -15
  113. data/lib/activefacts/persistence/columns.rb +0 -446
  114. data/lib/activefacts/persistence/foreignkey.rb +0 -187
  115. data/lib/activefacts/persistence/index.rb +0 -240
  116. data/lib/activefacts/persistence/object_type.rb +0 -198
  117. data/lib/activefacts/persistence/reference.rb +0 -434
  118. data/lib/activefacts/persistence/tables.rb +0 -380
  119. data/lib/activefacts/registry.rb +0 -11
  120. data/lib/activefacts/support.rb +0 -132
  121. data/lib/activefacts/vocabulary.rb +0 -9
  122. data/lib/activefacts/vocabulary/extensions.rb +0 -1348
  123. data/lib/activefacts/vocabulary/metamodel.rb +0 -570
  124. data/lib/activefacts/vocabulary/verbaliser.rb +0 -804
  125. data/script/txt2html +0 -71
  126. data/spec/absorption_spec.rb +0 -95
  127. data/spec/cql/comparison_spec.rb +0 -89
  128. data/spec/cql/context_spec.rb +0 -94
  129. data/spec/cql/contractions_spec.rb +0 -224
  130. data/spec/cql/deontic_spec.rb +0 -88
  131. data/spec/cql/entity_type_spec.rb +0 -320
  132. data/spec/cql/expressions_spec.rb +0 -66
  133. data/spec/cql/fact_type_matching_spec.rb +0 -338
  134. data/spec/cql/french_spec.rb +0 -21
  135. data/spec/cql/parser/bad_literals_spec.rb +0 -86
  136. data/spec/cql/parser/constraints_spec.rb +0 -19
  137. data/spec/cql/parser/entity_types_spec.rb +0 -106
  138. data/spec/cql/parser/expressions_spec.rb +0 -199
  139. data/spec/cql/parser/fact_types_spec.rb +0 -44
  140. data/spec/cql/parser/literals_spec.rb +0 -312
  141. data/spec/cql/parser/pragmas_spec.rb +0 -89
  142. data/spec/cql/parser/value_types_spec.rb +0 -42
  143. data/spec/cql/role_matching_spec.rb +0 -148
  144. data/spec/cql/samples_spec.rb +0 -244
  145. data/spec/cql_cql_spec.rb +0 -73
  146. data/spec/cql_dm_spec.rb +0 -136
  147. data/spec/cql_mysql_spec.rb +0 -69
  148. data/spec/cql_parse_spec.rb +0 -34
  149. data/spec/cql_ruby_spec.rb +0 -73
  150. data/spec/cql_sql_spec.rb +0 -72
  151. data/spec/cql_symbol_tables_spec.rb +0 -261
  152. data/spec/cqldump_spec.rb +0 -170
  153. data/spec/helpers/array_matcher.rb +0 -23
  154. data/spec/helpers/ctrl_c_support.rb +0 -52
  155. data/spec/helpers/diff_matcher.rb +0 -39
  156. data/spec/helpers/file_matcher.rb +0 -34
  157. data/spec/helpers/parse_to_ast_matcher.rb +0 -80
  158. data/spec/helpers/string_matcher.rb +0 -30
  159. data/spec/helpers/test_parser.rb +0 -15
  160. data/spec/norma_cql_spec.rb +0 -66
  161. data/spec/norma_ruby_spec.rb +0 -62
  162. data/spec/norma_ruby_sql_spec.rb +0 -107
  163. data/spec/norma_sql_spec.rb +0 -57
  164. data/spec/norma_tables_spec.rb +0 -95
  165. data/spec/ruby_api_spec.rb +0 -23
  166. data/spec/spec_helper.rb +0 -35
  167. data/spec/transform_surrogate_spec.rb +0 -59
  168. data/status.html +0 -138
  169. data/why.html +0 -60
@@ -1,358 +0,0 @@
1
- #
2
- # ActiveFacts CQL Parser.
3
- # Parse rules relating to FactType definitions.
4
- #
5
- # Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
6
- #
7
- module ActiveFacts
8
- module CQL
9
- grammar FactTypes
10
- rule query
11
- s query_clauses r:returning_clause? '?'
12
- {
13
- def ast
14
- Compiler::FactType.new nil, [], query_clauses.ast, (r.empty? ? nil : r)
15
- end
16
- }
17
- end
18
-
19
- rule named_fact_type
20
- s each?
21
- s term_definition_name
22
- mapping_pragmas is_where
23
- anonymous_fact_type
24
- {
25
- def ast
26
- ft = anonymous_fact_type.ast
27
- ft.name = term_definition_name.value
28
- pragmas = mapping_pragmas.value
29
- pragmas << 'independent' if is_where.independent
30
- ft.pragmas = pragmas
31
- ft
32
- end
33
- }
34
- end
35
-
36
- rule anonymous_fact_type
37
- query_clauses
38
- ctail:( (':' / where) s a:query_clauses s)?
39
- returning_clause?
40
- s ';'
41
- {
42
- def ast
43
- clauses_ast = query_clauses.ast
44
- conditions = !ctail.empty? ? ctail.a.ast : []
45
- returning = respond_to?(:returning_clause) ? returning_clause.ast : nil
46
- value_derivation = clauses_ast.detect{|r| r.is_equality_comparison}
47
- if !value_derivation and
48
- conditions.empty? and
49
- clauses_ast.detect{|r| r.includes_literals}
50
- raise "Fact instances may not contain conditions" unless conditions.empty? && !returning
51
- Compiler::Fact.new clauses_ast
52
- elsif (clauses_ast.size == 1 &&
53
- clauses_ast[0].phrases.size == 1 &&
54
- (popname = clauses_ast[0].phrases[0]) &&
55
- !popname.is_a?(Compiler::Reference) &&
56
- conditions.detect{|r| r.includes_literals}
57
- )
58
- Compiler::Fact.new conditions, popname
59
- else
60
- Compiler::FactType.new nil, clauses_ast, conditions, returning
61
- end
62
- end
63
- }
64
- end
65
-
66
- rule query_clauses
67
- qualified_clauses
68
- # REVISIT: This creates no precedence between and/or, which could cause confusion.
69
- # Should disallow mixed conjuntions - using a sempred?
70
- ftail:( conjunction:(',' / and / or ) s qualified_clauses s )*
71
- {
72
- def ast
73
- clauses_ast = qualified_clauses.ast
74
- ftail.elements.each{|e|
75
- conjunction = e.conjunction.text_value
76
- # conjunction = 'and' if conjunction == ',' # ',' means AND, but disallows left-contractions
77
- clauses_ast += e.qualified_clauses.ast(conjunction)
78
- }
79
- clauses_ast
80
- end
81
- }
82
- end
83
-
84
- rule returning_clause
85
- returning s return (s ',' s return)*
86
- end
87
-
88
- rule return
89
- ordering_prefix? phrase+
90
- end
91
-
92
- rule qualified_clauses
93
- s certainty s contracted_clauses s p:post_qualifiers? s c:context_note?
94
- {
95
- def ast(conjunction = nil)
96
- r = contracted_clauses.ast # An array of clause asts
97
- r[0].conjunction = conjunction
98
- # pre-qualifiers apply to the first clause, post_qualifiers and context_note to the last
99
- # REVISIT: This may be incorrect where the last is a nested clause
100
- r[0].certainty = certainty.value
101
- r[-1].qualifiers += p.list unless p.empty?
102
- r[-1].context_note = c.ast unless c.empty?
103
- r
104
- end
105
- }
106
- end
107
-
108
- rule certainty
109
- negative_prefix { def value; false; end }
110
- /
111
- maybe { def value; nil; end }
112
- /
113
- definitely { def value; true; end }
114
- /
115
- '' { def value; true; end }
116
- end
117
-
118
- rule post_qualifiers
119
- '[' s q0:post_qualifier tail:( s ',' s q1:post_qualifier )* s ']' s
120
- {
121
- def list
122
- [q0.text_value, *tail.elements.map{|e| e.q1.text_value}]
123
- end
124
- }
125
- end
126
-
127
- rule post_qualifier
128
- static / transient /
129
- intransitive / stronglyintransitive / transitive / acyclic / symmetric / asymmetric / antisymmetric / reflexive / irreflexive
130
- end
131
-
132
- rule clauses_list
133
- clauses tail:( ',' s clauses )*
134
- {
135
- def ast
136
- [clauses.ast, *tail.elements.map{|e| e.clauses.ast }]
137
- end
138
- }
139
- end
140
-
141
- rule clauses
142
- contracted_clauses s tail:( and s contracted_clauses s )*
143
- {
144
- def ast
145
- clauses = contracted_clauses.ast
146
- tail.elements.map{|e| clauses += e.contracted_clauses.ast }
147
- clauses
148
- end
149
- }
150
- end
151
-
152
- rule contracted_clauses
153
- comparison
154
- /
155
- (
156
- contraction # A contraction will terminate this repetition by eating to the end
157
- /
158
- phrase
159
- )+
160
- {
161
- def ast
162
- asts = elements.map{ |r| r.ast }
163
- contracted_clauses = []
164
- qualifiers = []
165
- if asts[-1].is_a?(Array) # A contraction (Array of [role, qualifiers, *clauses])
166
- contracted_clauses = asts.pop # Pull off the contracted_clauses
167
- contracted_role = contracted_clauses.shift
168
- qualifiers = contracted_clauses.shift
169
- asts.push(contracted_role) # And replace it by the role removed from the contracted_clauses
170
- end
171
- clause_ast = Compiler::Clause.new(asts, qualifiers)
172
- [clause_ast] + contracted_clauses
173
- end
174
- }
175
- end
176
-
177
- rule contraction
178
- reading_contraction /
179
- condition_contraction
180
- end
181
-
182
- rule reading_contraction
183
- role p:post_qualifiers? conjunction:(that/who) s certainty s contracted_clauses s
184
- {
185
- def ast
186
- # contracted_clauses.ast will return an array of Clauses, but the first clause is special. We must:
187
- # * prepend a new role (we get the Role to build *two* ast nodes)
188
- # * attach the qualifiers
189
- clauses_ast = contracted_clauses.ast
190
- clauses_ast[0].conjunction = conjunction.text_value
191
- clauses_ast[0].phrases.unshift(role.ast)
192
- clauses_ast[0].certainty = certainty.value
193
-
194
- # A contraction returns an array containing:
195
- # * a role AST
196
- # * a qualifiers array
197
- # * an array of Clauses
198
- [role.ast, p.empty? ? [] : p.list] + clauses_ast
199
- end
200
- }
201
- end
202
-
203
- rule condition_contraction
204
- role pq:post_qualifiers? certainty s comparator s e2:expression
205
- !phrase # The contracted_clauses must not continue here!
206
- {
207
- def ast
208
- c = Compiler::Comparison.new(comparator.text_value, role.ast, e2.ast, certainty.value)
209
- c.conjunction = comparator.text_value
210
- [ role.ast, pq.empty? ? [] : pq.list, c ]
211
- end
212
- }
213
- end
214
-
215
- rule comparison
216
- e1:expression s certainty s comparator s contraction p:post_qualifiers?
217
- {
218
- def ast
219
- role, qualifiers, *clauses_ast = *contraction.ast
220
- clauses_ast[0].qualifiers += p.list unless p.empty? # apply post_qualifiers to the contracted clause
221
- # clauses_ast[0].conjunction = 'and' # AND is implicit for a contraction
222
- c = Compiler::Comparison.new(comparator.text_value, e1.ast, role, certainty.value)
223
- [c] + clauses_ast
224
- end
225
- }
226
- /
227
- certainty e1:expression s comparator s e2:expression # comparisons have no post-qualifiers: p:post_qualifiers?
228
- {
229
- def ast
230
- c = Compiler::Comparison.new(comparator.text_value, e1.ast, e2.ast, certainty.value)
231
- [c]
232
- end
233
- }
234
- end
235
-
236
- rule comparator
237
- '<=' / '<>' / '<' / '=' / '>=' / '>' / '!='
238
- end
239
-
240
- rule phrase
241
- role # A role reference containing a term, perhaps with attached paraphernalia
242
- / # A hyphenated non-term. Important: no embedded spaces
243
- id tail:('-' !term id)+ s
244
- {
245
- def ast
246
- [id.value, *tail.elements.map{|e| e.id.value}]*"-"
247
- end
248
- def node_type; :linking; end
249
- }
250
- / # A normal non-term
251
- !non_phrase id s
252
- {
253
- def ast
254
- id.value
255
- end
256
- def node_type; :linking; end
257
- }
258
- end
259
-
260
- rule role
261
- aggregate
262
- /
263
- simple_role
264
- end
265
-
266
- rule aggregate
267
- aggregate:id s
268
- agg_of s term_or_unary s agg_in s # REVISIT: this term may need to pre-scanned in the qualified_clauses
269
- '(' qualified_clauses s ')' # REVISIT: Need to test to verify this is the right level (not query_clauses, etc)
270
- {
271
- def ast
272
- raise "Not implemented: AST for '#{aggregate.text_value} of #{term_or_unary.text_value}'"
273
- # This returns just the role with the nested clauses, which doesn't even work:
274
- term.ast(
275
- nil, # No quantifier
276
- nil, # No function call
277
- nil, # No role_name
278
- nil, # No value_constraint
279
- nil, # No literal
280
- qualified_clauses.ast
281
- )
282
- end
283
- }
284
- end
285
-
286
- rule role_quantifier
287
- quantifier mapping_pragmas enforcement cn:context_note?
288
- {
289
- def ast
290
- Compiler::Quantifier.new(
291
- quantifier.value[0],
292
- quantifier.value[1],
293
- enforcement.ast,
294
- cn.empty? ? nil : cn.ast,
295
- mapping_pragmas.value
296
- )
297
- end
298
- }
299
- end
300
-
301
- # This is the rule that causes most back-tracking. I think you can see why.
302
- rule simple_role
303
- q:role_quantifier?
304
- player:derived_variable
305
- lr:(
306
- literal u:unit?
307
- /
308
- value_constraint enforcement
309
- )?
310
- oj:objectification_step?
311
- {
312
- def ast
313
- if !q.empty? && q.quantifier.value
314
- quantifier = q.ast
315
- end
316
- if !lr.empty?
317
- if lr.respond_to?(:literal)
318
- literal = Compiler::Literal.new(lr.literal.value, lr.u.empty? ? nil : lr.u.text_value)
319
- end
320
- value_constraint = Compiler::ValueConstraint.new(lr.value_constraint.ast, lr.enforcement.ast) if lr.respond_to?(:value_constraint)
321
- raise "It is not permitted to provide both a literal value and a value constraint" if value_constraint and literal
322
- end
323
-
324
- nested_clauses =
325
- if oj.empty?
326
- nil
327
- else
328
- ast = oj.ast
329
- ast[0].conjunction = 'where'
330
- ast
331
- end
332
- player.ast(quantifier, value_constraint, literal, nested_clauses)
333
- end
334
- }
335
- end
336
-
337
- rule objectification_step
338
- '(' s in_which s facts:query_clauses s ')' s
339
- {
340
- def ast
341
- facts.ast
342
- end
343
- }
344
- end
345
-
346
- rule role_name
347
- '(' s as S r:term s ')' s
348
- { def value; r.value; end }
349
- end
350
-
351
- rule subscript
352
- '(' s i:([1-9] [0-9]*) s ')' s
353
- { def value; i.text_value.to_i; end }
354
- end
355
-
356
- end
357
- end
358
- end
@@ -1,315 +0,0 @@
1
- #
2
- # ActiveFacts CQL Parser.
3
- # Parse rules the English syntax of CQL.
4
- #
5
- # Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
6
- #
7
- module ActiveFacts
8
- module CQL
9
- grammar English
10
-
11
- # >>>>>>>>>>>>>>>>>>>> Object Types <<<<<<<<<<<<<<<<<<<<
12
- # The pattern to introduce a Value Type
13
- rule written_as
14
- s 'is' s 'written' S as s
15
- end
16
-
17
- rule auto_assignment
18
- 'auto-assigned' S at s time:('assert' / 'commit') !alphanumeric s
19
- {
20
- def auto_assigned_at
21
- time.text_value
22
- end
23
- }
24
- end
25
-
26
- # The pattern to introduce an Entity Type
27
- rule identified_by
28
- identified s by s
29
- end
30
-
31
- rule basetype_expression
32
- is s i:( independent s )? identification
33
- end
34
-
35
- # The pattern to introduce an Entity Subtype
36
- rule subtype_prefix
37
- 'is' s 'a' s ('kind'/'subtype') s 'of' S
38
- end
39
-
40
- rule subtype_expression
41
- subtype_prefix i:( independent s )? supertype_list ident:identification?
42
- end
43
-
44
- # The pattern to introduce an objectified fact type with implicit identification
45
- rule is_where
46
- is s i:(independent s)? where
47
- { def independent; !i.empty?; end }
48
- end
49
-
50
- rule in_which # Introduce an objectification step
51
- where / # Old syntax
52
- in s which # preferred syntax
53
- end
54
-
55
- # Units conversion keyword
56
- rule conversion
57
- converts s a:(approximately s)? to s
58
- {
59
- def approximate?
60
- !a.empty?
61
- end
62
- }
63
- end
64
-
65
- # >>>>>>>>>>>>>>>>>>>> Constraints <<<<<<<<<<<<<<<<<<<<
66
- # External presence constraint syntax:
67
- rule each_occurs_in_clauses
68
- s 'each' s ('combination' S)? role_list s occurs s quantifier s 'time' 's'? s enforcement 'in' s
69
- clauses_list s c:context_note? ';'
70
- {
71
- def role_list_ast
72
- role_list.ast
73
- end
74
- def quantifier_ast
75
- quantifier.ast
76
- end
77
- def clauses_ast
78
- clauses_list.ast
79
- end
80
- }
81
- end
82
-
83
- # Alternate external presence constraint syntax:
84
- rule either_or
85
- s either? s r1:clauses s or s r2:clauses c:context_note? enforcement ';'
86
- {
87
- def role_list_ast
88
- nil
89
- end
90
- def quantifier_ast
91
- Compiler::Quantifier.new(1, nil)
92
- end
93
- def clauses_ast
94
- [r1.ast, r2.ast]
95
- end
96
- }
97
- end
98
-
99
- # Exclusion (at most one) and mandatory exclusion (exactly one) constraint syntax:
100
- rule for_each_how_many
101
- s 'for' s 'each' s role_list s quantifier s 'of' s 'these' s 'holds' s enforcement ':' s
102
- clauses_list s c:context_note? ';'
103
- {
104
- def role_list_ast
105
- role_list.ast
106
- end
107
- def quantifier_ast
108
- quantifier.ast
109
- end
110
- def clauses_ast
111
- clauses_list.ast
112
- end
113
- }
114
- end
115
-
116
- # Alternate mandatory exclusion constraint syntax:
117
- rule either_or_not_both
118
- s either? s r1:clauses s or s r2:clauses but s not s both s c:context_note? enforcement ';'
119
- {
120
- def role_list_ast
121
- nil
122
- end
123
- def quantifier_ast
124
- Compiler::Quantifier.new(1, 1)
125
- end
126
- def clauses_ast
127
- [r1.ast, r2.ast]
128
- end
129
- }
130
- end
131
-
132
- # Subset constraint using "A only if B" syntax
133
- rule a_only_if_b
134
- s clauses:query_clauses s only s if s r2:query_clauses s c:context_note? enforcement ';'
135
- end
136
-
137
- rule only_if
138
- only s if s
139
- end
140
-
141
- # Subset constraint using "if A then B" syntax
142
- rule if_b_then_a
143
- s if s clauses s then s r2:clauses s c:context_note? enforcement ';'
144
- end
145
-
146
- # Equality constraint syntax:
147
- rule if_and_only_if
148
- s clauses s tail:( if s and s only s if s clauses s)+
149
- c:context_note? enforcement ';'
150
- end
151
-
152
- # During the prescan we need to know where terms in a role list finish.
153
- # This rule matches any non-term expressions that may follow a role list.
154
- rule role_list_constraint_followers
155
- occurs s quantifier s 'time'
156
- end
157
-
158
- # >>>>>>>>>>>>>>>>>>>> Quantifiers <<<<<<<<<<<<<<<<<<<<
159
- rule quantifier
160
- (
161
- each s { def value; [1, nil]; end }
162
- / some s { def value; nil; end }
163
- # REVISIT: "Some" means that any prior occurrence of this role player is to be ignored; this is a new occurrence
164
- # "that" on the other hand means that this role player was *previously* designated using "some".
165
- # These distinctions are lost here
166
- / that s { def value; nil; end }
167
- / which s { def value; nil; end }
168
- / one s { def value; [1, 1]; end }
169
- / no s { def value; [0, 0]; end }
170
- / exactly s quantity { def value; q = quantity.value; [q, q]; end }
171
- / at s least s quantity most:( and s at s most s q:quantity )?
172
- { def value;
173
- [ quantity.value,
174
- most.empty? ? nil : most.q.value
175
- ]
176
- end
177
- }
178
- / at s most s quantity { def value; [ nil, quantity.value ]; end }
179
- / from s numeric_range s { def value; numeric_range.value; end }
180
- # / either_all_or_none s { def value; [ -1, 1 ]; end }
181
- )
182
- {
183
- def ast
184
- v = value
185
- Compiler::Quantifier.new(v[0], v[1])
186
- end
187
- }
188
- end
189
-
190
- # rule either_all_or_none either s all s or s ( none / no ) end
191
-
192
- rule quantity
193
- one s { def value; 1; end }
194
- / number s { def value; number.value; end }
195
- end
196
-
197
- # >>>>>>>>>>>>>>>>>>>> Context Notes <<<<<<<<<<<<<<<<<<<<
198
- rule as_agreed_by
199
- s as s 'agreed' s d:('on' S date)? by s agents
200
- { def value; [ d.empty? ? nil : d.date.value, agents.value ]; end }
201
- end
202
-
203
- rule date
204
- s d:(!(by/')') .)+
205
- { def value; d.text_value.strip; end }
206
- end
207
-
208
- rule agents
209
- s h:agent s t:(',' s !context_type agent s)*
210
- {
211
- def value; [h.text_value] + t.elements.map{|e| e.agent.text_value }; end
212
- def node_type; :linking; end
213
- }
214
- end
215
-
216
- rule agent
217
- id (s id)*
218
- end
219
-
220
- rule negative_prefix
221
- s it s is s not s the s case s that s
222
- end
223
-
224
- rule agg_of of end
225
- rule agg_in in end
226
- rule restricted_to 'restricted' s 'to' s !alphanumeric end
227
- # any is optionally used in an identifying role_list
228
- rule any one / a end
229
-
230
- # >>>>>>>>>>>>>>>>>>>> Internal vocabulary <<<<<<<<<<<<<<<<<<<<
231
- rule a ('a' !alphanumeric /'an' !alphanumeric) end
232
- rule all 'all' !alphanumeric end
233
- rule ascending 'ascending' !alphanumeric end
234
- rule at 'at' !alphanumeric end
235
- rule both 'both' !alphanumeric end
236
- rule converts 'converts' !alphanumeric end
237
- rule descending 'descending' !alphanumeric end
238
- rule each 'each' !alphanumeric end
239
- rule either 'either' !alphanumeric end
240
- rule entity 'entity' !alphanumeric end
241
- rule exactly 'exactly' !alphanumeric end
242
- rule from 'from' !alphanumeric end
243
- rule includes 'includes' !alphanumeric end
244
- rule least 'least' !alphanumeric end
245
- rule matches 'matches' !alphanumeric end
246
- rule most 'most' !alphanumeric end
247
- rule no 'no' !alphanumeric end
248
- rule none 'none' !alphanumeric end
249
- rule not 'not' !alphanumeric end
250
- rule occurs 'occurs' !alphanumeric end
251
- rule one 'one' !alphanumeric end
252
- rule some 'some' !alphanumeric end
253
-
254
- # >>>>>>>>>>>>>>>>>>>> External vocabulary <<<<<<<<<<<<<<<<<<<<
255
- rule according_to 'according' S to end
256
- rule acyclic 'acyclic' !alphanumeric end
257
- rule alias 'alias' !alphanumeric end
258
- rule and 'and' !alphanumeric end
259
- rule antisymmetric 'antisymmetric' !alphanumeric end
260
- rule approximately 'approximately' !alphanumeric end
261
- rule as 'as' !alphanumeric end
262
- rule as_opposed_to as s 'opposed' S to end
263
- rule asymmetric 'asymmetric' !alphanumeric end
264
- rule because 'because' !alphanumeric end
265
- rule but 'but' !alphanumeric end
266
- rule by 'by' !alphanumeric end # fix? Used in 'returning' for ordering
267
- rule case 'case' !alphanumeric end
268
- rule definitely 'definitely' !alphanumeric end
269
- rule ephemera 'ephemera' !alphanumeric end
270
- rule false 'false' !alphanumeric end
271
- rule feminine 'feminine' !alphanumeric end
272
- rule identified ('known'/'identified') !alphanumeric end
273
- rule if 'if' !alphanumeric end
274
- rule in 'in' !alphanumeric end
275
- rule import 'import' !alphanumeric end
276
- rule independent 'independent' !alphanumeric end
277
- rule stronglyintransitive 'strongly' s 'intransitive' !alphanumeric end
278
- rule intransitive 'intransitive' !alphanumeric end
279
- rule irreflexive 'irreflexive' !alphanumeric end
280
- rule is 'is' !alphanumeric end
281
- rule it 'it' !alphanumeric end
282
- rule its 'its' !alphanumeric end
283
- rule masculine 'masculine' !alphanumeric end
284
- rule maybe 'maybe' !alphanumeric end
285
- rule only 'only' !alphanumeric end
286
- rule or 'or' !alphanumeric end
287
- rule of 'of' !alphanumeric end
288
- rule ordering_prefix by s (ascending/descending)? s end
289
- rule otherwise 'otherwise' !alphanumeric end
290
- rule partitioned 'partitioned' !alphanumeric end
291
- rule personal 'personal' !alphanumeric end
292
- rule radix_point '.' end
293
- rule reflexive 'reflexive' !alphanumeric end
294
- rule returning 'returning' !alphanumeric end
295
- rule separate 'separate' !alphanumeric end
296
- rule so_that 'so' S that end
297
- rule static 'static' !alphanumeric end
298
- rule symmetric 'symmetric' !alphanumeric end
299
- rule that 'that' !alphanumeric end
300
- rule the 'the' !alphanumeric end
301
- rule then 'then' !alphanumeric end
302
- rule to 'to' !alphanumeric end
303
- rule to_avoid to s 'avoid' !alphanumeric end
304
- rule transient 'transient' !alphanumeric end
305
- rule transitive 'transitive' !alphanumeric end
306
- rule true 'true' !alphanumeric end
307
- rule vocabulary 'vocabulary' !alphanumeric end
308
- rule where 'where' !alphanumeric end
309
- rule which 'which' !alphanumeric end
310
- rule was 'was' !alphanumeric end
311
- rule who 'who' !alphanumeric end
312
-
313
- end
314
- end
315
- end