myco 0.1.0.dev

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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +2 -0
  3. data/bin/myco +7 -0
  4. data/lib/myco/backtrace.rb +56 -0
  5. data/lib/myco/bootstrap/component.rb +142 -0
  6. data/lib/myco/bootstrap/empty_object.rb +4 -0
  7. data/lib/myco/bootstrap/file_toplevel.rb +5 -0
  8. data/lib/myco/bootstrap/find_constant.rb +86 -0
  9. data/lib/myco/bootstrap/instance.rb +52 -0
  10. data/lib/myco/bootstrap/meme.rb +160 -0
  11. data/lib/myco/bootstrap/void.rb +40 -0
  12. data/lib/myco/bootstrap.my +15 -0
  13. data/lib/myco/bootstrap.rb +10 -0
  14. data/lib/myco/command.my +33 -0
  15. data/lib/myco/core/BasicObject.my +46 -0
  16. data/lib/myco/core/Category.my +5 -0
  17. data/lib/myco/core/Decorator.my +18 -0
  18. data/lib/myco/core/FileToplevel.my +23 -0
  19. data/lib/myco/core/Object.my +24 -0
  20. data/lib/myco/core/Switch.my +31 -0
  21. data/lib/myco/eval.rb +63 -0
  22. data/lib/myco/parser/ast/constant_access.rb +29 -0
  23. data/lib/myco/parser/ast/constant_define.rb +40 -0
  24. data/lib/myco/parser/ast/constant_reopen.rb +47 -0
  25. data/lib/myco/parser/ast/declare_category.rb +51 -0
  26. data/lib/myco/parser/ast/declare_decorator.rb +35 -0
  27. data/lib/myco/parser/ast/declare_file.rb +54 -0
  28. data/lib/myco/parser/ast/declare_meme.rb +44 -0
  29. data/lib/myco/parser/ast/declare_object.rb +75 -0
  30. data/lib/myco/parser/ast/declare_string.rb +37 -0
  31. data/lib/myco/parser/ast/invoke.rb +66 -0
  32. data/lib/myco/parser/ast/local_variable_access_ambiguous.rb +38 -0
  33. data/lib/myco/parser/ast/misc.rb +61 -0
  34. data/lib/myco/parser/ast/myco_module_scope.rb +58 -0
  35. data/lib/myco/parser/ast/quest.rb +82 -0
  36. data/lib/myco/parser/ast.rb +15 -0
  37. data/lib/myco/parser/builder.output +3995 -0
  38. data/lib/myco/parser/builder.racc +585 -0
  39. data/lib/myco/parser/builder.rb +1592 -0
  40. data/lib/myco/parser/lexer.rb +2306 -0
  41. data/lib/myco/parser/lexer.rl +393 -0
  42. data/lib/myco/parser/lexer_char_classes.rl +56 -0
  43. data/lib/myco/parser/lexer_common.rb +95 -0
  44. data/lib/myco/parser/lexer_skeleton.rl +154 -0
  45. data/lib/myco/parser/peg_parser.kpeg +759 -0
  46. data/lib/myco/parser/peg_parser.rb +7094 -0
  47. data/lib/myco/parser.rb +40 -0
  48. data/lib/myco/tools/OptionParser.my +38 -0
  49. data/lib/myco/tools/mycompile.my +51 -0
  50. data/lib/myco/toolset.rb +16 -0
  51. data/lib/myco/version.rb +22 -0
  52. data/lib/myco.rb +15 -0
  53. metadata +247 -0
