Sha256: 7a75753cfcd591ad47dc87add65bca8f7e60f403eb8eb34611c91a68ce86e3c4

Contents?: true

Size: 758 Bytes

Versions: 2

Compression:

Stored size: 758 Bytes

Contents

require "strscan"

class Lexer
  TOKENS = [
    /\(|\)/,          # parens
    /'/,              # quote
    /"(\\"|[^"])*"/,  # string literal
    /[^\s)]+/,        # any non-whitespace character excluding )
  ]

  def self.tokenize(program)
    new(program).tokenize
  end

  def initialize(program)
    @scanner = StringScanner.new(sanitize(program))
  end

  def tokenize
    tokens = []
    while (token = read_token)
      tokens << token
    end
    tokens
  end

  private

  attr_reader :scanner

  def read_token
    scanner.skip(/\s+/)
    return if scanner.eos?

    TOKENS.each do |token|
      return scanner.scan(token) if scanner.match?(token)
    end
  end

  def sanitize(string)
    # Remove comments
    string.gsub(/;.*$/, "")
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lasp-0.10.1 lib/lasp/lexer.rb
lasp-0.10.0 lib/lasp/lexer.rb