omghax-einstein 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/Benchmarks.txt +48 -0
  2. data/History.txt +9 -0
  3. data/Manifest.txt +14 -21
  4. data/README.txt +1 -8
  5. data/Rakefile +26 -13
  6. data/einstein.gemspec +24 -0
  7. data/lib/einstein.rb +10 -41
  8. data/lib/einstein/evaluator.rb +102 -0
  9. data/lib/einstein/expression.rb +37 -0
  10. data/lib/einstein/parser.racc +41 -0
  11. data/lib/einstein/parser.racc.rb +333 -0
  12. data/lib/einstein/parser.rex +42 -0
  13. data/lib/einstein/parser.rex.rb +101 -0
  14. data/lib/einstein/pretty_printer.rb +98 -0
  15. data/lib/einstein/processor.rb +12 -0
  16. data/lib/einstein/version.rb +3 -3
  17. data/tasks/benchmark.rake +28 -0
  18. data/test/helper.rb +2 -1
  19. data/test/test_einstein.rb +20 -0
  20. data/test/test_evaluator.rb +86 -0
  21. data/test/test_parser.rb +35 -30
  22. data/test/test_pretty_printer.rb +81 -0
  23. metadata +31 -31
  24. data/config/hoe.rb +0 -62
  25. data/config/requirements.rb +0 -17
  26. data/lib/einstein/generated_parser.rb +0 -337
  27. data/lib/einstein/nodes.rb +0 -155
  28. data/lib/einstein/parser.rb +0 -60
  29. data/lib/einstein/tokenizer.rb +0 -112
  30. data/lib/einstein/visitors.rb +0 -303
  31. data/lib/parser.y +0 -79
  32. data/script/destroy +0 -14
  33. data/script/generate +0 -14
  34. data/script/txt2html +0 -74
  35. data/tasks/deployment.rake +0 -34
  36. data/tasks/environment.rake +0 -7
  37. data/tasks/website.rake +0 -17
  38. data/test/test_evaluate.rb +0 -127
  39. data/test/test_pretty_print.rb +0 -119
  40. data/test/test_tokenizer.rb +0 -68
  41. data/website/index.html +0 -120
  42. data/website/index.txt +0 -58
  43. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  44. data/website/stylesheets/screen.css +0 -138
  45. data/website/template.rhtml +0 -48
