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
@@ -1,32 +1,14 @@
1
1
  require 'citrus'
2
- require_relative 'syntax/support'
3
- require_relative 'syntax/system'
4
- require_relative 'syntax/definitions'
5
- require_relative 'syntax/type_def'
6
- require_relative 'syntax/expression'
7
- require_relative 'syntax/attribute'
8
- require_relative 'syntax/heading'
9
- require_relative 'syntax/any_type'
10
- require_relative 'syntax/builtin_type'
11
- require_relative 'syntax/sub_type'
12
- require_relative 'syntax/constraint_def'
13
- require_relative 'syntax/constraints'
14
- require_relative 'syntax/named_constraint'
15
- require_relative 'syntax/unnamed_constraint'
16
- require_relative 'syntax/seq_type'
17
- require_relative 'syntax/set_type'
18
- require_relative 'syntax/tuple_type'
19
- require_relative 'syntax/relation_type'
20
- require_relative 'syntax/union_type'
21
- require_relative 'syntax/type_ref'
22
- require_relative 'syntax/ad_type'
23
- require_relative 'syntax/contract'
24
- require_relative 'syntax/inline_pair'
25
- require_relative 'syntax/external_pair'
26
- require_relative 'syntax/lambda_expr'
2
+ require_relative 'syntax/node'
3
+ require_relative 'syntax/literal'
4
+ require_relative 'syntax/expr'
5
+ require_relative 'syntax/type'
27
6
  module Finitio
28
7
  module Syntax
29
8
 
9
+ Citrus.load File.expand_path('../syntax/lexer.citrus', __FILE__)
10
+ Citrus.load File.expand_path('../syntax/literals.citrus', __FILE__)
11
+ Citrus.load File.expand_path('../syntax/expressions.citrus', __FILE__)
30
12
  Citrus.load File.expand_path('../syntax/finitio.citrus', __FILE__)
31
13
 
32
14
  def self.parse(source, *args, &bl)
@@ -38,13 +20,16 @@ module Finitio
38
20
  parse(source, root: "system").to_ast
39
21
  end
40
22
 
41
- def self.compile(source, system = Finitio::System.new)
42
- parse(source, root: "system").compile(system)
23
+ def self.compile(source, cpl = nil)
24
+ cpl = Compilation.coerce(cpl)
25
+ parse(source, root: "system").compile(cpl)
26
+ cpl.resolve_proxies!.system
43
27
  end
44
28
 
45
- def self.compile_type(source)
46
- parse(source, root: "type").compile(TypeFactory.new)
29
+ def self.compile_type(source, cpl = nil)
30
+ cpl = Compilation.coerce(cpl)
31
+ parse(source, root: "type").compile(cpl)
47
32
  end
48
33
 
