kalc 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -85,6 +85,18 @@ module Kalc
85
85
  end
86
86
  end
87
87
 
88
+ class NonOps
89
+ attr_reader :value
90
+
91
+ def initialize(value)
92
+ @value = value
93
+ end
94
+
95
+ def eval(context)
96
+ Arithmetic.new(@value.left.eval(context), @value.right.eval(context), @value.operator).eval(context)
97
+ end
98
+ end
99
+
88
100
  class Ops
89
101
  attr_reader :left
90
102
  attr_reader :ops
@@ -156,6 +156,16 @@ class Kalc::Grammar < Parslet::Parser
156
156
  left_paren >> conditional_expression >> right_paren
157
157
  }
158
158
 
159
+ rule(:non_ops_atom) {
160
+ paren_expression.as(:paren_expression) | variable.as(:variable) | number
161
+ }
162
+
163
+ rule(:non_ops_expression) {
164
+ (non_ops_atom.as(:left) >>
165
+ power_of >>
166
+ non_ops_atom.as(:right)).as(:non_ops)
167
+ }
168
+
159
169
  # IF(1, 2, 3)
160
170
  # AND(1, 2, ...)
161
171
  rule(:function_call_expression) {
@@ -165,8 +175,8 @@ class Kalc::Grammar < Parslet::Parser
165
175
 
166
176
  # 1 * 2
167
177
  rule(:multiplicative_expression) {
168
- function_call_expression.as(:left) >>
169
- ((power_of | multiply | divide | modulus) >>
178
+ (non_ops_expression | function_call_expression).as(:left) >>
179
+ ((multiply | divide | modulus) >>
170
180
  multiplicative_expression.as(:right)).repeat.as(:ops)
171
181
  }
172
182
 
@@ -13,6 +13,14 @@ module Kalc
13
13
  right
14
14
  }
15
15
 
16
+ rule(:left => subtree(:left), :non_ops => []) {
17
+ left
18
+ }
19
+
20
+ rule(:right => subtree(:right), :non_ops => []) {
21
+ right
22
+ }
23
+
16
24
  rule(:commands => sequence(:commands)) {
17
25
  Ast::Commands.new(commands)
18
26
  }
@@ -45,6 +53,10 @@ module Kalc
45
53
  Ast::FloatingPointNumber.new(number)
46
54
  }
47
55
 
56
+ rule(:non_ops => subtree(:non_ops)) {
57
+ Ast::NonOps.new(non_ops)
58
+ }
59
+
48
60
  rule(:left => simple(:left), :ops => subtree(:ops)) {
49
61
  Ast::Ops.new(left, ops)
50
62
  }
@@ -1,3 +1,3 @@
1
1
  module Kalc
2
- VERSION = "0.5.4"
2
+ VERSION = "0.5.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kalc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: