class ExpressionParser::Lexer

Public Class Methods

new(input) click to toggle source
# File lib/expression_parser/lexer.rb, line 6
def initialize(input)
  @input = input
  @return_previous_token = false
end

Public Instance Methods

get_next_token() click to toggle source
# File lib/expression_parser/lexer.rb, line 11
def get_next_token
  if @return_previous_token
    @return_previous_token = false
    return @previous_token
  end

  token = Token.new

  @input.lstrip!

  case @input
  when /\A\+/ then
    token.kind = Token::Plus
  when /\A-/ then
    token.kind = Token::Minus
  when /\A\*/ then
    token.kind = Token::Multiply
  when /\Adiv/ then
    token.kind = Token::Divide
  when /\A\// then
    token.kind = Token::Divide
  when /\A\d+(\.\d+)?/
    token.kind = Token::Number
    token.value = $&.to_f
  when /\A\(/
    token.kind = Token::LParen
  when /\A\)/
    token.kind = Token::RParen
  when ''
    token.kind = Token::End
  when /\Ae/
    token.kind = Token::Number
    token.value = 2.718281828459
  when /\Api/
    token.kind = Token::Number
    token.value = 3.1415926535898
  when /\Amod/
    token.kind = Token::MOD
  when /\A!=/
    token.kind = Token::NotEqual
  when /\A<>/
    token.kind = Token::NotEqual
  when /\A>=/
    token.kind = Token::GThanE
  when /\A>/
    token.kind = Token::GThan
  when /\A<=/
    token.kind = Token::LThanE
  when /\A</
    token.kind = Token::LThan
  when /\A=/
    token.kind = Token::Equal
  end

  raise "Unknown token #{@input}" if token.unknown?
  @input = $'

  @previous_token = token
  token
end
revert() click to toggle source
# File lib/expression_parser/lexer.rb, line 72
def revert
  @return_previous_token = true
end