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
         
     |