brainfuck 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ module Brainfuck
4
+ class ParserTest < MiniTest::Unit::TestCase
5
+
6
+ %w{fwd bwd inc dec puts gets iteration exp}.each do |rule|
7
+ define_method "test_implements_a_#{rule}_rule" do
8
+ rules = Parser.rules.map(&:first).map do |pattern|
9
+ pattern.instance_variable_get(:@pattern)
10
+ end.map(&:keys).flatten
11
+ assert_includes rules, rule.to_sym
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems' if RUBY_VERSION == '1.8.7'
2
+
3
+ require 'bundler/setup'
4
+
5
+ gem 'minitest'
6
+ require 'minitest/unit'
7
+ require 'minitest/autorun'
8
+ require 'mocha'
9
+
10
+ require 'brainfuck'
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brainfuck
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 23
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
- - 1
8
8
  - 2
9
- version: 0.1.2
9
+ - 0
10
+ version: 0.2.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Josep M. Bach
@@ -14,75 +15,52 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-02-02 00:00:00 +01:00
18
+ date: 2011-05-16 00:00:00 +02:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- name: highline
22
+ name: parslet
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
24
25
  none: false
25
26
  requirements:
26
27
  - - ">="
27
28
  - !ruby/object:Gem::Version
29
+ hash: 3
28
30
  segments:
29
31
  - 0
30
32
  version: "0"
31
33
  type: :runtime
32
34
  version_requirements: *id001
33
35
  - !ruby/object:Gem::Dependency
34
- name: parslet
36
+ name: minitest
35
37
  prerelease: false
36
38
  requirement: &id002 !ruby/object:Gem::Requirement
37
39
  none: false
38
40
  requirements:
39
41
  - - ">="
40
42
  - !ruby/object:Gem::Version
43
+ hash: 3
41
44
  segments:
42
45
  - 0
43
46
  version: "0"
44
- type: :runtime
47
+ type: :development
45
48
  version_requirements: *id002
46
49
  - !ruby/object:Gem::Dependency
47
- name: rspec
50
+ name: mocha
48
51
  prerelease: false
49
52
  requirement: &id003 !ruby/object:Gem::Requirement
50
53
  none: false
51
54
  requirements:
52
55
  - - ">="
53
56
  - !ruby/object:Gem::Version
57
+ hash: 3
54
58
  segments:
55
59
  - 0
56
60
  version: "0"
57
61
  type: :development
58
62
  version_requirements: *id003
59
- - !ruby/object:Gem::Dependency
60
- name: bundler
61
- prerelease: false
62
- requirement: &id004 !ruby/object:Gem::Requirement
63
- none: false
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- segments:
68
- - 0
69
- version: "0"
70
- type: :development
71
- version_requirements: *id004
72
- - !ruby/object:Gem::Dependency
73
- name: simplecov
74
- prerelease: false
75
- requirement: &id005 !ruby/object:Gem::Requirement
76
- none: false
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- segments:
81
- - 0
82
- version: "0"
83
- type: :development
84
- version_requirements: *id005
85
- description: Another Brainfuck interpreter in Ruby
63
+ description: An implementation of Brainfuck on the Rubinius VM.
86
64
  email:
87
65
  - josep.m.bach@gmail.com
88
66
  executables:
@@ -104,17 +82,18 @@ files:
104
82
  - examples/hello_world.bf
105
83
  - lib/brainfuck.rb
106
84
  - lib/brainfuck/ast.rb
107
- - lib/brainfuck/interpreter.rb
85
+ - lib/brainfuck/code_loader.rb
86
+ - lib/brainfuck/compiler.rb
87
+ - lib/brainfuck/lexer.rb
88
+ - lib/brainfuck/main.rb
108
89
  - lib/brainfuck/parser.rb
109
- - lib/brainfuck/stack.rb
90
+ - lib/brainfuck/stages.rb
110
91
  - lib/brainfuck/version.rb
111
- - spec/acceptance/acceptance_spec.rb
112
- - spec/brainfuck/ast_spec.rb
113
- - spec/brainfuck/interpreter_spec.rb
114
- - spec/brainfuck/parser_spec.rb
115
- - spec/brainfuck/stack_spec.rb
116
- - spec/brainfuck_spec.rb
117
- - spec/spec_helper.rb
92
+ - test/acceptance/acceptance_test.rb
93
+ - test/brainfuck/ast_test.rb
94
+ - test/brainfuck/lexer_test.rb
95
+ - test/brainfuck/parser_test.rb
96
+ - test/test_helper.rb
118
97
  has_rdoc: true
