Class: Trifle::Stats::Transponder::ExpressionEngine

Inherits:
Object
  • Object
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_varsObject



15
16
17
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 15

def max_vars
  LETTERS.length
end

.parse(expression:, paths:) ⇒ Object

Raises:

  • (ArgumentError)


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