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