finitio 0.4.1 → 0.5.0

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 (270) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +66 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +34 -30
  5. data/finitio.gemspec +1 -1
  6. data/lib/finitio.rb +7 -39
  7. data/lib/finitio/errors.rb +14 -0
  8. data/lib/finitio/support.rb +4 -1
  9. data/lib/finitio/support/attribute.rb +13 -7
  10. data/lib/finitio/support/compilation.rb +55 -0
  11. data/lib/finitio/support/constraint.rb +46 -0
  12. data/lib/finitio/support/contract.rb +33 -0
  13. data/lib/finitio/support/dress_helper.rb +3 -2
  14. data/lib/finitio/support/heading.rb +57 -17
  15. data/lib/finitio/support/metadata.rb +20 -0
  16. data/lib/finitio/support/type_factory.rb +154 -41
  17. data/lib/finitio/syntax.rb +16 -31
  18. data/lib/finitio/syntax/expr.rb +56 -0
  19. data/lib/finitio/syntax/expr/arith_op.rb +22 -0
  20. data/lib/finitio/syntax/expr/comparison.rb +22 -0
  21. data/lib/finitio/syntax/expr/fn_call.rb +24 -0
  22. data/lib/finitio/syntax/expr/identifier.rb +18 -0
  23. data/lib/finitio/syntax/expr/literal.rb +19 -0
  24. data/lib/finitio/syntax/expr/logic_dyadic.rb +22 -0
  25. data/lib/finitio/syntax/expr/logic_not.rb +21 -0
  26. data/lib/finitio/syntax/expr/oo_call.rb +24 -0
  27. data/lib/finitio/syntax/expr/parenthesized.rb +20 -0
  28. data/lib/finitio/syntax/expr/unary_minus_op.rb +21 -0
  29. data/lib/finitio/syntax/expressions.citrus +129 -0
  30. data/lib/finitio/syntax/finitio.citrus +10 -208
  31. data/lib/finitio/syntax/finitio.sexp +5 -1
  32. data/lib/finitio/syntax/lexer.citrus +91 -0
  33. data/lib/finitio/syntax/literal.rb +16 -0
  34. data/lib/finitio/syntax/literal/boolean.rb +22 -0
  35. data/lib/finitio/syntax/literal/integer.rb +14 -0
  36. data/lib/finitio/syntax/literal/real.rb +14 -0
  37. data/lib/finitio/syntax/literal/string.rb +14 -0
  38. data/lib/finitio/syntax/literals.citrus +44 -0
  39. data/lib/finitio/syntax/node.rb +53 -0
  40. data/lib/finitio/syntax/type.rb +28 -0
  41. data/lib/finitio/syntax/type/ad_type.rb +29 -0
  42. data/lib/finitio/syntax/{any_type.rb → type/any_type.rb} +1 -1
  43. data/lib/finitio/syntax/type/attribute.rb +33 -0
  44. data/lib/finitio/syntax/{builtin_type.rb → type/builtin_type.rb} +3 -1
  45. data/lib/finitio/syntax/{constraint_def.rb → type/constraint_def.rb} +4 -3
  46. data/lib/finitio/syntax/type/constraints.rb +17 -0
  47. data/lib/finitio/syntax/{contract.rb → type/contract.rb} +9 -3
  48. data/lib/finitio/syntax/{definitions.rb → type/definitions.rb} +1 -0
  49. data/lib/finitio/syntax/{expression.rb → type/expression.rb} +2 -1
  50. data/lib/finitio/syntax/{external_pair.rb → type/external_pair.rb} +3 -1
  51. data/lib/finitio/syntax/type/heading.rb +30 -0
  52. data/lib/finitio/syntax/{inline_pair.rb → type/inline_pair.rb} +3 -1
  53. data/lib/finitio/syntax/{lambda_expr.rb → type/lambda_expr.rb} +3 -0
  54. data/lib/finitio/syntax/type/main_type.rb +18 -0
  55. data/lib/finitio/syntax/type/metadata.rb +18 -0
  56. data/lib/finitio/syntax/type/metadata_attr.rb +15 -0
  57. data/lib/finitio/syntax/{named_constraint.rb → type/named_constraint.rb} +10 -3
  58. data/lib/finitio/syntax/type/relation_type.rb +24 -0
  59. data/lib/finitio/syntax/{seq_type.rb → type/seq_type.rb} +3 -0
  60. data/lib/finitio/syntax/{set_type.rb → type/set_type.rb} +3 -0
  61. data/lib/finitio/syntax/type/struct_type.rb +17 -0
  62. data/lib/finitio/syntax/{sub_type.rb → type/sub_type.rb} +3 -0
  63. data/lib/finitio/syntax/{system.rb → type/system.rb} +5 -4
  64. data/lib/finitio/syntax/type/tuple_type.rb +24 -0
  65. data/lib/finitio/syntax/{type_def.rb → type/type_def.rb} +8 -3
  66. data/lib/finitio/syntax/{type_ref.rb → type/type_ref.rb} +4 -1
  67. data/lib/finitio/syntax/{union_type.rb → type/union_type.rb} +1 -0
  68. data/lib/finitio/syntax/{unnamed_constraint.rb → type/unnamed_constraint.rb} +7 -1
  69. data/lib/finitio/syntax/types.citrus +196 -0
  70. data/lib/finitio/system.rb +15 -15
  71. data/lib/finitio/type.rb +38 -6
  72. data/lib/finitio/type/ad_type.rb +41 -18
  73. data/lib/finitio/type/alias_type.rb +37 -0
  74. data/lib/finitio/type/any_type.rb +7 -3
  75. data/lib/finitio/type/builtin_type.rb +5 -4
  76. data/lib/finitio/{support → type}/collection_type.rb +3 -4
  77. data/lib/finitio/type/hash_based_type.rb +91 -0
  78. data/lib/finitio/type/heading_based_type.rb +28 -0
  79. data/lib/finitio/type/multi_relation_type.rb +34 -0
  80. data/lib/finitio/type/multi_tuple_type.rb +29 -0
  81. data/lib/finitio/type/proxy_type.rb +40 -0
  82. data/lib/finitio/type/rel_based_type.rb +42 -0
  83. data/lib/finitio/type/relation_type.rb +6 -47
  84. data/lib/finitio/type/seq_type.rb +4 -0
  85. data/lib/finitio/type/set_type.rb +4 -0
  86. data/lib/finitio/type/struct_type.rb +84 -0
  87. data/lib/finitio/type/sub_type.rb +25 -22
  88. data/lib/finitio/type/tuple_type.rb +6 -57
  89. data/lib/finitio/type/union_type.rb +12 -5
  90. data/lib/finitio/version.rb +2 -2
  91. data/spec/{unit/attribute → attribute}/test_equality.rb +8 -5
  92. data/spec/{unit/attribute → attribute}/test_fetch_on.rb +5 -5
  93. data/spec/attribute/test_initialize.rb +26 -0
  94. data/spec/attribute/test_optional.rb +18 -0
  95. data/spec/attribute/test_required.rb +18 -0
  96. data/spec/attribute/test_to_name.rb +20 -0
  97. data/spec/constraint/test_anonymous.rb +20 -0
  98. data/spec/constraint/test_equality.rb +39 -0
  99. data/spec/constraint/test_name.rb +20 -0
  100. data/spec/constraint/test_named.rb +20 -0
  101. data/spec/constraint/test_triple_equal.rb +13 -0
  102. data/spec/{unit/qrb/system.q → finitio/system.fio} +0 -0
  103. data/spec/{unit/qrb → finitio}/test_ast.rb +0 -0
  104. data/spec/finitio/test_parse.rb +23 -0
  105. data/spec/{unit/qrb/test_parse.rb → finitio/test_system.rb} +6 -6
  106. data/spec/heading/test_allow_extra.rb +24 -0
  107. data/spec/{unit/heading → heading}/test_each.rb +2 -2
  108. data/spec/heading/test_equality.rb +38 -0
  109. data/spec/heading/test_hash.rb +38 -0
  110. data/spec/heading/test_hash_get.rb +17 -0
  111. data/spec/{unit/heading → heading}/test_initialize.rb +2 -2
  112. data/spec/heading/test_multi.rb +57 -0
  113. data/spec/{unit/heading → heading}/test_size.rb +0 -0
  114. data/spec/heading/test_to_name.rb +58 -0
  115. data/spec/spec_helper.rb +17 -1
  116. data/spec/syntax/expr/test_free_variables.rb +46 -0
  117. data/spec/syntax/expr/test_to_proc_source.rb +43 -0
  118. data/spec/{unit/syntax → syntax}/nodes/test_ad_type.rb +26 -26
  119. data/spec/{unit/syntax → syntax}/nodes/test_any_type.rb +2 -2
  120. data/spec/syntax/nodes/test_attribute.rb +65 -0
  121. data/spec/{unit/syntax → syntax}/nodes/test_builtin_type.rb +5 -5
  122. data/spec/{unit/syntax → syntax}/nodes/test_comment.rb +1 -1
  123. data/spec/{unit/syntax → syntax}/nodes/test_constraint_def.rb +3 -8
  124. data/spec/{unit/syntax → syntax}/nodes/test_constraints.rb +21 -16
  125. data/spec/{unit/syntax → syntax}/nodes/test_contract.rb +28 -35
  126. data/spec/{unit/syntax → syntax}/nodes/test_expression.rb +13 -5
  127. data/spec/{unit/syntax → syntax}/nodes/test_heading.rb +25 -7
  128. data/spec/syntax/nodes/test_metadata.rb +28 -0
  129. data/spec/{unit/syntax → syntax}/nodes/test_named_constraint.rb +8 -8
  130. data/spec/syntax/nodes/test_relation_type.rb +84 -0
  131. data/spec/{unit/syntax → syntax}/nodes/test_seq_type.rb +4 -4
  132. data/spec/{unit/syntax → syntax}/nodes/test_set_type.rb +4 -4
  133. data/spec/{unit/syntax → syntax}/nodes/test_spacing.rb +1 -1
  134. data/spec/syntax/nodes/test_struct_type.rb +38 -0
  135. data/spec/{unit/syntax → syntax}/nodes/test_sub_type.rb +14 -14
  136. data/spec/{unit/syntax → syntax}/nodes/test_system.rb +3 -3
  137. data/spec/syntax/nodes/test_tuple_type.rb +94 -0
  138. data/spec/syntax/nodes/test_type_def.rb +57 -0
  139. data/spec/{unit/syntax → syntax}/nodes/test_type_ref.rb +3 -3
  140. data/spec/{unit/syntax → syntax}/nodes/test_union_type.rb +3 -3
  141. data/spec/{unit/syntax → syntax}/nodes/test_unnamed_constraint.rb +7 -7
  142. data/spec/syntax/test_compile.rb +41 -0
  143. data/spec/{unit/syntax → syntax}/test_compile_type.rb +1 -1
  144. data/spec/{unit/system → system}/test_add_type.rb +6 -6
  145. data/spec/{unit/system → system}/test_dsl.rb +2 -2
  146. data/spec/{unit/system → system}/test_dup.rb +4 -4
  147. data/spec/{unit/system → system}/test_fetch.rb +4 -4
  148. data/spec/{unit/system → system}/test_get_type.rb +2 -2
  149. data/spec/{unit/system → system}/test_initialize.rb +0 -0
  150. data/spec/test_finitio.rb +8 -0
  151. data/spec/{unit/type → type}/ad_type/test_default_name.rb +1 -2
  152. data/spec/{unit/type → type}/ad_type/test_dress.rb +19 -9
  153. data/spec/{unit/type → type}/ad_type/test_include.rb +3 -3
  154. data/spec/{unit/type → type}/ad_type/test_initialize.rb +15 -8
  155. data/spec/{unit/type → type}/ad_type/test_name.rb +2 -2
  156. data/spec/type/alias_type/test_default_name.rb +10 -0
  157. data/spec/type/alias_type/test_delegation.rb +29 -0
  158. data/spec/type/alias_type/test_name.rb +10 -0
  159. data/spec/{unit/type → type}/any_type/test_default_name.rb +1 -1
  160. data/spec/{unit/type → type}/any_type/test_dress.rb +0 -0
  161. data/spec/{unit/type → type}/any_type/test_equality.rb +4 -4
  162. data/spec/{unit/type → type}/any_type/test_include.rb +2 -2
  163. data/spec/{unit/type → type}/any_type/test_initialize.rb +0 -0
  164. data/spec/{unit/type → type}/any_type/test_name.rb +2 -2
  165. data/spec/{unit/type → type}/builtin_type/test_default_name.rb +1 -1
  166. data/spec/{unit/type → type}/builtin_type/test_dress.rb +3 -3
  167. data/spec/{unit/type → type}/builtin_type/test_equality.rb +4 -4
  168. data/spec/{unit/type → type}/builtin_type/test_include.rb +2 -2
  169. data/spec/{unit/type → type}/builtin_type/test_initialize.rb +1 -1
  170. data/spec/{unit/type → type}/builtin_type/test_name.rb +2 -2
  171. data/spec/type/multi_relation_type/test_default_name.rb +19 -0
  172. data/spec/type/multi_relation_type/test_dress.rb +206 -0
  173. data/spec/type/multi_relation_type/test_equality.rb +36 -0
  174. data/spec/type/multi_relation_type/test_include.rb +89 -0
  175. data/spec/type/multi_relation_type/test_initialize.rb +29 -0
  176. data/spec/type/multi_relation_type/test_name.rb +27 -0
  177. data/spec/type/multi_tuple_type/test_default_name.rb +17 -0
  178. data/spec/type/multi_tuple_type/test_dress.rb +146 -0
  179. data/spec/type/multi_tuple_type/test_equality.rb +32 -0
  180. data/spec/type/multi_tuple_type/test_include.rb +73 -0
  181. data/spec/type/multi_tuple_type/test_initialize.rb +30 -0
  182. data/spec/type/multi_tuple_type/test_name.rb +24 -0
  183. data/spec/type/proxy_type/test_delegation.rb +37 -0
  184. data/spec/type/proxy_type/test_resolve.rb +29 -0
  185. data/spec/{unit/type → type}/relation_type/test_default_name.rb +0 -0
  186. data/spec/{unit/type → type}/relation_type/test_dress.rb +24 -24
  187. data/spec/{unit/type → type}/relation_type/test_equality.rb +6 -6
  188. data/spec/{unit/type → type}/relation_type/test_include.rb +4 -4
  189. data/spec/{unit/type → type}/relation_type/test_initialize.rb +2 -2
  190. data/spec/{unit/type → type}/relation_type/test_name.rb +0 -0
  191. data/spec/{unit/type → type}/seq_type/test_default_name.rb +0 -0
  192. data/spec/{unit/type → type}/seq_type/test_dress.rb +5 -5
  193. data/spec/{unit/type → type}/seq_type/test_equality.rb +4 -4
  194. data/spec/{unit/type → type}/seq_type/test_include.rb +4 -4
  195. data/spec/{unit/type → type}/seq_type/test_initialize.rb +3 -3
  196. data/spec/{unit/type → type}/seq_type/test_name.rb +0 -0
  197. data/spec/{unit/type → type}/set_type/test_default_name.rb +0 -0
  198. data/spec/{unit/type → type}/set_type/test_dress.rb +8 -8
  199. data/spec/{unit/type → type}/set_type/test_equality.rb +4 -4
  200. data/spec/{unit/type → type}/set_type/test_include.rb +4 -4
  201. data/spec/{unit/type → type}/set_type/test_initialize.rb +3 -3
  202. data/spec/{unit/type → type}/set_type/test_name.rb +0 -0
  203. data/spec/type/struct_type/test_default_name.rb +10 -0
  204. data/spec/type/struct_type/test_dress.rb +105 -0
  205. data/spec/type/struct_type/test_equality.rb +28 -0
  206. data/spec/type/struct_type/test_include.rb +40 -0
  207. data/spec/type/struct_type/test_initialize.rb +22 -0
  208. data/spec/type/struct_type/test_name.rb +20 -0
  209. data/spec/{unit/type → type}/sub_type/test_default_name.rb +2 -2
  210. data/spec/{unit/type → type}/sub_type/test_dress.rb +14 -14
  211. data/spec/type/sub_type/test_equality.rb +46 -0
  212. data/spec/{unit/type → type}/sub_type/test_include.rb +6 -6
  213. data/spec/type/sub_type/test_initialize.rb +13 -0
  214. data/spec/{unit/type → type}/sub_type/test_name.rb +4 -4
  215. data/spec/{unit/type → type}/tuple_type/test_default_name.rb +0 -0
  216. data/spec/{unit/type → type}/tuple_type/test_dress.rb +18 -18
  217. data/spec/{unit/type → type}/tuple_type/test_equality.rb +6 -6
  218. data/spec/{unit/type → type}/tuple_type/test_include.rb +4 -4
  219. data/spec/{unit/type → type}/tuple_type/test_initialize.rb +4 -4
  220. data/spec/{unit/type → type}/tuple_type/test_name.rb +0 -0
  221. data/spec/{unit/type → type}/union_type/test_default_name.rb +0 -0
  222. data/spec/{unit/type → type}/union_type/test_dress.rb +7 -6
  223. data/spec/{unit/type → type}/union_type/test_equality.rb +7 -7
  224. data/spec/{unit/type → type}/union_type/test_include.rb +3 -3
  225. data/spec/{unit/type → type}/union_type/test_initialize.rb +3 -3
  226. data/spec/{unit/type → type}/union_type/test_name.rb +0 -0
  227. data/spec/{unit/type_factory → type_factory}/dsl/test_adt.rb +4 -4
  228. data/spec/{unit/type_factory → type_factory}/dsl/test_any.rb +1 -1
  229. data/spec/{unit/type_factory → type_factory}/dsl/test_attribute.rb +16 -2
  230. data/spec/{unit/type_factory → type_factory}/dsl/test_attributes.rb +1 -1
  231. data/spec/{unit/type_factory → type_factory}/dsl/test_builtin.rb +3 -3
  232. data/spec/type_factory/dsl/test_multi_relation.rb +39 -0
  233. data/spec/type_factory/dsl/test_multi_tuple.rb +37 -0
  234. data/spec/{unit/type_factory → type_factory}/dsl/test_relation.rb +6 -6
  235. data/spec/{unit/type_factory → type_factory}/dsl/test_seq.rb +4 -4
  236. data/spec/{unit/type_factory → type_factory}/dsl/test_set.rb +4 -4
  237. data/spec/type_factory/dsl/test_struct.rb +45 -0
  238. data/spec/{unit/type_factory → type_factory}/dsl/test_subtype.rb +10 -8
  239. data/spec/{unit/type_factory → type_factory}/dsl/test_tuple.rb +5 -5
  240. data/spec/{unit/type_factory → type_factory}/dsl/test_union.rb +6 -6
  241. data/spec/{unit/type_factory → type_factory}/factory/test_builtin.rb +1 -1
  242. data/spec/{unit/type_factory → type_factory}/factory/test_seq_type.rb +2 -2
  243. data/spec/{unit/type_factory → type_factory}/factory/test_set_type.rb +2 -2
  244. data/spec/type_factory/factory/test_struct_type.rb +18 -0
  245. data/spec/{unit/type_factory → type_factory}/factory/test_sub_type.rb +7 -7
  246. data/spec/{unit/type_factory → type_factory}/factory/test_tuple_type.rb +4 -4
  247. metadata +398 -286
  248. data/lib/finitio/data_type.rb +0 -29
  249. data/lib/finitio/syntax/ad_type.rb +0 -32
  250. data/lib/finitio/syntax/attribute.rb +0 -15
  251. data/lib/finitio/syntax/constraints.rb +0 -22
  252. data/lib/finitio/syntax/heading.rb +0 -19
  253. data/lib/finitio/syntax/relation_type.rb +0 -15
  254. data/lib/finitio/syntax/support.rb +0 -13
  255. data/lib/finitio/syntax/tuple_type.rb +0 -15
  256. data/spec/acceptance/Finitio/test_default.rb +0 -96
  257. data/spec/acceptance/Finitio/test_parsing.rb +0 -15
  258. data/spec/acceptance/ad_type/test_in_finitio.rb +0 -82
  259. data/spec/acceptance/ad_type/test_in_ruby.rb +0 -60
  260. data/spec/unit/attribute/test_initialize.rb +0 -13
  261. data/spec/unit/attribute/test_to_name.rb +0 -10
  262. data/spec/unit/heading/test_equality.rb +0 -28
  263. data/spec/unit/heading/test_to_name.rb +0 -32
  264. data/spec/unit/syntax/nodes/test_attribute.rb +0 -38
  265. data/spec/unit/syntax/nodes/test_relation_type.rb +0 -59
  266. data/spec/unit/syntax/nodes/test_tuple_type.rb +0 -59
  267. data/spec/unit/syntax/nodes/test_type_def.rb +0 -33
  268. data/spec/unit/test_finitio.rb +0 -15
  269. data/spec/unit/type/sub_type/test_equality.rb +0 -34
  270. data/spec/unit/type/sub_type/test_initialize.rb +0 -16
