class Lexer

Public Class Methods

new(text) click to toggle source
# File lib/simpler_lexer/lexer.rb, line 4
def initialize(text)
  @text = text
  @pos = Position.new(-1, 0, -1, text)
  @current_char = nil
  advance
end

Public Instance Methods

advance() click to toggle source
# File lib/simpler_lexer/lexer.rb, line 11
def advance
  @pos.advance(@current_char)
  @current_char = (@text[@pos.idx] if @pos.idx < @text.length)
end
make_number() click to toggle source
# File lib/simpler_lexer/lexer.rb, line 53
def make_number
  num_str = ""
  dot_count = 0

  while !@current_char.nil? && ("#{DIGITS}.").include?(@current_char)
    if @current_char == "."
      break if dot_count == 1

      dot_count += 1
      num_str += "."
    else
      num_str += @current_char
    end
    advance
  end

  if dot_count.zero?
    Token.new(TT_INT, num_str.to_i)
  else
    Token.new(TT_FLOAT, num_str.to_f)
  end
end
make_tokens() click to toggle source
# File lib/simpler_lexer/lexer.rb, line 16
def make_tokens
  tokens = []

  until @current_char.nil?
    if ' \t'.include? @current_char
      advance
    elsif DIGITS.include? @current_char
      tokens.append(make_number)
    elsif @current_char == "+"
      tokens.append(Token.new(TT_PLUS))
      advance
    elsif @current_char == "-"
      tokens.append(Token.new(TT_MINUS))
      advance
    elsif @current_char == "*"
      tokens.append(Token.new(TT_MUL))
      advance
    elsif @current_char == "/"
      tokens.append(Token.new(TT_DIV))
      advance
    elsif @current_char == "("
      tokens.append(Token.new(TT_LPAREN))
      advance
    elsif @current_char == ")"
      tokens.append(Token.new(TT_RPAREN))
      advance
    else
      pos_start = @pos.copy
      char = @current_char
      advance
      return IllegalCharError.new(pos_start, @pos, "'#{char}'")
    end
  end

  tokens
end