parent
f551da3dd7
commit
506d3a444c
@ -0,0 +1,8 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
||||||
|
|
||||||
|
gem "minitest"
|
||||||
|
gem "pry"
|
@ -0,0 +1,19 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
coderay (1.1.3)
|
||||||
|
method_source (1.0.0)
|
||||||
|
minitest (5.16.2)
|
||||||
|
pry (0.14.1)
|
||||||
|
coderay (~> 1.1)
|
||||||
|
method_source (~> 1.0)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
arm64-darwin-21
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
minitest
|
||||||
|
pry
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.3.18
|
@ -0,0 +1,6 @@
|
|||||||
|
require "minitest/test_task"
|
||||||
|
|
||||||
|
Minitest::TestTask.create do |t|
|
||||||
|
t.test_globs = "./test_*.rb"
|
||||||
|
end
|
||||||
|
task default: :test
|
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env ruby -w
|
||||||
|
|
||||||
|
module Lox
|
||||||
|
class << self
|
||||||
|
@had_error = false
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.run_prompt
|
||||||
|
loop do
|
||||||
|
print "> "
|
||||||
|
line = gets
|
||||||
|
break if line.empty?
|
||||||
|
run(line)
|
||||||
|
@had_error = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.run_file(io)
|
||||||
|
run(io.read)
|
||||||
|
|
||||||
|
exit 65 if @had_error
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.run(src)
|
||||||
|
scanner = Scanner.new(src)
|
||||||
|
tokens = scanner.scan()
|
||||||
|
|
||||||
|
tokens.each do |token|
|
||||||
|
puts token
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.error(line, msg)
|
||||||
|
report(line, "", msg)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.report(line, where, message)
|
||||||
|
puts "[line #{line}] Error#{where}: #{message}"
|
||||||
|
@had_error = true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if __FILE__ == $0
|
||||||
|
puts "Usage: #$0 [script]" or exit 64 if ARGV.length > 1
|
||||||
|
|
||||||
|
if ARGV.empty?
|
||||||
|
Lox.run_prompt
|
||||||
|
else
|
||||||
|
Lox.run_file(ARGF)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,14 @@
|
|||||||
|
require "minitest/autorun"
|
||||||
|
|
||||||
|
require "lox"
|
||||||
|
|
||||||
|
require "open3"
|
||||||
|
require "pry"
|
||||||
|
|
||||||
|
class TestLox < Minitest::Test
|
||||||
|
def test_error_on_more_than_one_arg
|
||||||
|
o, s = Open3.capture2("./lox.rb foo bar")
|
||||||
|
assert_equal 64, s.exitstatus
|
||||||
|
assert_equal "Usage: ./lox.rb [script]\n", o
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue