schaefer 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.DS_Store +0 -0
- data/.gitignore +17 -0
- data/Examples/.DS_Store +0 -0
- data/Examples/exampleAdd.sch +2 -0
- data/Examples/exampleAdd.sch~ +8 -0
- data/Examples/exampleDisplay.sch +1 -0
- data/Examples/exampleDisplay.sch~ +1 -0
- data/Examples/exampleDo.sch +8 -0
- data/Examples/exampleDo.sch~ +8 -0
- data/Examples/exampleFunction.sch +11 -0
- data/Examples/exampleFunction.sch~ +11 -0
- data/Examples/exampleFunction2.sch +4 -0
- data/Examples/exampleGets.sch +7 -0
- data/Examples/exampleIf.sch +12 -0
- data/Examples/exampleIf.sch~ +13 -0
- data/Examples/exampleWrite.sch +1 -0
- data/Examples/exampleWrite.sch~ +5 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/bin/.DS_Store +0 -0
- data/bin/schaefer +35 -0
- data/lib/.DS_Store +0 -0
- data/lib/schaefer/.DS_Store +0 -0
- data/lib/schaefer/.environment.rb.swp +0 -0
- data/lib/schaefer/Library/.DS_Store +0 -0
- data/lib/schaefer/Library/additionOperator.sch +7 -0
- data/lib/schaefer/Library/display.sch +7 -0
- data/lib/schaefer/Library/display.sch~ +7 -0
- data/lib/schaefer/Library/do.sch +11 -0
- data/lib/schaefer/Library/do.sch~ +11 -0
- data/lib/schaefer/Library/equalTo.sch +8 -0
- data/lib/schaefer/Library/equalTo.sch~ +6 -0
- data/lib/schaefer/Library/function.sch +57 -0
- data/lib/schaefer/Library/if.sch +10 -0
- data/lib/schaefer/Library/if.sch~ +10 -0
- data/lib/schaefer/Library/input.sch +6 -0
- data/lib/schaefer/Library/write.sch +7 -0
- data/lib/schaefer/Library/write.sch~ +7 -0
- data/lib/schaefer/environment.rb +20 -0
- data/lib/schaefer/interpreter.rb +45 -0
- data/lib/schaefer/parser.rb +87 -0
- data/lib/schaefer/parser.rb~ +87 -0
- data/lib/schaefer/version.rb +3 -0
- data/lib/schaefer.rb +3 -0
- data/schaefer.gemspec +17 -0
- metadata +113 -0
data/.DS_Store
ADDED
Binary file
|
data/.gitignore
ADDED
data/Examples/.DS_Store
ADDED
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
(display "hello")
|
@@ -0,0 +1 @@
|
|
1
|
+
(display "hello")
|
@@ -0,0 +1 @@
|
|
1
|
+
(write "hello")
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Tommy Schaefer
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Schaefer
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'schaefer'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install schaefer
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bin/.DS_Store
ADDED
Binary file
|
data/bin/schaefer
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'schaefer.rb'))
|
5
|
+
|
6
|
+
interpreter = Schaefer::Interpreter.new
|
7
|
+
|
8
|
+
if ARGV.length > 0
|
9
|
+
if ARGV[0] == "-v"
|
10
|
+
puts "=> " + interpreter.run(File.read(ARGV[1])).inspect
|
11
|
+
else
|
12
|
+
interpreter.run(File.read(ARGV[0]))
|
13
|
+
end
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
loop do
|
18
|
+
program = []
|
19
|
+
indent = 0
|
20
|
+
loop do
|
21
|
+
print "> " + (" " * indent)
|
22
|
+
program << gets
|
23
|
+
tmpProgram = program.join(" ")
|
24
|
+
openCount = tmpProgram.count("(")
|
25
|
+
closeCount = tmpProgram.count(")")
|
26
|
+
break if openCount == closeCount
|
27
|
+
indent += 1 if program.last.count("(") > program.last.count(")")
|
28
|
+
indent -= 1 if program.last.count("(") < program.last.count(")")
|
29
|
+
end
|
30
|
+
program = program.join(" ")
|
31
|
+
exit if program.strip == "quit"
|
32
|
+
result = interpreter.run(program)
|
33
|
+
puts "\n=> #{result.inspect}"
|
34
|
+
end
|
35
|
+
|
data/lib/.DS_Store
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,57 @@
|
|
1
|
+
(define function
|
2
|
+
(native_function "
|
3
|
+
Proc.new() do |arguments, interpreter|
|
4
|
+
formals = arguments[0]
|
5
|
+
body = arguments.slice(1, arguments.length)
|
6
|
+
|
7
|
+
if formals.is_a? Array
|
8
|
+
# detect if any formal names have been used more than once
|
9
|
+
error_message = 'Formal {FORMAL} declared more than once'
|
10
|
+
formals.each_index do |x|
|
11
|
+
tmp = formals.dup
|
12
|
+
tmp.delete_at(x)
|
13
|
+
raise(error_message.gsub('{FORMAL}', formals[x])) if tmp.include? formals[x]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
sub_env = Schaefer::Environment.new(interpreter.current_environment)
|
18
|
+
|
19
|
+
execute_body = Proc.new() do |body, environment, interpreter|
|
20
|
+
interpreter.current_environment = environment
|
21
|
+
result = nil
|
22
|
+
body.each do |expression|
|
23
|
+
result = interpreter.evaluate(expression)
|
24
|
+
end
|
25
|
+
interpreter.current_environment = environment.parent
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
if formals.is_a?(Array) && formals.include?(:'.')
|
30
|
+
Proc.new() do |arguments, interpreter|
|
31
|
+
args = arguments.dup
|
32
|
+
named_formals = formals.slice(0, formals.index(:'.'))
|
33
|
+
list_formal = formals[formals.index(:'.') + 1]
|
34
|
+
named_formals.each_index do |i|
|
35
|
+
sub_env.define(named_formals[i], interpreter.evaluate(args.shift))
|
36
|
+
end
|
37
|
+
sub_env.define(list_formal, args)
|
38
|
+
execute_body.call(body, sub_env, interpreter)
|
39
|
+
end
|
40
|
+
|
41
|
+
elsif formals.is_a? Array
|
42
|
+
Proc.new() do |arguments, interpreter|
|
43
|
+
formals.each_index do |i|
|
44
|
+
sub_env.define(formals[i], interpreter.evaluate(arguments[i]))
|
45
|
+
end
|
46
|
+
execute_body.call(body, sub_env, interpreter)
|
47
|
+
end
|
48
|
+
|
49
|
+
elsif formals.is_a? Symbol
|
50
|
+
Proc.new() do |arguments, interpreter|
|
51
|
+
arguments = arguments.map {|x| interpreter.evaluate(x) }
|
52
|
+
sub_env.define(formals, arguments)
|
53
|
+
execute_body.call(body, sub_env, interpreter)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
"))
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Schaefer
|
2
|
+
class Environment
|
3
|
+
attr_accessor :parent
|
4
|
+
|
5
|
+
def initialize(parent = nil)
|
6
|
+
@parent = parent
|
7
|
+
@table = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def find(name)
|
11
|
+
return @table[name] if @table.has_key?(name)
|
12
|
+
return nil if @parent.nil?
|
13
|
+
return @parent.find(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def define(name, value)
|
17
|
+
@table[name] = value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Schaefer
|
2
|
+
class Interpreter
|
3
|
+
attr_accessor :base_environment, :current_environment
|
4
|
+
|
5
|
+
def initialize()
|
6
|
+
@base_environment = @current_environment = Schaefer::Environment.new
|
7
|
+
loadLibrary
|
8
|
+
end
|
9
|
+
|
10
|
+
def run(program)
|
11
|
+
expressions = Parser.new.parse(program)
|
12
|
+
result = nil
|
13
|
+
expressions.each do |expression|
|
14
|
+
result = evaluate(expression)
|
15
|
+
end
|
16
|
+
return result
|
17
|
+
end
|
18
|
+
|
19
|
+
def evaluate(expression)
|
20
|
+
return @current_environment.find(expression) if expression.is_a? Symbol
|
21
|
+
return expression unless expression.is_a? Array
|
22
|
+
|
23
|
+
if expression[0] == :define
|
24
|
+
return @current_environment.define(expression[1], evaluate(expression[2]))
|
25
|
+
elsif expression[0] == :native_function
|
26
|
+
return eval(expression[1])
|
27
|
+
else
|
28
|
+
function = evaluate(expression[0])
|
29
|
+
raise RuntimeError, "\n#{expression[0]} is not a function" unless function.is_a? Proc
|
30
|
+
arguments = expression.slice(1, expression.length)
|
31
|
+
return function.call(arguments, self)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def loadLibrary
|
38
|
+
pattern = File.join(File.dirname(__FILE__), "Library", "*.sch")
|
39
|
+
|
40
|
+
Dir[pattern].each do |file|
|
41
|
+
run(File.read(file))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class Parser
|
2
|
+
|
3
|
+
def pullSLiterals(string) #method used to remove all string literals, save them in an array, and replace them with a set string that will not interfere with parsing
|
4
|
+
pattern = /"([^"\\]|\\.)*"/
|
5
|
+
replace = "***STRING-LITERAL***"
|
6
|
+
literals = []
|
7
|
+
string.gsub(pattern) do |occurence|
|
8
|
+
literals << occurence
|
9
|
+
end
|
10
|
+
string = string.gsub(pattern, replace)
|
11
|
+
return [string, literals]
|
12
|
+
end
|
13
|
+
|
14
|
+
def tokenize(string) #method used split program into tokens by adding spaces arround '('s and calling string.split(' ')
|
15
|
+
string = string.gsub("(", " ( ")
|
16
|
+
string = string.gsub(")", " ) ")
|
17
|
+
tokens = string.split(" ")
|
18
|
+
return tokens
|
19
|
+
end
|
20
|
+
|
21
|
+
def replaceSLiterals(tokens, literals) #method used to restore string literals in our tokens array now that we dont have to worry about special cases
|
22
|
+
return tokens.map do |token|
|
23
|
+
if token == "***STRING-LITERAL***"
|
24
|
+
literals.shift
|
25
|
+
else
|
26
|
+
token
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def isMatch?(string, pattern) #check if type is a match, returns false if no, true if yes
|
32
|
+
match = string.match(pattern)
|
33
|
+
return false unless match
|
34
|
+
match[0].length == string.length
|
35
|
+
end
|
36
|
+
|
37
|
+
def isSymbol?(string) #return true if string is anything other than parenthasees, quotes, or commas
|
38
|
+
return isMatch?(string, /[^\"\'\,\(\)]+/)
|
39
|
+
end
|
40
|
+
|
41
|
+
def isInteger?(string) #return true if string is made of any number of numerals optionally preceded by a + or -
|
42
|
+
return isMatch?(string, /[\-\+]?[0-9]+/)
|
43
|
+
end
|
44
|
+
|
45
|
+
def isString?(string) #return true if string is text surrounded by quotes
|
46
|
+
return isMatch?(string, /"([^"\\]|\\.)*"/)
|
47
|
+
end
|
48
|
+
|
49
|
+
def convertTokens(tokens)
|
50
|
+
convertedTokens = []
|
51
|
+
tokens.each do |token|
|
52
|
+
convertedTokens << "(" and next if token == "("
|
53
|
+
convertedTokens << ")" and next if token == ")"
|
54
|
+
convertedTokens << token.to_i and next if isInteger?(token)
|
55
|
+
convertedTokens << token.to_sym and next if isSymbol?(token)
|
56
|
+
convertedTokens << eval(token) and next if isString?(token)
|
57
|
+
raise Exception, "Unrecognized token: #{token}"
|
58
|
+
end
|
59
|
+
return convertedTokens
|
60
|
+
end
|
61
|
+
|
62
|
+
def formStructure(tokens, offset = 0)
|
63
|
+
structure = []
|
64
|
+
while offset < tokens.length do
|
65
|
+
if tokens[offset] == "("
|
66
|
+
offset, tempArray = formStructure(tokens, offset + 1)
|
67
|
+
structure << tempArray
|
68
|
+
elsif tokens[offset] == ")"
|
69
|
+
break
|
70
|
+
else
|
71
|
+
structure << tokens[offset]
|
72
|
+
end
|
73
|
+
offset += 1
|
74
|
+
end
|
75
|
+
return [offset, structure]
|
76
|
+
end
|
77
|
+
|
78
|
+
def parse(string)
|
79
|
+
string, literals = pullSLiterals(string)
|
80
|
+
tokens = tokenize(string)
|
81
|
+
tokens = replaceSLiterals(tokens, literals)
|
82
|
+
tokens = convertTokens(tokens)
|
83
|
+
structure = formStructure(tokens)[1]
|
84
|
+
return structure
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class Parser
|
2
|
+
|
3
|
+
def pullSLiterals(string) #method used to remove all string literals, save them in an array, and replace them with a set string that will not interfere with parsing
|
4
|
+
pattern = /"([^"\\]|\\.)*"/
|
5
|
+
replace = "***STRING-LITERAL***"
|
6
|
+
literals = []
|
7
|
+
string.gsub(pattern) do |occurence|
|
8
|
+
literals << occurence
|
9
|
+
end
|
10
|
+
string = string.gsub(pattern, replace)
|
11
|
+
return [string, literals]
|
12
|
+
end
|
13
|
+
|
14
|
+
def tokenize(string) #method used split program into tokens by adding spaces arround '('s and calling string.split(' ')
|
15
|
+
string = string.gsub("(", " ( ")
|
16
|
+
string = string.gsub(")", " ) ")
|
17
|
+
tokens = string.split(" ")
|
18
|
+
return tokens
|
19
|
+
end
|
20
|
+
|
21
|
+
def replaceSLiterals(tokens, literals) #method used to restore string literals in our tokens array now that we dont have to worry about special cases
|
22
|
+
return tokens.map do |token|
|
23
|
+
if token == "***STRING-LITERAL***"
|
24
|
+
literals.shift
|
25
|
+
else
|
26
|
+
token
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def isMatch?(string, pattern) #check if type is a match, returns false if no, true if yes
|
32
|
+
match = string.match(pattern)
|
33
|
+
return false unless match
|
34
|
+
match[0].length == string.length
|
35
|
+
end
|
36
|
+
|
37
|
+
def isSymbol?(string) #return true if string is anything other than parenthasees, quotes, or commas
|
38
|
+
return isMatch?(string, /[^\"\'\,\(\)]+/)
|
39
|
+
end
|
40
|
+
|
41
|
+
def isInteger?(string) #return true if string is made of any number of numerals optionally preceded by a + or -
|
42
|
+
return isMatch?(string, /[\-\+]?[0-9]+/)
|
43
|
+
end
|
44
|
+
|
45
|
+
def isString?(string) #return true if string is text surrounded by quotes
|
46
|
+
return isMatch?(string, /"([^"\\]|\\.)*"/)
|
47
|
+
end
|
48
|
+
|
49
|
+
def convertTokens(tokens)
|
50
|
+
convertedTokens = []
|
51
|
+
tokens.each do |token|
|
52
|
+
convertedTokens << "(" and next if token == "("
|
53
|
+
convertedTokens << ")" and next if token == ")"
|
54
|
+
convertedTokens << token.to_i and next if isInteger?(token)
|
55
|
+
convertedTokens << token.to_sym and next if isSymbol?(token)
|
56
|
+
convertedTokens << eval(token) and next if isString?(token)
|
57
|
+
raise Exception, "Unrecognized token: #{token}"
|
58
|
+
end
|
59
|
+
return convertedTokens
|
60
|
+
end
|
61
|
+
|
62
|
+
def formStructure(tokens, offset = 0)
|
63
|
+
structure = []
|
64
|
+
while offset < tokens.length do
|
65
|
+
if tokens[offset] == "("
|
66
|
+
offset, tempArray = formStructure(tokens, offset + 1)
|
67
|
+
structure << tempArray
|
68
|
+
elsif tokens[offset] == ")"
|
69
|
+
break
|
70
|
+
else
|
71
|
+
structure << tokens[offset]
|
72
|
+
end
|
73
|
+
offset += 1
|
74
|
+
end
|
75
|
+
return [offset, structure]
|
76
|
+
end
|
77
|
+
|
78
|
+
def parse(string)
|
79
|
+
string, literals = pullSLiterals(string)
|
80
|
+
tokens = tokenize(string)
|
81
|
+
tokens = replaceSLiterals(tokens, literals)
|
82
|
+
tokens = convertTokens(tokens)
|
83
|
+
structure = formStructure(tokens)[1]
|
84
|
+
return structure
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
data/lib/schaefer.rb
ADDED
data/schaefer.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/schaefer/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Tommy Schaefer"]
|
6
|
+
gem.email = ["me@tommyschaefer.net"]
|
7
|
+
gem.description = %q{Schaefer is a small programming language deigned to show how to build a programming language. Running the command 'schaefer' begins console based execution of code and passing a file name will execute the file. SchaeferScript is a scheme-style language where the core functions are written in ruby and other functions written in the language itself. You can access the source for SchaeferScript at https://github.com/tommyschaefer/SchaeferScript.}
|
8
|
+
gem.summary = %q{schaefer is short for SchaeferScript}
|
9
|
+
gem.homepage = "https://github.com/tommyschaefer/SchaeferScript"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "schaefer"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Schaefer::VERSION
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: schaefer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Tommy Schaefer
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-05-27 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Schaefer is a small programming language deigned to show how to build a programming language. Running the command 'schaefer' begins console based execution of code and passing a file name will execute the file. SchaeferScript is a scheme-style language where the core functions are written in ruby and other functions written in the language itself. You can access the source for SchaeferScript at https://github.com/tommyschaefer/SchaeferScript.
|
22
|
+
email:
|
23
|
+
- me@tommyschaefer.net
|
24
|
+
executables:
|
25
|
+
- .DS_Store
|
26
|
+
- schaefer
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- .DS_Store
|
33
|
+
- .gitignore
|
34
|
+
- Examples/.DS_Store
|
35
|
+
- Examples/exampleAdd.sch
|
36
|
+
- Examples/exampleAdd.sch~
|
37
|
+
- Examples/exampleDisplay.sch
|
38
|
+
- Examples/exampleDisplay.sch~
|
39
|
+
- Examples/exampleDo.sch
|
40
|
+
- Examples/exampleDo.sch~
|
41
|
+
- Examples/exampleFunction.sch
|
42
|
+
- Examples/exampleFunction.sch~
|
43
|
+
- Examples/exampleFunction2.sch
|
44
|
+
- Examples/exampleGets.sch
|
45
|
+
- Examples/exampleIf.sch
|
46
|
+
- Examples/exampleIf.sch~
|
47
|
+
- Examples/exampleWrite.sch
|
48
|
+
- Examples/exampleWrite.sch~
|
49
|
+
- Gemfile
|
50
|
+
- LICENSE
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- bin/.DS_Store
|
54
|
+
- bin/schaefer
|
55
|
+
- lib/.DS_Store
|
56
|
+
- lib/schaefer.rb
|
57
|
+
- lib/schaefer/.DS_Store
|
58
|
+
- lib/schaefer/.environment.rb.swp
|
59
|
+
- lib/schaefer/Library/.DS_Store
|
60
|
+
- lib/schaefer/Library/additionOperator.sch
|
61
|
+
- lib/schaefer/Library/display.sch
|
62
|
+
- lib/schaefer/Library/display.sch~
|
63
|
+
- lib/schaefer/Library/do.sch
|
64
|
+
- lib/schaefer/Library/do.sch~
|
65
|
+
- lib/schaefer/Library/equalTo.sch
|
66
|
+
- lib/schaefer/Library/equalTo.sch~
|
67
|
+
- lib/schaefer/Library/function.sch
|
68
|
+
- lib/schaefer/Library/if.sch
|
69
|
+
- lib/schaefer/Library/if.sch~
|
70
|
+
- lib/schaefer/Library/input.sch
|
71
|
+
- lib/schaefer/Library/write.sch
|
72
|
+
- lib/schaefer/Library/write.sch~
|
73
|
+
- lib/schaefer/environment.rb
|
74
|
+
- lib/schaefer/interpreter.rb
|
75
|
+
- lib/schaefer/parser.rb
|
76
|
+
- lib/schaefer/parser.rb~
|
77
|
+
- lib/schaefer/version.rb
|
78
|
+
- schaefer.gemspec
|
79
|
+
homepage: https://github.com/tommyschaefer/SchaeferScript
|
80
|
+
licenses: []
|
81
|
+
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 3
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
requirements: []
|
106
|
+
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 1.8.21
|
109
|
+
signing_key:
|
110
|
+
specification_version: 3
|
111
|
+
summary: schaefer is short for SchaeferScript
|
112
|
+
test_files: []
|
113
|
+
|