formula_dsl 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/formula_dsl.gemspec +1 -1
- data/lib/formula_dsl/parser.rb +8 -8
- data/spec/formula_dsl/parser_spec.rb +44 -0
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/formula_dsl.gemspec
CHANGED
data/lib/formula_dsl/parser.rb
CHANGED
@@ -33,19 +33,19 @@ module FormulaDSL
|
|
33
33
|
|
34
34
|
#binary operations + - / *
|
35
35
|
rule :addition do
|
36
|
-
(
|
36
|
+
( argument.as(:left) >> space? >> add_operator >> space? >> ( argument ).as(:right) ).as(:+)
|
37
37
|
end
|
38
38
|
|
39
39
|
rule :subtraction do
|
40
|
-
(
|
40
|
+
( argument.as(:left) >> space? >> sub_operator >> space? >> ( argument ).as(:right) ).as(:-)
|
41
41
|
end
|
42
42
|
|
43
43
|
rule :multiplication do
|
44
|
-
(
|
44
|
+
( argument.as(:left) >> space? >> mult_operator >> space? >> ( argument ).as(:right) ).as(:*)
|
45
45
|
end
|
46
46
|
|
47
47
|
rule :division do
|
48
|
-
(
|
48
|
+
( argument.as(:left) >> space? >> div_operator >> space? >> ( argument ).as(:right) ).as(:/)
|
49
49
|
end
|
50
50
|
|
51
51
|
rule :function do
|
@@ -63,19 +63,19 @@ module FormulaDSL
|
|
63
63
|
# expression with other expression (compose expression)
|
64
64
|
# Ex: expression >> some_op >> number === [ Mont(data) - 1 ]
|
65
65
|
rule :subtraction_expression do
|
66
|
-
(single_expression.as(:left) >> space? >> sub_operator >> space? >> (
|
66
|
+
(single_expression.as(:left) >> space? >> sub_operator >> space? >> ( expression_list | argument).as(:right) ).as(:-)
|
67
67
|
end
|
68
68
|
|
69
69
|
rule :addition_expression do
|
70
|
-
(single_expression.as(:left) >> space? >> add_operator >> space? >> ( expression_list |
|
70
|
+
(single_expression.as(:left) >> space? >> add_operator >> space? >> ( expression_list | argument ).as(:right) ).as(:+)
|
71
71
|
end
|
72
72
|
|
73
73
|
rule :multiplication_expression do
|
74
|
-
(single_expression.as(:left) >> space? >> mult_operator >> space? >> (
|
74
|
+
(single_expression.as(:left) >> space? >> mult_operator >> space? >> (expression_list | argument).as(:right) ).as(:*)
|
75
75
|
end
|
76
76
|
|
77
77
|
rule :division_expression do
|
78
|
-
(single_expression.as(:left) >> space? >> div_operator >> space? >> (
|
78
|
+
(single_expression.as(:left) >> space? >> div_operator >> space? >> (expression_list | argument).as(:right) ).as(:/)
|
79
79
|
end
|
80
80
|
|
81
81
|
rule :string_concat_expression do
|
@@ -34,6 +34,34 @@ module FormulaDSL
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
context "Expressions based on identifier names (aka variables)" do
|
38
|
+
it "should recognize expression 'budget + fee' " do
|
39
|
+
ast = parser.parse('budget + fee')
|
40
|
+
ast.to_s.should == %Q({:+=>{:left=>"budget"@0, :right=>"fee"@9}})
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should recognize expression 'budget - fee' " do
|
44
|
+
ast = parser.parse('budget - fee')
|
45
|
+
ast.to_s.should == %Q({:-=>{:left=>"budget"@0, :right=>"fee"@9}})
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should recognize expression 'budget * fee' " do
|
49
|
+
ast = parser.parse('budget * fee')
|
50
|
+
ast.to_s.should == %Q({:*=>{:left=>"budget"@0, :right=>"fee"@9}})
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should recognize expression 'budget + 1 + fee' " do
|
54
|
+
ast = parser.parse('budget + 1 + fee')
|
55
|
+
ast.to_s.should == %Q({:+=>{:left=>{:+=>{:left=>"budget"@0, :right=>"1"@9}}, :right=>"fee"@13}})
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should recognize expression 'budget * 1 + fee' " do
|
59
|
+
ast = parser.parse('budget * 1 + fee')
|
60
|
+
ast.to_s.should == %Q({:+=>{:left=>{:*=>{:left=>"budget"@0, :right=>"1"@9}}, :right=>"fee"@13}})
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
37
65
|
context "Composed expression's " do
|
38
66
|
it "should recognize a function like 'Month(data)' " do
|
39
67
|
ast = parser.parse('Month(data)')
|
@@ -81,6 +109,22 @@ module FormulaDSL
|
|
81
109
|
ast = parser.parse('Month(data) + "/" + Year(data)')
|
82
110
|
ast.to_s.should == %Q({:+=>{:left=>{:function=>{:name=>"Month"@0, :args=>"data"@6}}, :right=>{:+=>{:left=>"\\\"/\\\""@14, :right=>{:function=>{:name=>"Year"@20, :args=>"data"@25}}}}}})
|
83
111
|
end
|
112
|
+
|
113
|
+
it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
|
114
|
+
ast = parser.parse('Month(data) - 1 + "/" + Year(data)')
|
115
|
+
ast.to_s.should == %Q({:-=>{:left=>{:function=>{:name=>\"Month\"@0, :args=>\"data\"@6}}, :right=>{:+=>{:left=>\"1\"@14, :right=>{:+=>{:left=>\"\\\"/\\\"\"@18, :right=>{:function=>{:name=>\"Year\"@24, :args=>\"data\"@29}}}}}}}})
|
116
|
+
end
|
117
|
+
|
118
|
+
it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
|
119
|
+
ast = parser.parse('Month(data) * 1 + "/" + Year(data)')
|
120
|
+
ast.to_s.should == %Q({:*=>{:left=>{:function=>{:name=>\"Month\"@0, :args=>\"data\"@6}}, :right=>{:+=>{:left=>\"1\"@14, :right=>{:+=>{:left=>\"\\\"/\\\"\"@18, :right=>{:function=>{:name=>\"Year\"@24, :args=>\"data\"@29}}}}}}}})
|
121
|
+
end
|
122
|
+
|
123
|
+
it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
|
124
|
+
ast = parser.parse('Month(data) / 1 + "/" + Year(data)')
|
125
|
+
ast.to_s.should == %Q({:/=>{:left=>{:function=>{:name=>\"Month\"@0, :args=>\"data\"@6}}, :right=>{:+=>{:left=>\"1\"@14, :right=>{:+=>{:left=>\"\\\"/\\\"\"@18, :right=>{:function=>{:name=>\"Year\"@24, :args=>\"data\"@29}}}}}}}})
|
126
|
+
end
|
127
|
+
|
84
128
|
end
|
85
129
|
|
86
130
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: formula_dsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -125,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash:
|
128
|
+
hash: -3658736757412770386
|
129
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|