@@ -0,0 +1,17 @@
1
+ module Finitio
2
+ module Syntax
3
+ module StructType
4
+ include Node
5
+
6
+ def compile(factory)
7
+ component_types = captures[:type].map{|x| x.compile(factory) }
8
+ factory.struct(component_types)
9
+ end
10
+
11
+ def to_ast
12
+ captures[:type].map(&:to_ast).unshift(:struct_type)
13
+ end
14
+
15
+ end # module StructType
16
+ end # module Syntax
17
+ end # module Finitio
@@ -1,6 +1,9 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module SubType
4
+ include Node
5
+
6
+ capture :rel_type, :constraint_def
4
7
 
5
8
  def compile(factory)
6
9
  s = rel_type.compile(factory)
@@ -1,18 +1,19 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module System
4
+ include Node
5
+
6
+ capture :definitions, :main_type
4
7
 
5
8
  def compile(system)
6
9
  definitions.compile(system)
7
- if type
8
- system.main = type.compile(system)
9
- end
10
+ main_type.compile(system) if main_type
10
11
  system
11
12
  end
12
13
 
13
14
  def to_ast
14
15
  ast = [ :system ] + definitions.to_ast
15
- ast << type.to_ast if type
16
+ ast << main_type.to_ast if main_type
16
17
  ast