119
98
  homepage: http://github.com/txus/brainfuck
120
99
  licenses: []
@@ -129,6 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
129
108
  requirements:
130
109
  - - ">="
131
110
  - !ruby/object:Gem::Version
111
+ hash: 3
132
112
  segments:
133
113
  - 0
134
114
  version: "0"
@@ -137,21 +117,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
117
  requirements:
138
118
  - - ">="
139
119
  - !ruby/object:Gem::Version
120
+ hash: 3
140
121
  segments:
141
122
  - 0
142
123
  version: "0"
143
124
  requirements: []
144
125
 
145
126
  rubyforge_project: brainfuck
146
- rubygems_version: 1.3.7
127
+ rubygems_version: 1.5.2
147
128
  signing_key:
148
129
  specification_version: 3
149
- summary: Another Brainfuck interpreter in Ruby
130
+ summary: An implementation of Brainfuck on the Rubinius VM.
150
131
  test_files:
151
- - spec/acceptance/acceptance_spec.rb
152
- - spec/brainfuck/ast_spec.rb
153
- - spec/brainfuck/interpreter_spec.rb
154
- - spec/brainfuck/parser_spec.rb
155
- - spec/brainfuck/stack_spec.rb
156
- - spec/brainfuck_spec.rb
157
- - spec/spec_helper.rb
132
+ - test/acceptance/acceptance_test.rb
133
+ - test/brainfuck/ast_test.rb
134
+ - test/brainfuck/lexer_test.rb
135
+ - test/brainfuck/parser_test.rb
136
+ - test/test_helper.rb
@@ -1,20 +0,0 @@
1
- module Brainfuck
2
- class Interpreter < Parslet::Transform
3
- def self.stack
4
- @@stack ||= Stack.new
5
- end
6
-
7
- rule(:fwd => simple(:fwd)) { AST::FwdNode.new(Interpreter.stack) }
8
- rule(:bwd => simple(:bwd)) { AST::BwdNode.new(Interpreter.stack) }
9
-
10
- rule(:inc => simple(:inc)) { AST::IncNode.new(Interpreter.stack) }
11
- rule(:dec => simple(:dec)) { AST::DecNode.new(Interpreter.stack) }
12
-
13
- rule(:puts => simple(:puts)) { AST::PutsNode.new(Interpreter.stack) }
14
- rule(:gets => simple(:gets)) { AST::GetsNode.new(Interpreter.stack) }
15
-
16
- rule(:iteration => subtree(:iteration)) { AST::IterationNode.new(Interpreter.stack, iteration) }
17
-
18
- rule(:exp => subtree(:exp)) { exp }
19
- end
20
- end
@@ -1,51 +0,0 @@
1
- module Brainfuck
2
- class Stack
3
- include HighLine::SystemExtensions
4
-
5
- attr_reader :current
6
- def initialize
7
- @pointer = 0
8
- @stack = [0]
9
- end
10
- def current
11
- @stack[@pointer]
12
- end
13
- def fwd
14
- @pointer += 1
15
- initialize_cell_if_nil
16
- end
17
- def bwd
18
- @pointer -= 1
19
- ensure_pointer_is_above_zero
20
- initialize_cell_if_nil
21
- end
22
- def inc
23
- @stack[@pointer] = (current + 1) % 255
24
- end
25
- def dec
26
- @stack[@pointer] = (current - 1) % 255
27
- end
28
- def puts
29
- $stdout.print current.chr
30
- end
31
- def gets
32
- @stack[@pointer] = (get_character % 255) rescue 0
33
- end
34
-
35
- def to_a
36
- @stack
37
- end
38
-
39
- def clear
40
- initialize
41
- end
42
-
43
- private
44
- def initialize_cell_if_nil
45
- @stack[@pointer] ||= 0
46
- end
47
- def ensure_pointer_is_above_zero
48
- raise "Tried to access cell #{@pointer}." if @pointer < 0
49
- end
50
- end
51
- end
@@ -1,105 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Brainfuck
4
- describe "Acceptance specs" do
5
-
6
- subject { Brainfuck }
7
-
8
- describe "without loops nor user input" do
9
- let(:code) do
10
- <<-EOS
11
- ++++>++++---.<--.
12
- EOS
13
- end
14
- it "sets two cells to 2 and 1" do
15
- subject.run(code).should == [2,1]
16
- end
17
- it "prints 2 and 1" do
18
- $stdout.should_receive(:print).twice
19
- subject.run code
20
- end
21
- end
22
-
23
- describe "with user input" do
24
- let(:code) do
25
- <<-EOS
26
- ,++++
27
- EOS
28
- end
29
- it "sets the first cell to a + 4" do
30
- stack = Stack.new
31
- Interpreter.stub(:stack).and_return stack
32
-
33
- stack.should_receive(:get_character).once.and_return 97
34
-
35
- subject.run(code).should == [101]
36
- end
37
- end
38
-
39
- describe "with loops" do
40
- let(:code) do
41
- <<-EOS
42
- ++++[-]+-+
43
- EOS
44
- end
45
- it "runs the loop 4 times" do
46
- subject.run(code).should == [1]
47
- end
48
- end
49
-
50
- describe "cell hopping examples" do
51
-
52
- it "transfers the content from one cell to another" do
53
- subject.run("++++++++++ [>+<-]").should == [0,10]
54
- end
55
-
56
- it "transfers the content from one cell to the third" do
57
- subject.run("++++++++++ [>+<-]>[>+<-]").should == [0,0,10]
58
- end
59
-
60
- it "transfers the content from one cell to the third and back to the second" do
61
- subject.run("++++++++++ [>+<-]>[>+<-]>[<+>-]").should == [0,10,0]
62
- end
63
-
64
- end
65
-
66
- describe "nested loop examples" do
67
-
68
- it "work flawlessly" do
69
- subject.run("[++++++++++[-]+-+-]").should == [0]
70
- end
71
-
72
- end
73
-
74
- describe "hello world" do
75
-
76
- it "displays hello world" do
77
- subject.run <<-EOS
78
- +++++ +++++
79
- [
80
- > +++++ ++
81
- > +++++ +++++
82
- > +++
83
- > +
84
- <<<< -
85
- ]
86
- > ++ .
87
- > + .
88
- +++++ ++ .
89
- .
90
- +++ .
91
- > ++ .
92
- << +++++ +++++ +++++ .
93
- > .
94
- +++ .
95
- ----- - .
96
- ----- --- .
97
- > + .
98
- > .
99
- EOS
100
-
101
- end
102
- end
103
-
104
- end
105
- end
@@ -1,36 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Brainfuck
4
- describe AST do
5
- let(:stack) { double('stack') }
6
-
7
- %w{fwd bwd inc dec puts gets}.each do |node|
8
- describe "AST::#{node.capitalize}Node" do
9
- subject { eval("AST::#{node.capitalize}Node").new stack }
10
- describe "#eval" do
11
- it "calls stack##{node}" do
12
- subject.stack.should_receive(node)
13
- subject.eval
14
- end
15
- end
16
- end
17
- end
18
-
19
- describe AST::IterationNode do
20
- let(:nodes) do
21
- [ double('node'), double('node2') ]
22
- end
23
- subject { AST::IterationNode.new stack, nodes }
24
- describe "#eval" do
25
- it 'evaluates the expression until the stack cell is 0' do
26
- subject.stack.stub(:current).and_return 3, 2, 1, 0
27
- nodes.each do |node|
28
- node.should_receive(:eval).exactly(3).times
29
- end
30
- subject.eval
31
- end
32
- end
33
- end
34
-
35
- end
36
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Brainfuck
4
- describe Interpreter do
5
-
6
- describe ".stack" do
7
- it 'returns a new or cached Stack' do
8
- stack = Interpreter.stack
9
- stack.should be_kind_of(Stack)
10
- Interpreter.stack.should === stack
11
- end
12
- end
13
-
14
- describe "rules" do
15
- %w{fwd bwd inc dec puts gets iteration exp}.each do |rule|
16
- it "implements a rule for :#{rule} node" do
17
- subject.rules.map(&:first).map do |pattern|
18
- pattern.instance_variable_get(:@pattern)
19
- end.map(&:keys).flatten.should include(:"#{rule}")
20
- end
21
- end
22
- end
23
-
24
- end
25
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Brainfuck
4
- describe Parser do
5
-
6
- describe "INSTRUCTIONS constant" do
7
- it 'returns valid symbols' do
8
- Parser::INSTRUCTIONS.should == %w{> < + - [ ] . ,}
9
- end
10
- end
11
-
12
- describe ".clean" do
13
- it 'cleans all non-valid symbols from a string' do
14
- Parser.clean(">3< 223+fn - ()()[r23-] .bdn*& ,").should == '><+-[-].,'
15
- end
16
- end
17
-
18
- describe "rules" do
19
- %w{lparen rparen space space? fwd bwd inc dec puts gets iteration expression}.each do |rule|
20
- it "implements a rule for :#{rule} node" do
21
- subject.should respond_to(:"#{rule}")
22
- end
23
- end
24
- end
25
-
26
- end
27
- end