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,53 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Node
4
+
5
+ def resolve_ruby_const(name)
6
+ name.split('::').inject(::Kernel){|mod,const|
7
+ mod.const_get(const)
8
+ }
9
+ end
10
+
11
+ def metadata
12
+ m = captures[:metadata].first
13
+ m && m.value
14
+ end
15
+
16
+ def unique_names!(cs, kind = "constraint")
17
+ names = {}
18
+ cs.map(&:name).compact.each do |n|
19
+ names.merge!(n => true) do |k,_,_|
20
+ raise Error, "Duplicate #{kind} name `#{k}`"
21
+ end
22
+ end
23
+ cs
24
+ end
25
+
26
+ def self.included(by)
27
+ by.extend(ClassHelpers)
28
+ end
29
+
30
+ module ClassHelpers
31
+
32
+ def capture(*names)
33
+ names.each do |name|
34
+ define_method(name) do
35
+ captures[name].first
36
+ end
37
+ end
38
+ end
39
+
40
+ def capture_str(*names)
41
+ names.each do |name|
42
+ define_method(name) do
43
+ x = captures[name].first
44
+ x && x.to_s
45
+ end
46
+ end
47
+ end
48
+
49
+ end # module ClassHelpers
50
+
51
+ end # module Node
52
+ end # module Syntax
53
+ end # module AstNode
@@ -0,0 +1,28 @@
1
+ require_relative 'type/system'
2
+ require_relative 'type/definitions'
3
+ require_relative 'type/type_def'
4
+ require_relative 'type/main_type'
5
+ require_relative 'type/expression'
6
+ require_relative 'type/attribute'
7
+ require_relative 'type/heading'
8
+ require_relative 'type/any_type'
9
+ require_relative 'type/builtin_type'
10
+ require_relative 'type/sub_type'
11
+ require_relative 'type/constraint_def'
12
+ require_relative 'type/constraints'
13
+ require_relative 'type/named_constraint'
14
+ require_relative 'type/unnamed_constraint'
15
+ require_relative 'type/seq_type'
16
+ require_relative 'type/set_type'
17
+ require_relative 'type/struct_type'
18
+ require_relative 'type/tuple_type'
19
+ require_relative 'type/relation_type'
20
+ require_relative 'type/union_type'
21
+ require_relative 'type/type_ref'
22
+ require_relative 'type/ad_type'
23
+ require_relative 'type/contract'
24
+ require_relative 'type/inline_pair'
25
+ require_relative 'type/external_pair'
26
+ require_relative 'type/lambda_expr'
27
+ require_relative 'type/metadata'
28
+ require_relative 'type/metadata_attr'
@@ -0,0 +1,29 @@
1
+ module Finitio
2
+ module Syntax
3
+ module AdType
4
+ include Node
5
+
6
+ capture :builtin_type_name
7
+
8
+ def compile(factory)
9
+ name = builtin_type_name
10
+ clazz = name ? resolve_ruby_const(name.to_s) : nil
11
+ contracts = compile_contracts(factory, clazz)
12
+ contracts = unique_names!(contracts, "contract")
13
+ factory.adt(clazz, contracts)
14
+ end
15
+
16
+ def compile_contracts(factory, clazz)
17
+ captures[:contract].map{|c| c.compile(factory, clazz) }
18
+ end
19
+
20
+ def to_ast
21
+ [
22
+ :ad_type,
23
+ builtin_type_name ? builtin_type_name.to_s : nil
24
+ ] + captures[:contract].map(&:to_ast)
25
+ end
26
+
27
+ end # module AdType
28
+ end # module Syntax
29
+ end # module Finitio
@@ -1,7 +1,7 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module AnyType
4
- include Support
4
+ include Node
5
5
 
6
6
  def compile(factory)
7
7
  factory.any