17
18
  end
18
19
 
@@ -0,0 +1,24 @@
1
+ module Finitio
2
+ module Syntax
3
+ module TupleType
4
+ include Node
5
+
6
+ capture :heading
7
+
8
+ def compile(factory)
9
+ factory.send(kind, heading.compile(factory))
10
+ end
11
+
12
+ def to_ast
13
+ [ :"#{kind}_type", heading.to_ast ]
14
+ end
15
+
16
+ private
17
+
18
+ def kind
19
+ heading.multi? ? :multi_tuple : :tuple
20
+ end
21
+
22
+ end # module TupleType
23
+ end # module Syntax
24
+ end # module Finitio
@@ -1,16 +1,21 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module TypeDef
4
+ include Node
5
+
6
+ capture :type
7
+ capture :type_name
4
8
 
5
9
  def compile(system)
6
10
  t = type.compile(system)
7
- t.name = type_name.to_s
8
- system.add_type(t)
11
+ n = type_name && type_name.to_str
12
+ m = metadata
13
+ system.add_type(t, n, m)
9
14
  t
10
15
  end
11
16
 
12
17
  def to_ast
13
- [:type_def, type_name.to_s, type.to_ast]
18
+ [:type_def, type_name, type.to_ast]
14
19
  end
15
20
 
