myco 0.1.0.dev

Sign up to get free protection for your applications and to get access to all the features.
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
+