@@ -0,0 +1,33 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Attribute
4
+ include Node
5
+
6
+ capture :type, :multiplicity
7
+ capture_str :attribute_name
8
+
9
+ def optional?
10
+ multiplicity == ':?'
11
+ end
12
+
13
+ def required?
14
+ multiplicity == ':'
15
+ end
16
+
17
+ def compile(factory)
18
+ n = attribute_name.to_sym
19
+ t = type.compile(factory)
20
+ r = required?
21
+ m = metadata
22
+ factory.attribute(n, t, r, m)
23
+ end
24
+
25
+ def to_ast
26
+ ast = [:attribute, attribute_name, type.to_ast]
27
+ ast << false unless required?
28
+ ast
29
+ end
30
+
31
+ end # module BuiltinType
32
+ end # module Syntax
33
+ end # module Finitio
@@ -1,7 +1,9 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module BuiltinType
4
- include Support
4
+ include Node
5
+
6
+ capture :builtin_type_name
5
7
 
6
8
  def compile(factory)
7
9
  clazz = resolve_ruby_const(builtin_type_name.to_s)
@@ -1,15 +1,16 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module ConstraintDef
4
+ include Node
5
+
6
+ capture :var_name, :constraints
4
7
 
5
8
  def compile(factory)
6
9
  constraints.compile(var_name.to_s)
7
10
  end
8
11
 
9
12
  def to_ast
10
- ast = constraints.to_ast(var_name.to_s)
11
- ast = [ast] if ast.first.is_a?(Symbol)
12
- ast
13
+ constraints.to_ast(var_name.to_s)
13
14
  end
14
15
 
15
16
  end # module ConstraintDef
@@ -0,0 +1,17 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Constraints
4
+ include Node
5
+
6
+ def compile(var_name)
7
+ cs = captures[:constraint].map{|c| c.compile(var_name) }
8
+ unique_names!(cs, 'constraint')
9
+ end
10
+
11
+ def to_ast(var_name)
12
+ captures[:constraint].map{|c| c.to_ast(var_name) }
13
+ end
14
+
15
+ end # module Constraints
16
+ end # module Syntax
17
+ end # module Finitio
@@ -1,10 +1,16 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module Contract
4
+ include Node
5
+
6
+ capture :type, :pair
7
+ capture_str :contract_name
4
8
 
5
9
  def compile(factory, clazz)
6
- contract = [ type.compile(factory) ] + compile_pair(factory, clazz)
7
- { contract_name.to_sym => contract }
10
+ name = contract_name.to_sym
11
+ infotype = type.compile(factory)
12
+ dresser, undresser = compile_pair(factory, clazz)
13
+ factory.contract(infotype, dresser, undresser, name, metadata)
8
14
  end
9
15
 
10
16
  def compile_pair(factory, clazz)
@@ -25,7 +31,7 @@ module Finitio
25
31
  def to_ast
26
32
  ast = [
27
33
  :contract,
28
- contract_name.to_s,
34
+ contract_name,
29
35
  (type && type.to_ast)
30
36
  ]
31
37
  ast << pair.to_ast if pair
@@ -1,6 +1,7 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module Definitions
4
+ include Node
4
5
 
5
6
  def compile(system)
6
7
  captures[:type_def].each do |node|
@@ -1,9 +1,10 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module Expression
4
+ include Node
4
5
 
5
6
  def compile(var_name)
6
- expr = "->(#{var_name}){ #{self} }"
7
+ expr = "->(#{var_name}){ #{to_str} }"
7
8
  ::Kernel.eval(expr)
8
9
  end
9
10
 
@@ -1,7 +1,9 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module ExternalPair
4
- include Support
4
+ include Node
5
+
6
+ capture :builtin_type_name
5
7
 
6
8
  def compile(factory)
7
9
  clazz = resolve_ruby_const(builtin_type_name.to_s)