16
21
  end # module TypeDef
@@ -1,10 +1,13 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module TypeRef
4
+ include Node
5
+
6
+ capture :type_name
4
7
 
5
8
  def compile(factory)
6
9
  factory.fetch(type_name.to_s) do |n|
7
- raise Error, "Unknown type `#{n}`"
10
+ factory.proxy(n)
8
11
  end
9
12
  end
10
13
 
@@ -1,6 +1,7 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module UnionType
4
+ include Node
4
5
 
5
6
  def compile(factory)
6
7
  cds = captures[:sub_type].map{|x| x.compile(factory) }
@@ -1,9 +1,15 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module UnnamedConstraint
4
+ include Node
5
+
6
+ capture :expression
4
7
 
5
8
  def compile(var_name)
6
- { predicate: expression.compile(var_name) }
9
+ p = expression.compile(var_name)
10
+ n = nil
11
+ m = metadata
12
+ Constraint.new(p, n, m)
7
13
  end
8
14
 
9
15
  def to_ast(var_name)
@@ -0,0 +1,196 @@
1
+ require 'finitio/syntax/lexer'
2
+ require 'finitio/syntax/literals'
3
+
4
+ grammar Finitio::Syntax::Types
5
+ include Finitio::Syntax::Lexer
6
+ include Finitio::Syntax::Literals
7
+
8
+ rule type_def
9
+ (metadata? type_name equal type)
10
+ <Finitio::Syntax::TypeDef>
11
+ end
12
+
13
+ rule main_type
14
+ (metadata? type)
15
+ <Finitio::Syntax::MainType>
16
+ end
17
+
18
+ rule type
19
+ union_type
20
+ end
21
+
22
+ # union and sub types
23
+
24
+ rule union_type
25
+ (sub_type (pipe sub_type)+)
26
+ <Finitio::Syntax::UnionType>
27
+ | sub_type
28
+ end
29
+
30
+ rule sub_type
31
+ (rel_type constraint_def)
32
+ <Finitio::Syntax::SubType>
33
+ | rel_type
34
+ end
35
+
36
+ rule constraint_def
37
+ ('(' spacing var_name pipe constraints spacing ')')
38
+ <Finitio::Syntax::ConstraintDef>
39
+ end
40
+
41
+ rule constraints
42
+ (constraint:named_constraint (opt_comma constraint:named_constraint)* opt_comma)
43
+ <Finitio::Syntax::Constraints>
44
+ | (spacing constraint:unnamed_constraint)
45
+ <Finitio::Syntax::Constraints>
46
+ end
47
+
48
+ rule named_constraint
49
+ (metadata? constraint_name colon expression)
50
+ <Finitio::Syntax::NamedConstraint>
51
+ end
52
+
53
+ rule unnamed_constraint
54
+ (metadata? expression)
55
+ <Finitio::Syntax::UnnamedConstraint>
56
+ end
57
+
58
+ # relational types
59
+
60
+ rule rel_type
61
+ relation_type
62
+ | tuple_type
63
+ | collection_type
64
+ end
65
+
66
+ rule relation_type
67
+ ('{{' spacing heading spacing '}}')
68
+ <Finitio::Syntax::RelationType>
69
+ end
70
+
71
+ rule tuple_type
72
+ ('{' spacing heading spacing '}')
73
+ <Finitio::Syntax::TupleType>
74
+ end
75
+
76
+ rule heading
77
+ (attribute? (opt_comma attribute)* (opt_comma allow_extra:dots)? opt_comma?)
78
+ <Finitio::Syntax::Heading>
79
+ end
80
+
81
+ rule attribute
82
+ (metadata? attribute_name spacing multiplicity:(':?' | ':') spacing type)
83
+ <Finitio::Syntax::Attribute>
84
+ end
85
+
86
+ # collection types
87
+
88
+ rule collection_type
89
+ set_type
90
+ | seq_type
91
+ | struct_type
92
+ | term_type
93
+ end
94
+
95
+ rule set_type
96
+ ('{' type '}')
97
+ <Finitio::Syntax::SetType>
98
+ end
99
+
100
+ rule seq_type
101
+ ('[' type ']')
102
+ <Finitio::Syntax::SeqType>
103
+ end
104
+
105
+ rule struct_type
106
+ ('<' type (comma type)* '>')
107
+ <Finitio::Syntax::StructType>
108
+ end
109
+
110
+ # terminal forms
111
+
112
+ rule term_type
113
+ ad_type
114
+ | builtin_type
115
+ | any_type
116
+ | type_ref
117
+ end
118
+
119
+ # ad type
120
+
121
+ rule ad_type
122
+ (('.' builtin_type_name)? spacing contract (opt_comma contract)* opt_comma)
123
+ <Finitio::Syntax::AdType>
124
+ end
125
+
126
+ rule contract
127
+ (metadata? '<' contract_name '>' spacing type spacing pair?)
128
+ <Finitio::Syntax::Contract>
129
+ end
130
+
131
+ rule pair
132
+ inline_pair
133
+ | external_pair
134
+ end
135
+
136
+ rule inline_pair
137
+ ('\\' dress:lambda_expr spacing '\\' undress:lambda_expr)
138
+ <Finitio::Syntax::InlinePair>
139
+ end
140
+
141
+ rule external_pair
142
+ ('.' builtin_type_name)
143
+ <Finitio::Syntax::ExternalPair>
144
+ end
145
+
146
+ # any
147
+
148
+ rule any_type
149
+ '.'
150
+ <Finitio::Syntax::AnyType>
151
+ end
152
+
153
+ # builtin and refs
154
+
155
+ rule builtin_type
156
+ ('.' builtin_type_name)
157
+ <Finitio::Syntax::BuiltinType>
158
+ end
159
+
160
+ rule type_ref
161
+ (type_name spacing)
162
+ <Finitio::Syntax::TypeRef>
163
+ end
164
+
165
+ # metadata
166
+
167
+ rule metadata
168
+ (open_metadata metadata_attr (opt_comma metadata_attr)* opt_comma close_metadata)
169
+ <Finitio::Syntax::Metadata>
170
+ | (open_metadata description:(!'-/' .)+ close_metadata)
171
+ <Finitio::Syntax::Metadata>
172
+ end
173
+
174
+ rule metadata_attr
175
+ (attribute_name colon literal)
176
+ <Finitio::Syntax::MetadataAttr>
177
+ end
178
+
179
+ # lambda and expressions
180
+
181
+ rule lambda_expr
182
+ ('(' spacing var_name pipe expression spacing ')')
183
+ <Finitio::Syntax::LambdaExpr>
184
+ end
185
+
186
+ rule expression
187
+ expression_part+
188
+ <Finitio::Syntax::Expression>
189
+ end
190
+
191
+ rule expression_part
192
+ ('(' expression ')')
193
+ | (![\(,\)\n] .)+
194
+ end
195
+
196
+ end
@@ -4,22 +4,12 @@ module Finitio
4
4
  #
