Class: Trifle::Stats::Transponder::ExpressionEngine
- Inherits:
-
Object
- Object
- Trifle::Stats::Transponder::ExpressionEngine
show all
- Defined in:
- lib/trifle/stats/transponder/expression_engine.rb
Defined Under Namespace
Classes: Evaluator, Parser
Constant Summary
collapse
- LETTERS =
('a'..'z').to_a.freeze
- TOKEN_OPERATORS =
%w[+ - * / ( ) ,].freeze
- NUMBER_PATTERN =
/\A\d+(?:\.\d+)?/.freeze
- IDENT_PATTERN =
/\A[A-Za-z_][A-Za-z0-9_]*/.freeze
Class Method Summary
collapse
Class Method Details
.allowed_vars(count) ⇒ Object
19
20
21
|
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 19
def allowed_vars(count)
LETTERS.take(count)
end
|
.evaluate(ast:, env:) ⇒ Object
40
41
42
|
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 40
def evaluate(ast:, env:)
Evaluator.new(env).evaluate(ast)
end
|
.max_vars ⇒ Object
15
16
17
|
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 15
def max_vars
LETTERS.length
end
|
.parse(expression:, paths:) ⇒ Object
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 29
def parse(expression:, paths:)
normalized_paths = normalize_paths(paths)
ensure_within_var_limit(normalized_paths)
tokens = tokenize(expression.to_s)
parser = Parser.new(tokens, allowed_vars(normalized_paths.length))
ast = parser.parse
raise ArgumentError, 'Unexpected token sequence.' unless parser.done?
ast
end
|
.validate(paths:, expression:) ⇒ Object
23
24
25
26
27
|
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 23
def validate(paths:, expression:)
normalized_paths = normalize_paths(paths)
parse(expression: expression, paths: normalized_paths)
true
end
|