view share/delvs-master/delvs.rb @ 12518:2d8fe55c6e65 draft default tip

<int-e> learn The password of the month is release incident pilot.
author HackEso <hackeso@esolangs.org>
date Sun, 03 Nov 2024 00:31:02 +0000
parents 38a5b4d8a98e
children
line wrap: on
line source

#!/usr/bin/env ruby
# NOTE: this proram was just made for the lulz, PLEASE DO NOT USE THIS
# Please use the actually semi-well written delvs interpreter writtin in C, because this isn't even close to the actual delvs interpreter
require 'io/console'

class RuntimeData
  attr_accessor :c
  attr_accessor :v
  attr_accessor :i
  attr_accessor :f
  attr_accessor :p

  def initialize
    @c = ""
    @i = 0
    @v = Array.new 30000, 0
    @p = 15000
    @f = ""
  end
end

def dummy_lexer d
  while d.i <= d.c.length do
    return d.i if d.c[d.i] == ']'
    d.i += 1
  end
end

def lexer d
  while d.i <= d.c.length do
    case d.c[d.i]
      when '>' then
        d.p += 1

      when '<' then
        d.p -= 1

      when '+' then
        d.v[d.p] += 1

      when '-' then
        d.v[d.p] -= 1

      when '.' then
        print d.v[d.p].chr

      when ',' then
        d.v[d.p] = IO.console.getch.ord

      when '[' then
        r = d.i + 1
        d.i = dlexer d if !d.v[d.p]
        while d.v[d.p] != 0 do
          d.i = r
          d = lexer d
        end

      when ']' then
        return d
      
      else
        # Everything else is comments
    end
    d.i += 1
  end
end

# example usage:
# data = RuntimeData.new
# data.c = "+++++ +++++ [ > +++++ +++++ > + << - ] > ++++ . + . > ."
# lexer data