5
5
  class System
6
6
 
7
- def initialize(types = {}, main = nil)
7
+ def initialize(types = {})
8
8
  @types = types
9
- @main = main
10
9
  end
11
- attr_accessor :main
12
10
 
13
- DSL_METHODS.each do |dsl_method|
14
- define_method(dsl_method){|*args, &bl|
15
- factory.public_send(dsl_method, *args, &bl)
16
- }
17
- end
18
-
19
- def add_type(type)
20
- unless type.is_a?(Type)
21
- raise ArgumentError, "Finitio::Type expected, got `#{type}`"
22
- end
11
+ def add_type(type, name = nil, metadata = nil)
12
+ type = factory.type(type, name, metadata)
23
13
 
24
14
  if @types.has_key?(type.name)
25
15
  raise Error, "Duplicate type name `#{type.name}`"
@@ -29,10 +19,14 @@ module Finitio
29
19
  end
30
20
 
31
21
  def get_type(name)
32
- @types[name]
22
+ @types[name] || @types[name.to_s]
33
23
  end
34
24
  alias :[] :get_type
35
25
 
26
+ def main
27
+ self['Main']
28
+ end
29
+
36
30
  def fetch(name, &bl)
37
31
  @types.fetch(name, &bl)
38
32
  end
@@ -41,6 +35,12 @@ module Finitio
41
35
  @factory ||= TypeFactory.new