49
- end
50
- end
34
+ end # module Syntax
35
+ end # module Finitio
@@ -0,0 +1,56 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ include Node
5
+
6
+ WORLD_VAR = "__world"
7
+
8
+ def self.included(by)
9
+ by.extend(Node::ClassHelpers)
10
+ end
11
+
12
+ def to_proc()
13
+ src = to_proc_src
14
+ ::Kernel.eval(src)
15
+ end
16
+
17
+ def to_proc_src
18
+ initializer = free_variables
19
+ .map{|v| "#{v} = __world.fetch(:#{v})" }
20
+ .join("\n")
21
+ <<-SRC.gsub(/^[ ]{10}/m,'')
22
+ ->(__world){
23
+ unless __world.is_a?(Hash) && __world.keys.all?{|k| k.is_a?(Symbol) }
24
+ raise "Invalid world: " + __world.inspect
25
+ end
26
+ #{initializer}
27
+ #{to_proc_source}
28
+ }
29
+ SRC
30
+ end
31
+
32
+ def to_proc_source
33
+ raise NotImplementedError
34
+ end
35
+
36
+ def free_variables
37
+ [].tap{|fvs| _free_variables(fvs) }.uniq
38
+ end
39
+
40
+ def _free_variables(fvs)
41
+ raise NotImplementedError
42
+ end
43
+
44
+ end # module Expr
45
+ end # module Syntax
46
+ end # module Finitio
47
+ require_relative 'expr/logic_dyadic'
48
+ require_relative 'expr/logic_not'
49
+ require_relative 'expr/comparison'
50
+ require_relative 'expr/arith_op'
51
+ require_relative 'expr/unary_minus_op'
52
+ require_relative 'expr/oo_call'
53
+ require_relative 'expr/fn_call'
54
+ require_relative 'expr/identifier'
55
+ require_relative 'expr/literal'
56
+ require_relative 'expr/parenthesized'
@@ -0,0 +1,22 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module ArithOp
5
+ include Expr
6
+
7
+ capture :left, :op, :right
8
+
9
+ def to_proc_source
10
+ l, r = left.to_proc_source, right.to_proc_source
11
+ "#{l}.#{op.to_str.strip}(#{r})"
12
+ end
13
+
14
+ def _free_variables(fvs)
15
+ left._free_variables(fvs)
16
+ right._free_variables(fvs)
17
+ end
18
+
19
+ end # module ArithOp
20
+ end # module Expr
21
+ end # module Syntax
22
+ end # module Finitio
@@ -0,0 +1,22 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module Comparison
5
+ include Expr
6
+
7
+ capture :left, :op, :right
8
+
9
+ def to_proc_source
10
+ l, r = left.to_proc_source, right.to_proc_source
11
+ "#{l}.#{op.to_str.strip}(#{r})"
12
+ end
13
+
14
+ def _free_variables(fvs)
15
+ left._free_variables(fvs)
16
+ right._free_variables(fvs)
17
+ end
18
+
19
+ end # module Comparison
20
+ end # module Expr
21
+ end # module Syntax
22
+ end # module Finitio
@@ -0,0 +1,24 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module FnCall
5
+ include Expr
6
+
7
+ capture :fn
8
+
9
+ def to_proc_source
10
+ args = captures[:expr].map(&:to_proc_source)
11
+ first, rest = args.first, args[1..-1]
12
+ "#{first}.#{fn}(#{rest.join(',')})"
13
+ end
14
+
15
+ def _free_variables(fvs)
16
+ captures[:expr].each do |e|
17
+ e._free_variables(fvs)
18
+ end
19
+ end
20
+
21
+ end # module FnCall
22
+ end # module Expr
23
+ end # module Syntax
24
+ end # module Finitio
@@ -0,0 +1,18 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module Identifier
5
+ include Expr
6
+
7
+ def to_proc_source(free = true)
8
+ self.to_str
9
+ end
10
+
11
+ def _free_variables(fvs)
12
+ fvs << self.to_str
13
+ end
14
+
15
+ end # module Identifier
16
+ end # module Expr
17
+ end # module Syntax
18
+ end # module Finitio
@@ -0,0 +1,19 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module Literal
5
+ include Expr
6
+
7
+ capture :literal
8
+
9
+ def to_proc_source
10
+ literal.to_ruby
11
+ end
12
+
13
+ def _free_variables(fvs)
14
+ end
15
+
16
+ end # module Identifier
17
+ end # module Expr
18
+ end # module Syntax
19
+ end # module Finitio
@@ -0,0 +1,22 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module LogicDyadic
5
+ include Expr
6
+
7
+ capture :left, :op, :right
8
+
9
+ def to_proc_source
10
+ l, r = left.to_proc_source, right.to_proc_source
11
+ "(#{l} #{op} #{r})"
12
+ end
13
+
14
+ def _free_variables(fvs)
15
+ left._free_variables(fvs)
16
+ right._free_variables(fvs)
17
+ end
18
+
19
+ end # module LogicDyadic
20
+ end # module Expr
21
+ end # module Syntax
22
+ end # module Finitio
@@ -0,0 +1,21 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module LogicNot
5
+ include Expr
6
+
7
+ capture :term
8
+
9
+ def to_proc_source
10
+ l = term.to_proc_source
11
+ "!(#{l})"
12
+ end
13
+
14
+ def _free_variables(fvs)
15
+ term._free_variables(fvs)
16
+ end
17
+
18
+ end # module LogicNot
19
+ end # module Expr
20
+ end # module Syntax
21
+ end # module Finitio
@@ -0,0 +1,24 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module OOCall
5
+ include Expr
6
+
7
+ capture :left
8
+
9
+ def to_proc_source
10
+ l = left.to_proc_source
11
+ r = captures[:right]
12
+ .map{|s| "fetch(:#{s.to_proc_source})" }
13
+ .join('.')
14
+ "#{l}.#{r}"
15
+ end
16
+
17
+ def _free_variables(fvs)
18
+ left._free_variables(fvs)
19
+ end
20
+
21
+ end # module OOCall
22
+ end # module Expr
23
+ end # module Syntax
24
+ end # module Finitio
@@ -0,0 +1,20 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module Parenthesized
5
+ include Expr
6
+
7
+ capture :expr
8
+
9
+ def to_proc_source
10
+ expr.to_proc_source
11
+ end
12
+
13
+ def _free_variables(fvs)
14
+ expr._free_variables(fvs)
15
+ end
16
+
17
+ end # module Parenthesized
18
+ end # module Expr
19
+ end # module Syntax
20
+ end # module Finitio
@@ -0,0 +1,21 @@
1
+ module Finitio
2
+ module Syntax
3
+ module Expr
4
+ module UnaryMinusOp
5
+ include Expr
6
+
7
+ capture :term
8
+
9
+ def to_proc_source
10
+ r = term.to_proc_source
11
+ "-#{r}"
12
+ end
13
+
14
+ def _free_variables(fvs)
15
+ term._free_variables(fvs)
16
+ end
17
+
18
+ end # module UnaryMinusOp
19
+ end # module Expr
20
+ end # module Syntax
21
+ end # module Finitio
@@ -0,0 +1,129 @@
1
+ require 'finitio/syntax/lexer'
2
+ require 'finitio/syntax/literals'
3
+
4
+ grammar Finitio::Syntax::Expressions
5
+ include Finitio::Syntax::Lexer
6
+ include Finitio::Syntax::Literals
7
+
8
+ rule expr
9
+ logic_or_expr
10
+ end
11
+
12
+ ### Boolean logic
13
+
14
+ rule logic_or_expr
15
+ (left:logic_and_expr op:or_operator right:logic_or_expr)
16
+ <Finitio::Syntax::Expr::LogicDyadic>
17
+ | logic_and_expr
18
+ end
19
+
20
+ rule or_operator
21
+ spaces? ('or' | '||') spaces?
22
+ end
23
+
24
+ rule logic_and_expr
25
+ (left:logic_not_expr op:and_operator right:logic_and_expr)
26
+ <Finitio::Syntax::Expr::LogicDyadic>
27
+ | logic_not_expr
28
+ end
29
+
30
+ rule and_operator
31
+ spaces? ('and' | '&&') spaces?
32
+ end
33
+
34
+ rule logic_not_expr
35
+ (not_operator term:logic_term)
36
+ <Finitio::Syntax::Expr::LogicNot>
37
+ | logic_term
38
+ end
39
+
40
+ rule not_operator
41
+ spaces? ('!' | 'not') spaces?
42
+ end
43
+
44
+ rule logic_term
45
+ comparison_expr
46
+ end
47
+
48
+ ### Comparisons
49
+
50
+ rule comparison_expr
51
+ (left:arith_expr op:comparison_operator right:comparison_expr)
52
+ <Finitio::Syntax::Expr::Comparison>
53
+ | arith_expr
54
+ end
55
+
56
+ rule comparison_operator
57
+ spaces? ('==' | '!=' | '<=' | '>=' | '<' | '>' | '=~') spaces?
58
+ end
59
+
60
+ ### Arithmetic
61
+
62
+ rule arith_expr
63
+ arith_plusminus_expr
64
+ end
65
+
66
+ rule arith_plusminus_expr
67
+ (left:arith_multdiv_expr op:plusminus_operator right:arith_plusminus_expr)
68
+ <Finitio::Syntax::Expr::ArithOp>
69
+ | arith_multdiv_expr
70
+ end
71
+
72
+ rule plusminus_operator
73
+ spaces? ('+' | '-') spaces?
74
+ end
75
+
76
+ rule arith_multdiv_expr
77
+ (left:arith_term_expr op:multdiv_operator right:arith_multdiv_expr)
78
+ <Finitio::Syntax::Expr::ArithOp>
79
+ | arith_term_expr
80
+ end
81
+
82
+ rule multdiv_operator
83
+ spaces? ('*' | '/') spaces?
84
+ end
85
+
86
+ rule arith_term_expr
87
+ ('-' term:arith_term_expr)
88
+ <Finitio::Syntax::Expr::UnaryMinusOp>
89
+ | oo_call
90
+ end
91
+
92
+ ### Function calls
93
+
94
+ rule oo_call
95
+ (left:fn_call ('.' right:identifier_expr)+)
96
+ <Finitio::Syntax::Expr::OOCall>
97
+ | fn_call
98
+ end
99
+
100
+ rule fn_call
101
+ (fn:term_expr '(' spaces? expr? (comma expr)* spaces? ')')
102
+ <Finitio::Syntax::Expr::FnCall>
103
+ | term_expr
104
+ end
105
+
106
+ ###
107
+
108
+ rule term_expr
109
+ identifier_expr
110
+ | literal_expr
111
+ | parenthesized_expr
112
+ end
113
+
114
+ rule identifier_expr
115
+ (!keyword /[a-zA-Z_][a-zA-Z0-9_]*/)
116
+ <Finitio::Syntax::Expr::Identifier>
117
+ end
118
+
119
+ rule literal_expr
120
+ (!eof literal)
121
+ <Finitio::Syntax::Expr::Literal>
122
+ end
123
+
124
+ rule parenthesized_expr
125
+ ('(' spaces? expr spaces? ')')
126
+ <Finitio::Syntax::Expr::Parenthesized>
127
+ end
128
+
129
+ end