finitio 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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'