42
36
  end
43
37
 
38
+ TypeFactory::DSL_METHODS.each do |dsl_method|
39
+ define_method(dsl_method){|*args, &bl|
40
+ factory.public_send(dsl_method, *args, &bl)
41
+ }
42
+ end
43
+
44
44
  def dress(*args, &bl)
45
45
  raise Error, "No main type." unless main
46
46
  main.dress(*args, &bl)
@@ -56,7 +56,7 @@ module Finitio
56
56
  end
57
57
 
58
58
  def dup
59
- System.new(@types.dup, @main)
59
+ System.new(@types.dup)
60
60
  end
61
61
 
62
62
  end # class System
@@ -3,12 +3,29 @@ module Finitio
3
3
  # Abstract class for Finitio type (generators).
4
4
  #
5
5
  class Type
6
+ include Metadata
6
7
 
7
- def initialize(name)
8
+ def initialize(name, metadata)
8
9
  unless name.nil? or name.is_a?(String)
9
10
  raise ArgumentError, "String expected for type name, got `#{name}`"
10
11
  end
11
- @name = name
12
+ unless metadata.nil? or metadata.is_a?(Hash)
13
+ raise ArgumentError, "Hash expected for metadata, got `#{metadata}`"
14
+ end
15
+ @name = name
16
+ @metadata = metadata
17
+ end
18
+
19
+ def anonymous?
20
+ @name.nil?
21
+ end
22
+
23
+ def named?
24
+ !anonymous?
25
+ end
26
+
27
+ def default_name
28
+ raise NotImplementedError, "Missing #{self.class.name}#default_name"
12
29
  end
13
30
 
14
31
  def name
@@ -20,10 +37,6 @@ module Finitio
20
37
  @name = n
21
38
  end
22
39
 
23
- def to_s
24
- name.to_s
25
- end
26
-
27
40
  # Check if `value` belongs to this type. Returns true if it's the case,
28
41
  # false otherwise.
29
42
  #
@@ -41,6 +54,16 @@ module Finitio
41
54
  raise NotImplementedError, "Missing #{self.class.name}#dress"
42
55
  end
43
56
 
57
+ def to_s
58
+ name.to_s
59
+ end
60
+
61
+ def ==(other)
62
+ super || [ProxyType, AliasType].any?{|t|
63
+ other.is_a?(t) && other == self
64
+ }
65
+ end
66
+
44
67
  protected
45
68
 
46
69
  def set_equal?(s1, s2)
@@ -53,12 +76,21 @@ module Finitio
53
76
 
54
77
  end # class Type
55
78
  end # module Finitio
79
+ require_relative 'type/collection_type'
80
+ require_relative 'type/heading_based_type'
81
+ require_relative 'type/hash_based_type'
82
+ require_relative 'type/rel_based_type'
83
+ require_relative 'type/proxy_type'
84
+ require_relative 'type/alias_type'
56
85
  require_relative 'type/any_type'
57
86
  require_relative 'type/builtin_type'
58
87
  require_relative 'type/union_type'
59
88
  require_relative 'type/sub_type'
60
89
  require_relative 'type/seq_type'
61
90
  require_relative 'type/set_type'
91
+ require_relative 'type/struct_type'
62
92
  require_relative 'type/tuple_type'
93
+ require_relative 'type/multi_tuple_type'
63
94
  require_relative 'type/relation_type'
95
+ require_relative 'type/multi_relation_type'
64
96
  require_relative 'type/ad_type'