@@ -0,0 +1,40 @@
1
+
2
+ require 'stringio'
3
+
4
+ module CodeTools
5
+ class Parser < Melbourne
6
+ end
7
+
8
+ class Compiler
9
+ module ParserPatch
10
+ def initialize *args
11
+ super
12
+ @processor = Myco::ToolSet::Parser
13
+ end
14
+ end
15
+
16
+ Parser.prepend ParserPatch
17
+ end
18
+ end
19
+
20
+ require_relative 'parser/ast'
21
+ require_relative 'parser/peg_parser'
22
+
23
+ module CodeTools
24
+ class Parser
25
+ include CodeTools::AST::ProcessorMethods
26
+
27
+ def parse_string string
28
+ @peg_parser = Myco::ToolSet::PegParser.new string
29
+ @peg_parser.processor = self
30
+
31
+ if @peg_parser.parse
32
+ return @peg_parser.root_node
33
+ else
34
+ @peg_parser.show_error(io=StringIO.new)
35
+ raise SyntaxError, io.string
36
+ end
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+
2
+ # TODO: fix constant lookup to make importing of constants from a file work
3
+ # OptionParser < Object {
4
+ ::Myco::OptionParser < Object {
5
+ banner: ""
6
+ width: 30
7
+ config: null
8
+
9
+ parse: |argv=ARGV| parser.parse(argv)
10
+ parser: {
11
+ parser = Rubinius::Options.new(banner, width, config)
12
+ options.memes.each |name, meme| {
13
+ meme.result.register_in_parser(parser, name)
14
+ }
15
+ parser.help
16
+ parser
17
+ }
18
+
19
+
20
+ Option < Object {
21
+ # TODO: don't use an instance_variable
22
+ "parser": instance_variable_get("@parser")
23
+ "parser=": |x| instance_variable_set("@parser", x)
24
+
25
+ register_in_parser: |parser, name| {
26
+ self.parser = parser
27
+
28
+ args = [name, (self.?argument || null), long_form, description]
29
+ args = args.compact
30
+ args = args.map |arg| { arg.to_s }
31
+
32
+ parser.on(*args) |arg| { do(arg) }
33
+ }
34
+
35
+ # TODO: remove
36
+ method_missing: |*a,&b| parent.send(*a,&b)
37
+ }
38
+ }
@@ -0,0 +1,51 @@
1
+
2
+ import "OptionParser.my"
3
+
4
+ Object {
5
+ var options: OptionParser {
6
+ var results: null
7
+
8
+ [options]
9
+
10
+ "-A": Option {
11
+ description: "Print an ascii graph of the AST"
12
+ long_form: "--print-ast"
13
+ do: results(:print_ast) = Myco::ToolSet::Compiler::ASTPrinter
14
+ }
15
+
16
+ "-S": Option {
17
+ description: "Print the AST as an S-expression"
18
+ long_form: "--print-sexp"
19
+ do: results(:print_ast) = Myco::ToolSet::Compiler::SexpPrinter
20
+ }
21
+
22
+ "-B": Option {
23
+ description: "Print bytecode for compiled methods"
24
+ long_form: "--print-bytecode"
25
+ do: results(:print_bytecode) = true
26
+ }
27
+
28
+ "-e": Option {
29
+ argument: "STRING"
30
+ description: "Compile STRING"
31
+ long_form: "--evaluate"
32
+ do: |arg| results(:string) = arg
33
+ }
34
+ }
35
+
36
+ run: |*argv| {
37
+ options.parse(argv)
38
+ print_ast = options.results(:print_ast) || false
39
+ string = options.results(:string) || ""
40
+
41
+ compiler = ::Myco::ToolSet::Compiler
42
+ compiler = compiler.new(:string, :compiled_code)
43
+ parser = compiler.parser
44
+ parser.root(::Myco::ToolSet::AST::Script)
45
+ parser.input(string, "(mycompile)", 1)
46
+
47
+ if(print_ast) { compiler.parser.print(print_ast) }
48
+
49
+ compiler.run
50
+ }
51
+ }
@@ -0,0 +1,16 @@
1
+
2
+ require "rubinius/bridge"
3
+ require "rubinius/toolset"
4
+
5
+ module Myco; end
6
+
7
+ module Myco
8
+ ToolSet = Rubinius::ToolSets.create :myco do
9
+ require "rubinius/melbourne"
10
+ require "rubinius/processor"
11
+ require "rubinius/compiler"
12
+ require "rubinius/ast"
13
+
14
+ require_relative 'parser'
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+
2
+ module Myco
3
+ MYCO_VERSION = '0.1.0.dev'
4
+
5
+ MYCO_REQUIRED_GEMS = [
6
+ ['kpeg', '~> 1.0'],
7
+ ['racc', '~> 1.4'],
8
+ ['rubinius-bridge', '~> 1.1'],
9
+ ['rubinius-toolset', '~> 2.3'],
10
+ ['rubinius-melbourne', '~> 2.2'],
11
+ ['rubinius-processor', '~> 2.2'],
12
+ ['rubinius-compiler', '~> 2.2'],
13
+ ['rubinius-ast', '~> 2.2'],
14
+ ]
15
+
16
+ # TODO: move elsewhere?
17
+ def self.activate_required_gems
18
+ MYCO_REQUIRED_GEMS.each do |name, version|
19
+ gem name, version
20
+ end
21
+ end
22
+ end
data/lib/myco.rb ADDED
@@ -0,0 +1,15 @@
1
+
2
+ require_relative 'myco/version'
3
+ Myco.activate_required_gems
4
+
5
+ require_relative 'myco/toolset'
6
+ require_relative 'myco/parser'
7
+ require_relative 'myco/eval'
8
+ require_relative 'myco/backtrace'
9
+ require_relative 'myco/bootstrap'
10
+
11
+ Myco.rescue do
12
+ # TODO: be more clever here communicating the load path for bootstrapping
13
+ Myco::CoreLoadPath = File.expand_path('myco', File.dirname(__FILE__))
14
+ Myco.eval_file 'myco/bootstrap.my'
15
+ end
metadata ADDED
@@ -0,0 +1,247 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: myco
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.dev
5
+ platform: ruby
6
+ authors:
7
+ - Joe McIlvain
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2014-09-11 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: kpeg
16
+ prerelease: false
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - &id016 !ruby/object:Gem::Version
21
+ version: "1.0"
22
+ type: :runtime
23
+ version_requirements: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ name: racc
26
+ prerelease: false
27
+ requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ~>
30
+ - &id013 !ruby/object:Gem::Version
31
+ version: "1.4"
32
+ type: :runtime
33
+ version_requirements: *id002
34
+ - !ruby/object:Gem::Dependency
35
+ name: rubinius-bridge
36
+ prerelease: false
37
+ requirement: &id003 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: "1.1"
42
+ type: :runtime
43
+ version_requirements: *id003
44
+ - !ruby/object:Gem::Dependency
45
+ name: rubinius-toolset
46
+ prerelease: false
47
+ requirement: &id004 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ~>
50
+ - !ruby/object:Gem::Version
51
+ version: "2.3"
52
+ type: :runtime
53
+ version_requirements: *id004
54
+ - !ruby/object:Gem::Dependency
55
+ name: rubinius-melbourne
56
+ prerelease: false
57
+ requirement: &id005 !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - &id006 !ruby/object:Gem::Version
61
+ version: "2.2"
62
+ type: :runtime
63
+ version_requirements: *id005
64
+ - !ruby/object:Gem::Dependency
65
+ name: rubinius-processor
66
+ prerelease: false
67
+ requirement: &id007 !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ~>
70
+ - *id006
71
+ type: :runtime
72
+ version_requirements: *id007
73
+ - !ruby/object:Gem::Dependency
74
+ name: rubinius-compiler
75
+ prerelease: false
76
+ requirement: &id008 !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ~>
79
+ - *id006
80
+ type: :runtime
81
+ version_requirements: *id008
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubinius-ast
84
+ prerelease: false
85
+ requirement: &id009 !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - *id006
89
+ type: :runtime
90
+ version_requirements: *id009
91
+ - !ruby/object:Gem::Dependency
92
+ name: bundler
93
+ prerelease: false
94
+ requirement: &id010 !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: "1.6"
99
+ type: :development
100
+ version_requirements: *id010
101
+ - !ruby/object:Gem::Dependency
102
+ name: rake
103
+ prerelease: false
104
+ requirement: &id011 !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ version: "10.3"
109
+ type: :development
110
+ version_requirements: *id011
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ prerelease: false
114
+ requirement: &id012 !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ~>
117
+ - !ruby/object:Gem::Version
118
+ version: "0.9"
119
+ type: :development
120
+ version_requirements: *id012
121
+ - !ruby/object:Gem::Dependency
122
+ name: pry-rescue
123
+ prerelease: false
124
+ requirement: &id014 !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ~>
127
+ - *id013
128
+ type: :development
129
+ version_requirements: *id014
130
+ - !ruby/object:Gem::Dependency
131
+ name: rspec
132
+ prerelease: false
133
+ requirement: &id015 !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ~>
136
+ - !ruby/object:Gem::Version
137
+ version: "3.0"
138
+ type: :development
139
+ version_requirements: *id015
140
+ - !ruby/object:Gem::Dependency
141
+ name: rspec-its
142
+ prerelease: false
143
+ requirement: &id017 !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ~>
146
+ - *id016
147
+ type: :development
148
+ version_requirements: *id017
149
+ - !ruby/object:Gem::Dependency
150
+ name: fivemat
151
+ prerelease: false
152
+ requirement: &id018 !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ~>
155
+ - !ruby/object:Gem::Version
156
+ version: "1.3"
157
+ type: :development
158
+ version_requirements: *id018
159
+ description: A toy language built atop the Rubinius VM
160
+ email: joe.eli.mac@gmail.com
161
+ executables:
162
+ - myco
163
+ extensions: []
164
+
165
+ extra_rdoc_files: []
166
+
167
+ files:
168
+ - LICENSE
169
+ - bin/myco
170
+ - lib/myco.rb
171
+ - lib/myco/backtrace.rb
172
+ - lib/myco/bootstrap.my
173
+ - lib/myco/bootstrap.rb
174
+ - lib/myco/bootstrap/component.rb
175
+ - lib/myco/bootstrap/empty_object.rb
176
+ - lib/myco/bootstrap/file_toplevel.rb
177
+ - lib/myco/bootstrap/find_constant.rb
178
+ - lib/myco/bootstrap/instance.rb
179
+ - lib/myco/bootstrap/meme.rb
180
+ - lib/myco/bootstrap/void.rb
181
+ - lib/myco/command.my
182
+ - lib/myco/core/BasicObject.my
183
+ - lib/myco/core/Category.my
184
+ - lib/myco/core/Decorator.my
185
+ - lib/myco/core/FileToplevel.my
186
+ - lib/myco/core/Object.my
187
+ - lib/myco/core/Switch.my
188
+ - lib/myco/eval.rb
189
+ - lib/myco/parser.rb
190
+ - lib/myco/parser/ast.rb
191
+ - lib/myco/parser/ast/constant_access.rb
192
+ - lib/myco/parser/ast/constant_define.rb
193
+ - lib/myco/parser/ast/constant_reopen.rb
194
+ - lib/myco/parser/ast/declare_category.rb
195
+ - lib/myco/parser/ast/declare_decorator.rb
196
+ - lib/myco/parser/ast/declare_file.rb
197
+ - lib/myco/parser/ast/declare_meme.rb
198
+ - lib/myco/parser/ast/declare_object.rb
199
+ - lib/myco/parser/ast/declare_string.rb
200
+ - lib/myco/parser/ast/invoke.rb
201
+ - lib/myco/parser/ast/local_variable_access_ambiguous.rb
202
+ - lib/myco/parser/ast/misc.rb
203
+ - lib/myco/parser/ast/myco_module_scope.rb
204
+ - lib/myco/parser/ast/quest.rb
205
+ - lib/myco/parser/builder.output
206
+ - lib/myco/parser/builder.racc
207
+ - lib/myco/parser/builder.rb
208
+ - lib/myco/parser/lexer.rb
209
+ - lib/myco/parser/lexer.rl
210
+ - lib/myco/parser/lexer_char_classes.rl
211
+ - lib/myco/parser/lexer_common.rb
212
+ - lib/myco/parser/lexer_skeleton.rl
213
+ - lib/myco/parser/peg_parser.kpeg
214
+ - lib/myco/parser/peg_parser.rb
215
+ - lib/myco/tools/OptionParser.my
216
+ - lib/myco/tools/mycompile.my
217
+ - lib/myco/toolset.rb
218
+ - lib/myco/version.rb
219
+ homepage: https://github.com/jemc/myco/
220
+ licenses:
221
+ - Copyright 2013-2014 Joe McIlvain. All rights reserved.
222
+ metadata: {}
223
+
224
+ post_install_message:
225
+ rdoc_options: []
226
+
227
+ require_paths:
228
+ - lib
229
+ required_ruby_version: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: "0"
234
+ required_rubygems_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">"
237
+ - !ruby/object:Gem::Version
238
+ version: 1.3.1
239
+ requirements: []
240
+
241
+ rubyforge_project:
242
+ rubygems_version: 2.3.0
243
+ signing_key:
244
+ specification_version: 4
245
+ summary: A toy language built atop the Rubinius VM
246
+ test_files: []
247
+