dslkit 0.2.6 → 0.2.7
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.
- data/.gitignore +3 -0
- data/CHANGES +2 -0
- data/Gemfile +5 -0
- data/{doc-main.txt → README.rdoc} +6 -6
- data/Rakefile +30 -91
- data/VERSION +1 -1
- data/dslkit.gemspec +32 -15
- data/examples/add_one.pdf +0 -0
- data/examples/add_one.stm +13 -0
- data/examples/bb3.pdf +0 -0
- data/examples/bb3.stm +26 -0
- data/examples/bb3_19.stm +26 -0
- data/examples/concatenate_compare.mtm +31 -0
- data/examples/concatenate_compare.pdf +0 -0
- data/examples/concatenate_compare_19.mtm +31 -0
- data/examples/length_difference.mtm +17 -0
- data/examples/length_difference.pdf +0 -0
- data/examples/length_difference_19.mtm +17 -0
- data/examples/{mm.rb → minsky.rb} +3 -3
- data/examples/ones_difference-mtm.pdf +0 -0
- data/examples/ones_difference-stm.pdf +0 -0
- data/examples/ones_difference.mtm +12 -0
- data/examples/ones_difference.stm +25 -0
- data/examples/ones_difference_19.mtm +12 -0
- data/examples/ones_difference_19.stm +25 -0
- data/examples/prefix-equals-suffix-reversed-with-infix.pdf +0 -0
- data/examples/prefix-equals-suffix-reversed-with-infix.stm +38 -0
- data/examples/prefix-equals-suffix-reversed-with-infix_19.stm +38 -0
- data/examples/turing-graph.rb +17 -0
- data/examples/turing.rb +310 -0
- data/lib/dslkit/polite.rb +3 -1
- data/lib/dslkit/version.rb +1 -1
- data/tests/test_polite.rb +200 -3
- metadata +97 -18
- data/install.rb +0 -17
- data/tests/runner.rb +0 -11
- data/tests/test_common.rb +0 -202
- data/tests/test_rude.rb +0 -84
data/.gitignore
ADDED
data/CHANGES
CHANGED
data/Gemfile
ADDED
@@ -1,21 +1,21 @@
|
|
1
|
-
|
1
|
+
= DSLKit - Building Blocks for Domain Specific Languages (DSL)
|
2
2
|
|
3
|
-
|
3
|
+
== Description
|
4
4
|
|
5
5
|
This library contains recurring patterns, that are useful in the creation of
|
6
6
|
internal Domain Specific Languages (DSL) in Ruby.
|
7
7
|
|
8
|
-
|
8
|
+
== Author
|
9
9
|
|
10
10
|
Florian Frank <mailto:flori@ping.de>
|
11
11
|
|
12
|
-
|
12
|
+
== License
|
13
13
|
|
14
14
|
This is free software; you can redistribute it and/or modify it under the
|
15
15
|
terms of the GNU General Public License Version 2 as published by the Free
|
16
16
|
Software Foundation: www.gnu.org/copyleft/gpl.html
|
17
17
|
|
18
|
-
|
18
|
+
== Download
|
19
19
|
|
20
20
|
The latest version of this library can be downloaded at
|
21
21
|
|
@@ -25,7 +25,7 @@ Online Documentation should be located at
|
|
25
25
|
|
26
26
|
* http://dslkit.rubyforge.org
|
27
27
|
|
28
|
-
|
28
|
+
== Examples
|
29
29
|
|
30
30
|
Some nice examples on how to use dslkit are located in the examples/
|
31
31
|
subdirectory of this library.
|
data/Rakefile
CHANGED
@@ -1,94 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
system 'rcov -Ilib tests/test_rude.rb'
|
32
|
-
end
|
33
|
-
|
34
|
-
if defined? Gem
|
35
|
-
spec_src =<<GEM
|
36
|
-
# -*- encoding: utf-8 -*-
|
37
|
-
Gem::Specification.new do |s|
|
38
|
-
s.name = '#{PKG_NAME}'
|
39
|
-
s.version = '#{PKG_VERSION}'
|
40
|
-
s.summary = 'Kit for building DSLs in Ruby'
|
41
|
-
s.description = 'This library contains recurring patterns, that are useful in the creation of internal Domain Specific Languages (DSL) in Ruby.'
|
42
|
-
|
43
|
-
s.files = #{PKG_FILES.to_a.sort.inspect}
|
44
|
-
|
45
|
-
s.require_path = 'lib'
|
46
|
-
|
47
|
-
s.has_rdoc = true
|
48
|
-
s.rdoc_options << '--main' << 'doc-main.txt'
|
49
|
-
s.extra_rdoc_files << 'doc-main.txt'
|
50
|
-
s.test_files << 'tests/runner.rb'
|
51
|
-
|
52
|
-
s.author = "Florian Frank"
|
53
|
-
s.email = "flori@ping.de"
|
54
|
-
s.homepage = "http://#{PKG_NAME}.rubyforge.org"
|
55
|
-
s.rubyforge_project = "#{PKG_NAME}"
|
56
|
-
end
|
57
|
-
GEM
|
58
|
-
|
59
|
-
desc 'Create a gemspec file'
|
60
|
-
task :gemspec do
|
61
|
-
File.open("#{PKG_NAME}.gemspec", 'w') do |f|
|
62
|
-
f.puts spec_src
|
1
|
+
# vim: set filetype=ruby et sw=2 ts=2:
|
2
|
+
|
3
|
+
require 'gem_hadar'
|
4
|
+
|
5
|
+
GemHadar do
|
6
|
+
name 'dslkit'
|
7
|
+
path_module 'DSLKit'
|
8
|
+
author 'Florian Frank'
|
9
|
+
email 'flori@ping.de'
|
10
|
+
homepage "http://flori.github.com/#{name}"
|
11
|
+
summary 'Kit for building DSLs in Ruby'
|
12
|
+
description 'This library contains recurring patterns, that are useful in the creation of internal Domain Specific Languages (DSL) in Ruby.'
|
13
|
+
test_dir 'tests'
|
14
|
+
ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock'
|
15
|
+
readme 'README.rdoc'
|
16
|
+
|
17
|
+
dependency 'term-ansicolor', '~>1.0'
|
18
|
+
dependency 'spruz', '~>0.2'
|
19
|
+
|
20
|
+
install_library do
|
21
|
+
libdir = CONFIG["sitelibdir"]
|
22
|
+
cd 'lib' do
|
23
|
+
dst = File.join(libdir, 'dslkit')
|
24
|
+
mkdir_p dst
|
25
|
+
cd 'dslkit' do
|
26
|
+
for file in Dir['*.rb']
|
27
|
+
install file, File.join(dst, file)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
install 'dslkit.rb', libdir
|
63
31
|
end
|
64
32
|
end
|
65
|
-
|
66
|
-
spec = eval(spec_src)
|
67
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
68
|
-
pkg.need_tar = true
|
69
|
-
pkg.package_files += PKG_FILES
|
70
|
-
end
|
71
33
|
end
|
72
|
-
|
73
|
-
desc m = "Writing version information for #{PKG_VERSION}"
|
74
|
-
task :version do
|
75
|
-
puts m
|
76
|
-
File.open(File.join('lib', 'dslkit', 'version.rb'), 'w') do |v|
|
77
|
-
v.puts <<EOT
|
78
|
-
module DSLKit
|
79
|
-
# DSLKit version
|
80
|
-
VERSION = '#{PKG_VERSION}'
|
81
|
-
VERSION_ARRAY = VERSION.split(/\\./).map { |x| x.to_i } # :nodoc:
|
82
|
-
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
|
83
|
-
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
|
84
|
-
VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
|
85
|
-
end
|
86
|
-
EOT
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
desc "Default"
|
91
|
-
task :default => [ :version, :gemspec, :test ]
|
92
|
-
|
93
|
-
desc "Prepare a release"
|
94
|
-
task :release => [ :clean, :version, :gemspec, :package ]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.7
|
data/dslkit.gemspec
CHANGED
@@ -1,21 +1,38 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
Gem::Specification.new do |s|
|
3
|
-
s.name = 'dslkit'
|
4
|
-
s.version = '0.2.6'
|
5
|
-
s.summary = 'Kit for building DSLs in Ruby'
|
6
|
-
s.description = 'This library contains recurring patterns, that are useful in the creation of internal Domain Specific Languages (DSL) in Ruby.'
|
7
2
|
|
8
|
-
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{dslkit}
|
5
|
+
s.version = "0.2.7"
|
9
6
|
|
10
|
-
s.
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Florian Frank"]
|
9
|
+
s.date = %q{2011-07-16}
|
10
|
+
s.description = %q{This library contains recurring patterns, that are useful in the creation of internal Domain Specific Languages (DSL) in Ruby.}
|
11
|
+
s.email = %q{flori@ping.de}
|
12
|
+
s.extra_rdoc_files = ["README.rdoc"]
|
13
|
+
s.files = [".gitignore", "CHANGES", "COPYING", "Gemfile", "README.rdoc", "Rakefile", "TODO", "VERSION", "dslkit.gemspec", "examples/add_one.pdf", "examples/add_one.stm", "examples/bb3.pdf", "examples/bb3.stm", "examples/bb3_19.stm", "examples/concatenate_compare.mtm", "examples/concatenate_compare.pdf", "examples/concatenate_compare_19.mtm", "examples/length_difference.mtm", "examples/length_difference.pdf", "examples/length_difference_19.mtm", "examples/let.rb", "examples/mail.rb", "examples/minsky.rb", "examples/multiply.reg", "examples/null_pattern.rb", "examples/ones_difference-mtm.pdf", "examples/ones_difference-stm.pdf", "examples/ones_difference.mtm", "examples/ones_difference.stm", "examples/ones_difference_19.mtm", "examples/ones_difference_19.stm", "examples/prefix-equals-suffix-reversed-with-infix.pdf", "examples/prefix-equals-suffix-reversed-with-infix.stm", "examples/prefix-equals-suffix-reversed-with-infix_19.stm", "examples/recipe.rb", "examples/recipe2.rb", "examples/recipe_common.rb", "examples/subtract.reg", "examples/turing-graph.rb", "examples/turing.rb", "lib/dslkit.rb", "lib/dslkit/polite.rb", "lib/dslkit/rude.rb", "lib/dslkit/version.rb", "tests/test_polite.rb"]
|
14
|
+
s.homepage = %q{http://flori.github.com/dslkit}
|
15
|
+
s.rdoc_options = ["--title", "Dslkit - Kit for building DSLs in Ruby", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubygems_version = %q{1.6.2}
|
18
|
+
s.summary = %q{Kit for building DSLs in Ruby}
|
19
|
+
s.test_files = ["tests/test_polite.rb"]
|
11
20
|
|
12
|
-
s.
|
13
|
-
|
14
|
-
s.extra_rdoc_files << 'doc-main.txt'
|
15
|
-
s.test_files << 'tests/runner.rb'
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
s.specification_version = 3
|
16
23
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
24
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
25
|
+
s.add_development_dependency(%q<gem_hadar>, ["~> 0.0.2"])
|
26
|
+
s.add_runtime_dependency(%q<term-ansicolor>, ["~> 1.0"])
|
27
|
+
s.add_runtime_dependency(%q<spruz>, ["~> 0.2"])
|
28
|
+
else
|
29
|
+
s.add_dependency(%q<gem_hadar>, ["~> 0.0.2"])
|
30
|
+
s.add_dependency(%q<term-ansicolor>, ["~> 1.0"])
|
31
|
+
s.add_dependency(%q<spruz>, ["~> 0.2"])
|
32
|
+
end
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<gem_hadar>, ["~> 0.0.2"])
|
35
|
+
s.add_dependency(%q<term-ansicolor>, ["~> 1.0"])
|
36
|
+
s.add_dependency(%q<spruz>, ["~> 0.2"])
|
37
|
+
end
|
21
38
|
end
|
Binary file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with a binary number on the tape:
|
3
|
+
# $ turing.rb add_one.stm 1111010101
|
4
|
+
|
5
|
+
0. right :goto => 1
|
6
|
+
1. cond :if => 'B', :then => 2, :else => 0
|
7
|
+
2. left :goto => 3
|
8
|
+
3. cond :if => '1', :then => 4, :else => 5
|
9
|
+
4. write :symbol => '0', :goto => 2
|
10
|
+
5. write :symbol => '1', :goto => 6
|
11
|
+
6. right :goto => 7
|
12
|
+
7. cond :if => 'B', :then => 8, :else => 6
|
13
|
+
8. halt
|
data/examples/bb3.pdf
ADDED
Binary file
|
data/examples/bb3.stm
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with an empty tape
|
3
|
+
# $ turing.rb bb3.stm ''
|
4
|
+
|
5
|
+
# Busy Beaver: 3-state, 2-symbol
|
6
|
+
|
7
|
+
# state A
|
8
|
+
1. cond :if => 'B', :then => 2, :else => 4
|
9
|
+
2. write :symbol => '1', :goto => 3
|
10
|
+
3. right :goto => 6
|
11
|
+
4. write :symbol => '1', :goto => 5
|
12
|
+
5. right :goto => 16
|
13
|
+
# state B
|
14
|
+
6. cond :if => 'B', :then => 7, :else => 9
|
15
|
+
7. write :symbol => 'B', :goto => 8
|
16
|
+
8. right :goto => 11
|
17
|
+
9. write :symbol => '1', :goto => 10
|
18
|
+
10. right :goto => 6
|
19
|
+
# state C
|
20
|
+
11. cond :if => 'B', :then => 12, :else => 14
|
21
|
+
12. write :symbol => '1', :goto => 13
|
22
|
+
13. left :goto => 11
|
23
|
+
14. write :symbol => '1', :goto => 15
|
24
|
+
15. left :goto => 1
|
25
|
+
# halt
|
26
|
+
16. halt
|
data/examples/bb3_19.stm
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with an empty tape
|
3
|
+
# $ turing.rb bb3.stm ''
|
4
|
+
|
5
|
+
# Busy Beaver: 3-state, 2-symbol
|
6
|
+
|
7
|
+
# state A
|
8
|
+
1. cond if: 'B', then: 2, else: 4
|
9
|
+
2. write symbol: '1', goto: 3
|
10
|
+
3. right goto: 6
|
11
|
+
4. write symbol: '1', goto: 5
|
12
|
+
5. right goto: 16
|
13
|
+
# state B
|
14
|
+
6. cond if: 'B', then: 7, else: 9
|
15
|
+
7. write symbol: 'B', goto: 8
|
16
|
+
8. right goto: 11
|
17
|
+
9. write symbol: '1', goto: 10
|
18
|
+
10. right goto: 6
|
19
|
+
# state C
|
20
|
+
11. cond if: 'B', then: 12, else: 14
|
21
|
+
12. write symbol: '1', goto: 13
|
22
|
+
13. left goto: 11
|
23
|
+
14. write symbol: '1', goto: 15
|
24
|
+
15. left goto: 1
|
25
|
+
# halt
|
26
|
+
16. halt
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with four binary numbers on the tape:
|
3
|
+
# $ turing.rb concatenate_compare.mtm 110 1 11 01
|
4
|
+
|
5
|
+
1. right 1, :goto => 2
|
6
|
+
2. cond 1, :if => 'B', :then => 3, :else => 1
|
7
|
+
3. right 2, :goto => 4
|
8
|
+
4. cond 2, :if => '0', :then => 7, :else => 5
|
9
|
+
5. cond 2, :if => '1', :then => 6, :else => 9
|
10
|
+
6. write 1, :symbol => '1', :goto => 8
|
11
|
+
7. write 1, :symbol => '0', :goto => 8
|
12
|
+
8. right 1, :goto => 3
|
13
|
+
9. right 3, :goto => 10
|
14
|
+
10. cond 3, :if => 'B', :then => 11, :else => 9
|
15
|
+
11. right 4, :goto => 12
|
16
|
+
12. cond 4, :if => '0', :then => 14, :else => 13
|
17
|
+
13. cond 4, :if => '1', :then => 15, :else => 17
|
18
|
+
14. write 3, :symbol => '0', :goto => 16
|
19
|
+
15. write 3, :symbol => '1', :goto => 16
|
20
|
+
16. right 3, :goto => 11
|
21
|
+
17. left 3, :goto => 18
|
22
|
+
18. left 1, :goto => 19
|
23
|
+
19. cond 3, :if => '0', :then => 20, :else => 22
|
24
|
+
20. cond 1, :if => '0', :then => 17, :else => 24
|
25
|
+
21. cond 1, :if => '1', :then => 17, :else => 24
|
26
|
+
22. cond 3, :if => '1', :then => 21, :else => 23
|
27
|
+
23. cond 1, :if => 'B', :then => 25, :else => 24
|
28
|
+
24. write 0, :symbol => '0', :goto => 26
|
29
|
+
25. write 0, :symbol => '1', :goto => 26
|
30
|
+
26. right 0, :goto => 27
|
31
|
+
27. halt
|
Binary file
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with four binary numbers on the tape:
|
3
|
+
# $ turing.rb concatenate_compare.mtm 110 1 11 01
|
4
|
+
|
5
|
+
1. right 1, goto: 2
|
6
|
+
2. cond 1, if: 'B', then: 3, else: 1
|
7
|
+
3. right 2, goto: 4
|
8
|
+
4. cond 2, if: '0', then: 7, else: 5
|
9
|
+
5. cond 2, if: '1', then: 6, else: 9
|
10
|
+
6. write 1, symbol: '1', goto: 8
|
11
|
+
7. write 1, symbol: '0', goto: 8
|
12
|
+
8. right 1, goto: 3
|
13
|
+
9. right 3, goto: 10
|
14
|
+
10. cond 3, if: 'B', then: 11, else: 9
|
15
|
+
11. right 4, goto: 12
|
16
|
+
12. cond 4, if: '0', then: 14, else: 13
|
17
|
+
13. cond 4, if: '1', then: 15, else: 17
|
18
|
+
14. write 3, symbol: '0', goto: 16
|
19
|
+
15. write 3, symbol: '1', goto: 16
|
20
|
+
16. right 3, goto: 11
|
21
|
+
17. left 3, goto: 18
|
22
|
+
18. left 1, goto: 19
|
23
|
+
19. cond 3, if: '0', then: 20, else: 22
|
24
|
+
20. cond 1, if: '0', then: 17, else: 24
|
25
|
+
21. cond 1, if: '1', then: 17, else: 24
|
26
|
+
22. cond 3, if: '1', then: 21, else: 23
|
27
|
+
23. cond 1, if: 'B', then: 25, else: 24
|
28
|
+
24. write 0, symbol: '0', goto: 26
|
29
|
+
25. write 0, symbol: '1', goto: 26
|
30
|
+
26. right 0, goto: 27
|
31
|
+
27. halt
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with two [ab]* strings on the tapes:
|
3
|
+
# $ turing.rb prefix-equals-suffix-reversed-with-infix.stm ab ababab
|
4
|
+
|
5
|
+
1. right 1, :goto => 2
|
6
|
+
2. right 2, :goto => 3
|
7
|
+
3. cond 1, :if => 'B', :then => 5, :else => 4
|
8
|
+
4. cond 2, :if => 'B', :then => 9, :else => 1
|
9
|
+
5. cond 2, :if => 'B', :then => 13, :else => 6
|
10
|
+
6. write 0, :symbol => 'b', :goto => 7
|
11
|
+
7. right 0, :goto => 8
|
12
|
+
8. right 2, :goto => 5
|
13
|
+
9. write 0, :symbol => 'a', :goto => 10
|
14
|
+
10. right 0, :goto => 11
|
15
|
+
11. right 1, :goto => 12
|
16
|
+
12. cond 1, :if => 'B', :then => 13, :else => 9
|
17
|
+
13. halt
|
Binary file
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with two [ab]* strings on the tapes:
|
3
|
+
# $ turing.rb prefix-equals-suffix-reversed-with-infix.stm ab ababab
|
4
|
+
|
5
|
+
1. right 1, goto: 2
|
6
|
+
2. right 2, goto: 3
|
7
|
+
3. cond 1, if: 'B', then: 5, else: 4
|
8
|
+
4. cond 2, if: 'B', then: 9, else: 1
|
9
|
+
5. cond 2, if: 'B', then: 13, else: 6
|
10
|
+
6. write 0, symbol: 'b', goto: 7
|
11
|
+
7. right 0, goto: 8
|
12
|
+
8. right 2, goto: 5
|
13
|
+
9. write 0, symbol: 'a', goto: 10
|
14
|
+
10. right 0, goto: 11
|
15
|
+
11. right 1, goto: 12
|
16
|
+
12. cond 1, if: 'B', then: 13, else: 9
|
17
|
+
13. halt
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'dslkit/polite'
|
4
4
|
|
5
5
|
# A small Minsky (register) machine
|
6
|
-
module
|
6
|
+
module Minsky
|
7
7
|
class InterpreterError < StandardError; end
|
8
8
|
|
9
9
|
class ::Proc
|
@@ -136,9 +136,9 @@ end
|
|
136
136
|
|
137
137
|
if $0 == __FILE__
|
138
138
|
if ARGV.empty?
|
139
|
-
|
139
|
+
Minsky::Interpreter.new(STDIN.read).run
|
140
140
|
else
|
141
|
-
interpreter =
|
141
|
+
interpreter = Minsky::Interpreter.new(File.read(ARGV.shift))
|
142
142
|
interpreter.stepping = !ARGV.empty?
|
143
143
|
interpreter.run
|
144
144
|
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with two strings of ones on the tape:
|
3
|
+
# $ turing.rb ones_difference.mtm 1111 11
|
4
|
+
|
5
|
+
0. right 1, :goto => 1
|
6
|
+
1. right 2, :goto => 2
|
7
|
+
2. cond 1, :if => '1', :then => 3, :else => 4
|
8
|
+
3. cond 2, :if => '1', :then => 0, :else => 5
|
9
|
+
4. cond 2, :if => '1', :then => 5, :else => 7
|
10
|
+
5. write 0, :symbol => '1', :goto => 6
|
11
|
+
6. left 0, :goto => 0
|
12
|
+
7. halt
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with two strings of ones on the tape:
|
3
|
+
# $ turing.rb ones_difference.stm 1111 11
|
4
|
+
|
5
|
+
1. right :goto => 2
|
6
|
+
2. cond :if => '1', :then => 1, :else => 3
|
7
|
+
3. right :goto => 4
|
8
|
+
4. cond :if => '1', :then => 5, :else => 17
|
9
|
+
5. right :goto => 6
|
10
|
+
6. cond :if => '1', :then => 5, :else => 7
|
11
|
+
7. left :goto => 8
|
12
|
+
8. write :symbol => 'B', :goto => 9
|
13
|
+
9. left :goto => 10
|
14
|
+
10. cond :if => '1', :then => 9, :else => 11
|
15
|
+
11. left :goto => 12
|
16
|
+
12. cond :if => '1', :then => 11, :else => 13
|
17
|
+
13. right :goto => 14
|
18
|
+
14. cond :if => '1', :then => 15, :else => 16
|
19
|
+
15. write :symbol => 'B', :goto => 1
|
20
|
+
16. write :symbol => '1', :goto => 18
|
21
|
+
17. left :goto => 20
|
22
|
+
18. right :goto => 19
|
23
|
+
19. cond :if => '1', :then => 18, :else => 21
|
24
|
+
20. halt
|
25
|
+
21. halt
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with two strings of ones on the tape:
|
3
|
+
# $ turing.rb ones_difference.mtm 1111 11
|
4
|
+
|
5
|
+
0. right 1, goto: 1
|
6
|
+
1. right 2, goto: 2
|
7
|
+
2. cond 1, if: '1', then: 3, else: 4
|
8
|
+
3. cond 2, if: '1', then: 0, else: 5
|
9
|
+
4. cond 2, if: '1', then: 5, else: 7
|
10
|
+
5. write 0, symbol: '1', goto: 6
|
11
|
+
6. left 0, goto: 0
|
12
|
+
7. halt
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with two strings of ones on the tape:
|
3
|
+
# $ turing.rb ones_difference.stm 1111 11
|
4
|
+
|
5
|
+
1. right goto: 2
|
6
|
+
2. cond if: '1', then: 1, else: 3
|
7
|
+
3. right goto: 4
|
8
|
+
4. cond if: '1', then: 5, else: 17
|
9
|
+
5. right goto: 6
|
10
|
+
6. cond if: '1', then: 5, else: 7
|
11
|
+
7. left goto: 8
|
12
|
+
8. write symbol: 'B', goto: 9
|
13
|
+
9. left goto: 10
|
14
|
+
10. cond if: '1', then: 9, else: 11
|
15
|
+
11. left goto: 12
|
16
|
+
12. cond if: '1', then: 11, else: 13
|
17
|
+
13. right goto: 14
|
18
|
+
14. cond if: '1', then: 15, else: 16
|
19
|
+
15. write symbol: 'B', goto: 1
|
20
|
+
16. write symbol: '1', goto: 18
|
21
|
+
17. left goto: 20
|
22
|
+
18. right goto: 19
|
23
|
+
19. cond if: '1', then: 18, else: 21
|
24
|
+
20. halt
|
25
|
+
21. halt
|
Binary file
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with a binary number on the tape:
|
3
|
+
# $ turing.rb prefix-equals-suffix-reversed-with-infix.stm 100101001
|
4
|
+
|
5
|
+
0. right :goto => 1
|
6
|
+
1. cond :if => '0', :then => 2, :else => 13
|
7
|
+
2. write :symbol => 'O', :goto => 3
|
8
|
+
3. right :goto => 4
|
9
|
+
4. cond :if => 'B', :then => 21, :else => 5
|
10
|
+
5. right :goto => 6
|
11
|
+
6. cond :if => 'B', :then => 7, :else => 5
|
12
|
+
7. left :goto => 8
|
13
|
+
8. cond :if => '0', :then => 9, :else => 21
|
14
|
+
9. write :symbol => 'B', :goto => 10
|
15
|
+
10. left :goto => 11
|
16
|
+
11. cond :if => '0', :then => 10, :else => 12
|
17
|
+
12. cond :if => '1', :then => 10, :else => 0
|
18
|
+
13. cond :if => '1', :then => 14, :else => 31
|
19
|
+
14. write :symbol => 'I', :goto => 15
|
20
|
+
15. right :goto => 16
|
21
|
+
16. cond :if => 'B', :then => 21, :else => 17
|
22
|
+
17. right :goto => 18
|
23
|
+
18. cond :if => 'B', :then => 19, :else => 17
|
24
|
+
19. left :goto => 20
|
25
|
+
20. cond :if => '1', :then => 9, :else => 21
|
26
|
+
21. write :symbol => 'B', :goto => 22
|
27
|
+
22. left :goto => 23
|
28
|
+
23. cond :if => '0', :then => 21, :else => 24
|
29
|
+
24. cond :if => '1', :then => 21, :else => 25
|
30
|
+
25. write :symbol => 'B', :goto => 26
|
31
|
+
26. left :goto => 27
|
32
|
+
27. cond :if => 'O', :then => 29, :else => 28
|
33
|
+
28. cond :if => 'I', :then => 30, :else => 32
|
34
|
+
29. write :symbol => '0', :goto => 26
|
35
|
+
30. write :symbol => '1', :goto => 26
|
36
|
+
31. halt
|
37
|
+
32. right :goto => 33
|
38
|
+
33. cond :if => 'B', :then => 31, :else => 32
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# vim: ts=2 sw=2 et ft=ruby
|
2
|
+
# Call with a binary number on the tape:
|
3
|
+
# $ turing.rb prefix-equals-suffix-reversed-with-infix.stm 100101001
|
4
|
+
|
5
|
+
0. right goto: 1
|
6
|
+
1. cond if: '0', then: 2, else: 13
|
7
|
+
2. write symbol: 'O', goto: 3
|
8
|
+
3. right goto: 4
|
9
|
+
4. cond if: 'B', then: 21, else: 5
|
10
|
+
5. right goto: 6
|
11
|
+
6. cond if: 'B', then: 7, else: 5
|
12
|
+
7. left goto: 8
|
13
|
+
8. cond if: '0', then: 9, else: 21
|
14
|
+
9. write symbol: 'B', goto: 10
|
15
|
+
10. left goto: 11
|
16
|
+
11. cond if: '0', then: 10, else: 12
|
17
|
+
12. cond if: '1', then: 10, else: 0
|
18
|
+
13. cond if: '1', then: 14, else: 31
|
19
|
+
14. write symbol: 'I', goto: 15
|
20
|
+
15. right goto: 16
|
21
|
+
16. cond if: 'B', then: 21, else: 17
|
22
|
+
17. right goto: 18
|
23
|
+
18. cond if: 'B', then: 19, else: 17
|
24
|
+
19. left goto: 20
|
25
|
+
20. cond if: '1', then: 9, else: 21
|
26
|
+
21. write symbol: 'B', goto: 22
|
27
|
+
22. left goto: 23
|
28
|
+
23. cond if: '0', then: 21, else: 24
|
29
|
+
24. cond if: '1', then: 21, else: 25
|
30
|
+
25. write symbol: 'B', goto: 26
|
31
|
+
26. left goto: 27
|
32
|
+
27. cond if: 'O', then: 29, else: 28
|
33
|
+
28. cond if: 'I', then: 30, else: 32
|
34
|
+
29. write symbol: '0', goto: 26
|
35
|
+
30. write symbol: '1', goto: 26
|
36
|
+
31. halt
|
37
|
+
32. right goto: 33
|
38
|
+
33. cond if: 'B', then: 31, else: 32
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'turing')
|
4
|
+
include Turing
|
5
|
+
|
6
|
+
filename, *tapes = ARGV
|
7
|
+
machine_type =
|
8
|
+
case ext = File.extname(filename)
|
9
|
+
when '.stm'
|
10
|
+
SingleTapeMachine
|
11
|
+
when '.mtm'
|
12
|
+
MultiTapeMachine
|
13
|
+
else
|
14
|
+
raise "unknown turing machine suffix: #{ext}, use .stm or .mtm"
|
15
|
+
end
|
16
|
+
tm = machine_type.new(File.read(filename))
|
17
|
+
print tm.to_graphviz
|