@@ -0,0 +1,30 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Heading
4
+ include Node
5
+
6
+ capture :allow_extra
7
+
8
+ def allow_extra?
9
+ !allow_extra.nil?
10
+ end
11
+
12
+ def multi?
13
+ captures[:attribute].any?{|a| a.optional? } or allow_extra?
14
+ end
15
+
16
+ def attributes(factory)
17
+ captures[:attribute].map{|a| a.compile(factory) }
18
+ end
19
+
20
+ def compile(factory)
21
+ Finitio::Heading.new(attributes(factory), allow_extra: allow_extra?)
22
+ end
23
+
24
+ def to_ast
25
+ captures[:attribute].map(&:to_ast).unshift(:heading)
26
+ end
27
+
28
+ end # module Heading
29
+ end # module Syntax
30
+ end # module Finitio
@@ -1,7 +1,9 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module InlinePair
4
- include Support
4
+ include Node
5
+
6
+ capture :dress, :undress
5
7
 
6
8
  def compile(factory)
7
9
  [ dress.compile(factory), undress.compile(factory) ]
@@ -1,6 +1,9 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module LambdaExpr
4
+ include Node
5
+
6
+ capture :var_name, :expression
4
7
 
5
8
  def compile(factory)
6
9
  expression.compile(var_name)
@@ -0,0 +1,18 @@
1
+ module Finitio
2
+ module Syntax
3
+ module MainType
4
+ include Node
5
+
6
+ capture :type
7
+
8
+ def compile(system)
9
+ system.add_type(type.compile(system), 'Main', metadata)
10
+ end
11
+
12
+ def to_ast
13
+ type.to_ast
14
+ end
15
+
16
+ end # module MainType
17
+ end # module Syntax
18
+ end # module Finitio
@@ -0,0 +1,18 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Metadata
4
+ include Node
5
+
6
+ capture :description
7
+
8
+ def value
9
+ if description
10
+ { description: description.to_str.strip }
11
+ else
12
+ Hash[captures[:metadata_attr].map(&:value)]
13
+ end
14
+ end
15
+
16
+ end # module Metadata
17
+ end # module Syntax
18
+ end # module Metadata
@@ -0,0 +1,15 @@
1
+ module Finitio
2
+ module Syntax
3
+ module MetadataAttr
4
+ include Node
5
+
6
+ capture_str :attribute_name
7
+ capture :literal
8
+
9
+ def value
10
+ [ attribute_name.to_sym, literal.value ]
11
+ end
12
+
13
+ end # module MetadataAttr
14
+ end # module Syntax
15
+ end # module Metadata
@@ -1,15 +1,22 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module NamedConstraint
4
+ include Node
5
+
6
+ capture :expression
7
+ capture_str :constraint_name
4
8
 
5
9
  def compile(var_name)
6
- { constraint_name.to_sym => expression.compile(var_name) }
10
+ p = expression.compile(var_name)
11
+ n = constraint_name.to_sym
12
+ m = metadata
13
+ Constraint.new(p, n, metadata)
7
14
  end
8
15
 
9
16
  def to_ast(var_name)
10
17
  [ :constraint,
11
- constraint_name.to_s,
12
- [:fn, [:parameters, var_name], [:source, expression.to_s.strip]] ]
18
+ constraint_name,
19
+ [:fn, [:parameters, var_name], [:source, expression.to_str.strip]] ]
13
20
  end
14
21
 
15
22
  end # module NamedConstraint
@@ -0,0 +1,24 @@
1
+ module Finitio
2
+ module Syntax
3
+ module RelationType
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_relation : :relation
20
+ end
21
+
22
+ end # module RelationType
23
+ end # module Syntax
24
+ end # module Finitio
@@ -1,6 +1,9 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module SeqType
4
+ include Node
5
+
6
+ capture :type
4
7
 
5
8
  def compile(factory)
6
9
  elm_type = type.compile(factory)
@@ -1,6 +1,9 @@
1
1
  module Finitio
2
2
  module Syntax
3
3
  module SetType
4
+ include Node
5
+
6
+ capture :type
4
7
 
5
8
  def compile(factory)
6
9
  elm_type = type.compile(factory)