class BinaryParser::Expression::RPN

Attributes

tokens[R]

Public Class Methods

new(*tokens) click to toggle source
# File lib/binary_parser/general_class/expression.rb, line 209
def initialize(*tokens)
  check_tokens(tokens)
  @tokens = tokens
end

Public Instance Methods

+(other) click to toggle source
# File lib/binary_parser/general_class/expression.rb, line 218
def +(other)
  RPN.new(*(self.tokens + other.tokens))
end
check_tokens(tokens) click to toggle source
# File lib/binary_parser/general_class/expression.rb, line 214
def check_tokens(tokens)
  tokens.all?{|token| token.is_a?(Expression::Token)}
end
eval(&token_eval_proc) click to toggle source
# File lib/binary_parser/general_class/expression.rb, line 222
def eval(&token_eval_proc)
  stack = @tokens.inject([]) do |stack, token|
    if token.is_a?(Expression::Token::Operator)
      raise BadManipulationError, "Cannot calculate this RPN." if stack.length < 2
      stack + [token.operate(*[stack.pop, stack.pop].reverse)]
    elsif token.is_a?(Expression::Token::Immediate)
      stack + [token.value]
    elsif token.is_a?(Expression::Token::Variable)
      eval_value = token_eval_proc.call(token)
      unless eval_value.is_a?(Integer) || eval_value.is_a?(::BinaryParser::BuiltInTemplate::UInt)
        raise BadManipulationError, "Evaluation is faild. #{eval_value} is not Integer (or UInt) (#{eval_value.class})."
      end
      stack + [eval_value]
    end
  end
  raise BadManipulationError, "Cannot calculate this RPN." if stack.length != 1
  return stack.last
end