data/lib/parser.y DELETED
@@ -1,79 +0,0 @@
1
- /* vim: set filetype=racc : */
2
-
3
- class Einstein::GeneratedParser
4
-
5
- /* Punctuators */
6
- token LSHIFT /* << */
7
- token RSHIFT /* >> */
8
- token RAISE /* ** */
9
-
10
- /* Terminal types */
11
- token NUMBER
12
- token IDENT
13
-
14
- rule
15
- Statement:
16
- BitwiseOrExpr
17
- ;
18
-
19
- Literal:
20
- NUMBER { result = NumberNode.new(val.first) }
21
- ;
22
-
23
- PrimaryExpr:
24
- "(" Statement ")" { result = val[1] }
25
- | IDENT { result = ResolveNode.new(val.first) }
26
- | Literal
27
- ;
28
-
29
- UnaryExpr:
30
- PrimaryExpr
31
- | "+" UnaryExpr { result = UnaryPlusNode.new(val[1]) }
32
- | "-" UnaryExpr { result = UnaryMinusNode.new(val[1]) }
33
- | "~" UnaryExpr { result = BitwiseNotNode.new(val[1]) }
34
- ;
35
-
36
- ExponentExpr:
37
- UnaryExpr
38
- | ExponentExpr RAISE UnaryExpr { result = ExponentNode.new(val[0], val[2]) }
39
- ;
40
-
41
- MultiplicativeExpr:
42
- ExponentExpr
43
- | MultiplicativeExpr "*" ExponentExpr { result = MultiplyNode.new(val[0], val[2]) }
44
- | MultiplicativeExpr "/" ExponentExpr { result = DivideNode.new(val[0], val[2]) }
45
- | MultiplicativeExpr "%" ExponentExpr { result = ModulusNode.new(val[0], val[2]) }
46
- ;
47
-
48
- AdditiveExpr:
49
- MultiplicativeExpr
50
- | AdditiveExpr "+" MultiplicativeExpr { result = AddNode.new(val[0], val[2]) }
51
- | AdditiveExpr "-" MultiplicativeExpr { result = SubtractNode.new(val[0], val[2]) }
52
- ;
53
-
54
- ShiftExpr:
55
- AdditiveExpr
56
- | ShiftExpr LSHIFT AdditiveExpr { result = LeftShiftNode.new(val[0], val[2]) }
57
- | ShiftExpr RSHIFT AdditiveExpr { result = RightShiftNode.new(val[0], val[2]) }
58
- ;
59
-
60
- BitwiseAndExpr:
61
- ShiftExpr
62
- | BitwiseAndExpr "&" ShiftExpr { result = BitwiseAndNode.new(val[0], val[2]) }
63
- ;
64
-
65
- BitwiseXorExpr:
66
- BitwiseAndExpr
67
- | BitwiseXorExpr "^" BitwiseAndExpr { result = BitwiseXorNode.new(val[0], val[2]) }
68
- ;
69
-
70
- BitwiseOrExpr:
71
- BitwiseXorExpr
72
- | BitwiseOrExpr "|" BitwiseXorExpr { result = BitwiseOrNode.new(val[0], val[2]) }
73
- ;
74
-
75
- ---- header
76
- require "einstein/nodes"
77
-
78
- ---- inner
79
- include Einstein::Nodes
data/script/destroy DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/destroy'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/generate'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Generate.new.run(ARGV)
data/script/txt2html DELETED
@@ -1,74 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- begin
5
- require 'newgem'
6
- rescue LoadError
7
- puts "\n\nGenerating the website requires the newgem RubyGem"
8
- puts "Install: gem install newgem\n\n"
9
- exit(1)
10
- end
11
- require 'redcloth'
12
- require 'syntax/convertors/html'
13
- require 'erb'
14
- require File.dirname(__FILE__) + '/../lib/einstein/version.rb'
15
-
16
- version = Einstein::VERSION::STRING
17
- download = 'http://rubyforge.org/projects/einstein'
18
-
19
- class Fixnum
20
- def ordinal
21
- # teens
22
- return 'th' if (10..19).include?(self % 100)
23
- # others
24
- case self % 10
25
- when 1: return 'st'
26
- when 2: return 'nd'
27
- when 3: return 'rd'
28
- else return 'th'
29
- end
30
- end
31
- end
32
-
33
- class Time
34
- def pretty
35
- return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
36
- end
37
- end
38
-
39
- def convert_syntax(syntax, source)
40
- return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
41
- end
42
-
43
- if ARGV.length >= 1
44
- src, template = ARGV
45
- template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml')
46
-
47
- else
48
- puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
49
- exit!
50
- end
51
-
52
- template = ERB.new(File.open(template).read)
53
-
54
- title = nil
55
- body = nil
56
- File.open(src) do |fsrc|
57
- title_text = fsrc.readline
58
- body_text = fsrc.read
59
- syntax_items = []
60
- body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
61
- ident = syntax_items.length
62
- element, syntax, source = $1, $2, $3
63
- syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
64
- "syntax-temp-#{ident}"
65
- }
66
- title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
67
- body = RedCloth.new(body_text).to_html
68
- body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
69
- end
70
- stat = File.stat(src)
71
- created = stat.ctime
72
- modified = stat.mtime
73
-
74
- $stdout << template.result(binding)
@@ -1,34 +0,0 @@
1
- desc 'Release the website and new gem version'
2
- task :deploy => [:check_version, :website, :release] do
3
- puts "Remember to create SVN tag:"
4
- puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
- "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
- puts "Suggested comment:"
7
- puts "Tagging release #{CHANGES}"
8
- end
9
-
10
- desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
- task :local_deploy => [:website_generate, :install_gem]
12
-
13
- task :check_version do
14
- unless ENV['VERSION']
15
- puts 'Must pass a VERSION=x.y.z release version'
16
- exit
17
- end
18
- unless ENV['VERSION'] == VERS
19
- puts "Please update your version.rb to match the release version, currently #{VERS}"
20
- exit
21
- end
22
- end
23
-
24
- desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
- task :install_gem_no_doc => [:clean, :package] do
26
- sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
- end
28
-
29
- namespace :manifest do
30
- desc 'Recreate Manifest.txt to include ALL files'
31
- task :refresh do
32
- `rake check_manifest | patch -p0 > Manifest.txt`
33
- end
34
- end
@@ -1,7 +0,0 @@
1
- task :ruby_env do
2
- RUBY_APP = if RUBY_PLATFORM =~ /java/
3
- "jruby"
4
- else
5
- "ruby"
6
- end unless defined? RUBY_APP
7
- end
data/tasks/website.rake DELETED
@@ -1,17 +0,0 @@
1
- desc 'Generate website files'
2
- task :website_generate => :ruby_env do
3
- (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
- sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
- end
6
- end
7
-
8
- desc 'Upload website files to rubyforge'
9
- task :website_upload do
10
- host = "#{rubyforge_username}@rubyforge.org"
11
- remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
- local_dir = 'website'
13
- sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
- end
15
-
16
- desc 'Generate and upload website files'
17
- task :website => [:website_generate, :website_upload, :publish_docs]
@@ -1,127 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
- require "logger"
3
-
4
- class TestEvaluate < Test::Unit::TestCase
5
- def setup
6
- @parser = Einstein::Parser.new
7
- @parser.logger = Logger.new(STDERR)
8
- end
9
-
10
- def test_parentheses
11
- assert_equal((5 + 2) * (10 - 5), parse("(5 + 2) * (10 - 5)").evaluate)
12
- end
13
-
14
- def test_order_of_operations
15
- assert_equal(3 + 4 * 2, parse("3 + 4 * 2").evaluate)
16
- assert_equal(7 + 9 * 2 - 16 / 8, parse("7 + 9 * 2 - 16 / 8").evaluate)
17
- end
18
-
19
- def test_resolve_should_raise_on_undefined_variable
20
- assert_raises(Einstein::ResolveError) { parse("x").evaluate }
21
- end
22
-
23
- def test_resolve
24
- assert_equal(5, parse("x").evaluate(:x => 5))
25
- assert_equal(5 + 5, parse("x + 5").evaluate(:x => 5))
26
- assert_equal(4 * 4, parse("x * 4").evaluate(:x => 4))
27
- end
28
-
29
- def test_bitwise_or
30
- assert_equal(0b1100 | 0b1111, parse("0b1100 | 0b1111").evaluate)
31
- end
32
-
33
- def test_bitwise_xor
34
- assert_equal(0b1100 ^ 0b1111, parse("0b1100 ^ 0b1111").evaluate)
35
- end
36
-
37
- def test_bitwise_and
38
- assert_equal(0b1100 & 0b1111, parse("0b1100 & 0b1111").evaluate)
39
- end
40
-
41
- def test_rshift
42
- assert_equal(10 >> 2, parse("10 >> 2").evaluate)
43
- end
44
-
45
- def test_lshift
46
- assert_equal(10 << 2, parse("10 << 2").evaluate)
47
- end
48
-
49
- def test_subtraction
50
- assert_equal(10 - 5, parse("10 - 5").evaluate)
51
- assert_equal(5 - 10, parse("5 - 10").evaluate)
52
- end
53
-
54
- def test_addition
55
- assert_equal(1 + 2, parse("1 + 2").evaluate)
56
- assert_equal(1.0 + 2.0, parse("1.0 + 2.0").evaluate)
57
- end
58
-
59
- def test_modulus
60
- assert_equal(5 % 10, parse("5 % 10").evaluate)
61
- assert_equal(10 % 5, parse("10 % 5").evaluate)
62
- end
63
-
64
- def test_division_should_raise_on_divide_by_zero
65
- assert_raises(Einstein::ZeroDivisionError) { parse("1 / 0").evaluate }
66
- end
67
-
68
- def test_division
69
- assert_equal(10 / 5, parse("10 / 5").evaluate)
70
- assert_equal(10.0 / 5.0, parse("10.0 / 5.0").evaluate)
71
- end
72
-
73
- def test_multiplication
74
- assert_equal(5 * 10, parse("5 * 10").evaluate)
75
- assert_equal(5.0 * 10.0, parse("5.0 * 10.0").evaluate)
76
- end
77
-
78
- def test_exponent
79
- assert_equal(5 ** 2, parse("5 ** 2").evaluate)
80
- end
81
-
82
- def test_float
83
- assert_equal(1.1, parse("1.1").evaluate)
84
- end
85
-
86
- def test_number_base2
87
- assert_equal(0b0, parse("0b0").evaluate)
88
- assert_equal(0b1111, parse("0b1111").evaluate)
89
- assert_equal(0B1010, parse("0B1010").evaluate)
90
-
91
- assert_equal(+0b1111, parse("+0b1111").evaluate)
92
- assert_equal(+0B1010, parse("+0B1010").evaluate)
93
-
94
- assert_equal(-0b1111, parse("-0b1111").evaluate)
95
- assert_equal(-0B1010, parse("-0B1010").evaluate)
96
- end
97
-
98
- def test_number_base16
99
- assert_equal(0x0, parse("0x0").evaluate)
100
- assert_equal(0xff, parse("0xff").evaluate)
101
- assert_equal(0XFF, parse("0XFF").evaluate)
102
-
103
- assert_equal(+0xff, parse("+0xff").evaluate)
104
- assert_equal(+0XFF, parse("+0XFF").evaluate)
105
-
106
- assert_equal(-0xff, parse("-0xff").evaluate)
107
- assert_equal(-0XFF, parse("-0XFF").evaluate)
108
- end
109
-
110
- def test_number_base10
111
- assert_equal(0, parse("0").evaluate)
112
- assert_equal(1, parse("01").evaluate)
113
- assert_equal(10, parse("10").evaluate)
114
-
115
- assert_equal(+1, parse("+1").evaluate)
116
- assert_equal(+10, parse("+10").evaluate)
117
-
118
- assert_equal(-1, parse("-1").evaluate)
119
- assert_equal(-10, parse("-10").evaluate)
120
- end
121
-
122
- private
123
-
124
- def parse(stmt)
125
- @parser.parse(stmt)
126
- end
127
- end
@@ -1,119 +0,0 @@
1
- require File.dirname(__FILE__) + "/helper"
2
- require "logger"
3
-
4
- class TestPrettyPrint < Test::Unit::TestCase
5
- def setup
6
- @parser = Einstein::Parser.new
7
- @parser.logger = Logger.new(STDERR)
8
- end
9
-
10
- def test_parentheses
11
- assert_equal "((5 + 2) * (10 - 5))", parse("(5 + 2) * (10 - 5)").inspect
12
- end
13
-
14
- def test_order_of_operations
15
- assert_equal "(3 + (4 * 2))", parse("3 + 4 * 2").inspect
16
- assert_equal "((7 + (9 * 2)) - (16 / 8))", parse("7 + 9 * 2 - 16 / 8").inspect
17
- end
18
-
19
- def test_resolve
20
- assert_equal "x", parse("x").inspect
21
- assert_equal "(x + 5)", parse("x + 5").inspect
22
- assert_equal "(x * 4)", parse("x * 4").inspect
23
- end
24
-
25
- def test_bitwise_or
26
- assert_equal "(12 | 15)", parse("0b1100 | 0b1111").inspect
27
- end
28
-
29
- def test_bitwise_xor
30
- assert_equal "(12 ^ 15)", parse("0b1100 ^ 0b1111").inspect
31
- end
32
-
33
- def test_bitwise_and
34
- assert_equal "(12 & 15)", parse("0b1100 & 0b1111").inspect
35
- end
36
-
37
- def test_rshift
38
- assert_equal("(10 >> 2)", parse("10 >> 2").inspect)
39
- end
40
-
41
- def test_lshift
42
- assert_equal("(10 << 2)", parse("10 << 2").inspect)
43
- end
44
-
45
- def test_subtraction
46
- assert_equal "(10 - 5)", parse("10 - 5").inspect
47
- assert_equal "(5 - 10)", parse("5 - 10").inspect
48
- end
49
-
50
- def test_addition
51
- assert_equal "(1 + 2)", parse("1 + 2").inspect
52
- assert_equal "(1.0 + 2.0)", parse("1.0 + 2.0").inspect
53
- end
54
-
55
- def test_modulus
56
- assert_equal "(5 % 10)", parse("5 % 10").inspect
57
- assert_equal "(10 % 5)", parse("10 % 5").inspect
58
- end
59
-
60
- def test_division
61
- assert_equal "(10 / 5)", parse("10 / 5").inspect
62
- assert_equal "(10.0 / 5.0)", parse("10.0 / 5.0").inspect
63
- end
64
-
65
- def test_multiplication
66
- assert_equal "(5 * 10)", parse("5 * 10").inspect
67
- assert_equal "(5.0 * 10.0)", parse("5.0 * 10.0").inspect
68
- end
69
-
70
- def test_exponent
71
- assert_equal "(5 ** 2)", parse("5 ** 2").inspect
72
- end
73
-
74
- def test_float
75
- assert_equal "1.1", parse("1.1").inspect
76
- end
77
-
78
- def test_number_base2
79
- assert_equal "0", parse("0b0").inspect
80
- assert_equal "15", parse("0b1111").inspect
81
- assert_equal "10", parse("0B1010").inspect
82
-
83
- assert_equal "+15", parse("+0b1111").inspect
84
- assert_equal "+10", parse("+0B1010").inspect
85
-
86
- assert_equal "-15", parse("-0b1111").inspect
87
- assert_equal "-10", parse("-0B1010").inspect
88
- end
89
-
90
- def test_number_base16
91
- assert_equal "0", parse("0x0").inspect
92
- assert_equal "255", parse("0xff").inspect
93
- assert_equal "255", parse("0XFF").inspect
94
-
95
- assert_equal "+255", parse("+0xff").inspect
96
- assert_equal "+255", parse("+0XFF").inspect
97
-
98
- assert_equal "-255", parse("-0xff").inspect
99
- assert_equal "-255", parse("-0XFF").inspect
100
- end
101
-
102
- def test_number_base10
103
- assert_equal "0", parse("0").inspect
104
- assert_equal "1", parse("01").inspect
105
- assert_equal "10", parse("10").inspect
106
-
107
- assert_equal "+1", parse("+1").inspect
108
- assert_equal "+10", parse("+10").inspect
109
-
110
- assert_equal "-1", parse("-1").inspect
111
- assert_equal "-10", parse("-10").inspect
112
- end
113
-
114
- private
115
-
116
- def parse(stmt)
117
- @parser.parse(stmt)
118
- end
119
- end